一周一更之RESET

2021-08-04 15:05:25 字數 2601 閱讀 3944

最近遇到乙個問題:在存在防火牆的情況下,某些客戶端在某個時間段連線伺服器時會出現連線不上的問題,在客戶端側用wireshark抓包發現,在進行tcp三次握手過程中,對於客戶端的第乙個syn,伺服器端總以rst響應。

年少不懂事的我,一開始以為是防火牆的問題,但是該同一源位址的客戶端便會出現這種情況,應該也就排除了這種情況,防火牆的規則基本上是不會更改的。此路不通,便想到了是不是服務端監聽的那一路連線是不是主動傳送了fin,進入到time_wait的狀態。此時其他的客戶端再進行連線時,就會收到服務端的rst響應。為了證實這種情況下,是符合的這種現象,構造了下面簡單的demo程式,由於只是簡單的程式,很多異常並沒有考慮。

客戶端程式:

/**

* client.c

**/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv)

memset(&stserver, 0, sizeof(stserver));

stserver.sin_family = af_inet;

stserver.sin_port = htons(9999);

inet_pton(af_inet, argv[1], &stserver.sin_addr);

if( -1 == (connect(sockfd, (struct sockaddr *)&stserver, sizeof(stserver))))

n = write(sockfd, pbuf, strlen(pbuf));

/*** 等待server傳送fin後再fin

**/sleep(5);

return

0;}

服務端程式:

/**

* server.c

**/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main()

; struct sockaddr_in stserver,stcliet;

sockfd = socket(af_inet, sock_stream, 0);

if(-1 == sockfd)

memset(&stserver, 0, sizeof(stserver));

stserver.sin_family = af_inet;

stserver.sin_port = htons(9999);

stserver.sin_addr.s_addr = htonl(inaddr_any);

if(-1 == bind(sockfd, (struct sockaddr *)&stserver, sizeof(stserver)))

if(-1 == listen(sockfd, 8))

memset(&stcliet, 0, sizeof(stcliet));

len = sizeof(stcliet);

acceptfd = accept(sockfd, (struct sockaddr *)&stcliet, &len);

if(-1 == acceptfd)

n = read(acceptfd, buf, 1023);

if(0

< n)

/*** 主動傳送fin

**/close(sockfd);

return

0;}

這裡做的乙個處理是:客戶端在傳送資料後,等待一段時間,等待服務端的fin,使其服務端在四次揮手結束後進入到time_wait狀態。

編譯程式後,首先執行服務端,再執行客戶端,此時一路tcp連線建立,並使得服務端進入到了time_wait的狀態,在此時,再執行一次客戶端程式,此時收到錯誤輸出:connection refused。

通過抓的包分析,可以看到,在第一路連線釋放後,在服務端進入到time_wait狀態時,第二路的客戶端進行連線時,syn對應的響應為rst,詳細的包資訊見下圖:

這個現象與之前碰到的問題現象是基本一致的,根據這個思路,嘗試去分析了是否是服務端出現了某些異常的情況主動釋放了tcp連線,因此在某段時間內(time_wait的時間一般為:2msl),對於所有的客戶端都無法連線上。由於其他事情,這個問題也暫時放了放,目前還未找到確切的原因。

在整個網路程式設計中,其實time_wait的狀態是需要特別注意的。網路程式設計雖然坑多,但是只要我們結合原理一步步分析,整個過程都是其樂無窮的。(逃。。。。。

第一周 周一

寫在前面 小寫字母代表vj順序,大寫字母代表cf實際順序 problem 今天用賭的方式選題做,我以為是拼題,沒想到是一組整題。第 別的比賽,a.b,c的難度適中。做題的時候已經知道是不按順序了,所以沒有開啟a題。瀏覽發現d題題目比較簡單,就開始分析。十分鐘沒有思路後,看了一下rank,轉而去做c題...

一周一總結(10)

1.校園網裡的ping結果 在學過一點網路原理後,自己在寢室和實驗室ping了一下,校園網登陸的 是 寢室電腦連的是交換機 室友的,自己這邊的埠壞了,原因不明 再連到埠上,輸入 ping 172.16.254.13 如果不聯網無法ping通。到實驗室主機之間可以相互ping通,也可以ping通172...

17周周一周二

一.io outputstream system.in system.out 檔案自身file fileinputsream fileinputsream fin new fileinputstream f a.txt read 每次讀乙個位元組 返回值 1檔案末尾 while ch fin.rea...