9 呼叫connect連線超時

2021-08-28 02:53:39 字數 1766 閱讀 9693

簡單來說,連線超時就是當客戶端呼叫connect函式跟服務端建立連線,等待一段時間後,最後connect函式返回etimedout錯誤,建立連線失敗。那麼連線超時具體是怎麼出現的呢?一般是客戶端呼叫connect傳送的syn報文在網路傳輸過程中發生網路擁塞,導致報文丟失或服務端收到syn,但未及時響應。

而這種情況一般發生在服務端的可能性比較大,因為服務端所處的網路流量環境負載通常都很高,如果發生網路擁塞,又或者伺服器被d-dos攻擊了,那麼是極有可能出現連線超時這種情況的。

為了模擬這種情況,通過ifconfig命令可以檢視網絡卡資訊,我們把服務端eth3網絡卡的所有syn包都過濾掉:

iptables -f

iptables -i input -p tcp --syn -i eth3 -j drop

服務端程式:

#include

#include

#include

#include

#include

#include

#include

#define serv_port 10001

#define serv_ip "192.168.0.107"

intmain

(void

)write

(stdout_fileno, buf, len)

;//處理客戶端資料,小寫轉大寫

for(i =

0; i < len; i++

)write

(cfd, buf, len);}

close

(sfd)

;close

(cfd)

;return0;

}

客戶端程式:

#include

#include

#include

#include

#include

#include

#include

#define serv_ip "192.168.0.107"

#define serv_port 10001

intmain

(void

)//迴圈讀寫資料

while(1

)}close

(sfd)

;return0;

}

./server先啟動服務端,然後./client再啟動客戶端,通過tcpdump抓取到的報文如下:

客戶端總共向服務端傳送了6個ysn報文,後面5個syn是重傳的,每一次重傳syn包的間隔時間分別是1s,2s,4s,8s,16s,這些時間累積加起來總共為31s,也就是說客戶端的syn超時重傳的時間間隔採用了指數退避演算法增長的,而在重傳最後乙個報文其實還等待了32s,也就是說總共等待了63s才超時。

換句話說,客戶端在第一次傳送syn報文時就會啟動乙個計時器,如果在該計時器的時間內還未收到對端的ack,那麼將超時重傳。當然這個超時重傳也是有次數的,不會一直重傳,從tcpdump抓取到的資料報來看,客戶端一旦重傳超過5次,那麼客戶端tcp將會關閉這條連線。

最後connect函式返回失敗,然後退出。

connect設定連線超時

庖丁解牛 connect timeout 帶超時的connect 方法中已執行connect fd 檔案描述符 addr 位址結構體指標 wait seconds 等待超時秒數,如果為0表示不檢測超時 成功返回0.失敗返回 1,超時返回 1並且errno etimedout int connect ...

linux 設定connect 超時

將乙個socket 設定成阻塞模式和非阻塞模式,使用fcntl方法,即 設定成非阻塞模式 先用fcntl的f getfl獲取flags,用f setfl設定flags o nonblock 即 flags fcntl sockfd,f getfl,0 獲取檔案的flags值。fcntl sockfd...

C socket 關於connect超時設定

使用阻塞的socket,可以設定讀寫超時,struct timeval tv timeout tv timeout.tv sec 60 tv timeout.tv usec 0 if setsockopt sockfd,sol socket,so sndtimeo,void tv timeout,s...