前言
網絡編程中超時時間是一個重要但又容易被忽略的問題,對其的設置需要仔細斟酌。
本文討論的是socket設置為阻塞模式,如果socket處于阻塞模式運行時,就需要考慮處理socket操作超時的問題。
所謂阻塞模式,是指其完成指定的操作之前阻塞當前的進程或線程,直到操作有結果返回.
在我們直接調用socket操作函數時,如果不進行特意聲明的話,它們都是工作在阻塞模式的,
如 connect, send, recv等.
簡單分類的話,可以將超時處理分成兩類:
連接(connect)超時;
發送(send), 接收(recv)超時;
連接超時
從字面上看,連接超時就是在一定時間內還是連接不上目標主機。你所建立的socket連接其實最終都要進行系統調用進入內核態,剩下的就是等待內核通知連接建立。所以自行在代碼中設置了超時時間(一般是叫connectTimeout或者socketTimeout),那么這個超時時間一到如果內核還沒成功建立連接,那就認為是連接超時了。如果他們沒設置超時時間,那么這個connectTimeout就取決于內核什么時候拋出超時異常了。
因此,我們需要分析一下內核是怎么來判斷連接超時的。
內核層的超時分析
我們都知道一個連接的建立需要經過3次握手,所以連接超時簡單的說是是客戶端往服務端發的SYN報文沒有得到響應(服務端沒有返回ACK報文)。
由于網絡本身是不穩定的,丟包是很常見的事情(