最近遇到乙個問題:在存在防火牆的情況下,某些客戶端在某個時間段連線伺服器時會出現連線不上的問題,在客戶端側用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...