TCP连接(client、server)状态转换
?客戶端狀態(tài)的變化:
客戶端創(chuàng)建套接字之后會connect服務(wù)器,這時客戶端會發(fā)送一個SYN到服務(wù)器,狀態(tài)轉(zhuǎn)換到SYN_SENT并等待服務(wù)器的回復(fù),收到服務(wù)端的回復(fù)SYN+ACK(同一個報文)之后???客戶端會回復(fù)ACK此時狀態(tài)轉(zhuǎn)換到ESTABLISHED,正常數(shù)據(jù)交互完成之后客戶端會close套接字此時發(fā)送一個FIN報文,狀態(tài)轉(zhuǎn)換到FIN_WAIT_1,同時等待服務(wù)端的回復(fù),此時有三種情況:
(1)收到服務(wù)端的ACK但此時服務(wù)端沒有關(guān)閉套接字。狀態(tài)轉(zhuǎn)換到了FIN_WAIT_2,然后再等待服務(wù)端關(guān)閉套接字發(fā)出的FIN,如果收到則回復(fù)ACK,狀態(tài)轉(zhuǎn)換到TIME_WAIT狀態(tài),等待2MSL超時之后自動轉(zhuǎn)換為CLOSED狀態(tài)。
?(2)服務(wù)端同時也在關(guān)閉套接字,此時客戶端會收到SYN并發(fā)出ACK,狀態(tài)轉(zhuǎn)換到CLOSING,之后等待服務(wù)端回復(fù)ACK,若收到ACK則轉(zhuǎn)到TIME_WAIT狀態(tài)。
(3)服務(wù)器在收到客戶端FIN之后立馬關(guān)閉套接字,此時客戶端會收到一個ACK和FIN并發(fā)出ACK,狀態(tài)?轉(zhuǎn)換到TIME_WAIT狀態(tài)。
服務(wù)器狀態(tài)的變化:
服務(wù)端?創(chuàng)建套接字之后調(diào)用listen函數(shù)將套接字有一個未連接的主動套接字轉(zhuǎn)換為被動套接字,指示內(nèi)核應(yīng)接受指向該套接字的連接請求,套接字狀態(tài)由CLOSE轉(zhuǎn)換為LISTEN,等待客戶端連接。所以服務(wù)端是被動接收連接的,服務(wù)端會先收到SYN,收到之后會立馬發(fā)送一個SYN+ACK(同一個報文),此時狀態(tài)轉(zhuǎn)換到SYN_RCVD并等待客戶端回復(fù)ACK,此時套接字處于未完成連接隊列中,如果收到ACK狀態(tài)會轉(zhuǎn)換到ESTABLISHED,套接字處于已完成連接隊列中,注意的是未完成連接隊列和已完成連接隊列之和不能超過listen設(shè)置的最大連接個數(shù)。這時服務(wù)端和客戶端可以進行數(shù)據(jù)交互,客戶端接收完數(shù)據(jù)之后主動close套接字,此時服務(wù)端會收到FIN并回復(fù)ACK,狀態(tài)轉(zhuǎn)換到LOSE_WAIT,當(dāng)服務(wù)端的應(yīng)用層也close套接字時服務(wù)端會發(fā)生一個FIN狀態(tài)轉(zhuǎn)換到LAST_ACK然后會收到客戶端回復(fù)的ACK,狀態(tài)轉(zhuǎn)換到CLOSED。
為什么釋放連接需要TIME_WAIT?
回憶一下我們最終的那個FIN與ACK,被動關(guān)閉方發(fā)送FIN,并等待主動關(guān)閉方返回的ACK。我們假設(shè)最終的ACK丟失,被動關(guān)閉方將需要重新發(fā)送它的最終那個FIN,主動關(guān)閉方必須維護狀態(tài)信息(TIME_WAIT),以允許它重發(fā)最終的那個ACK。如果沒有了這個狀態(tài),當(dāng)他第二次收到FIN時,會響應(yīng)一個RST(也是一種類型的TCP分節(jié)),會被服務(wù)器解釋成一個錯誤。
目的:為了TCP打算執(zhí)行必要的工作以徹底終止某個連接兩個方向上的數(shù)據(jù)流(即全雙工關(guān)閉),那么他必須要正確處理連接終止四個分節(jié)中任何一個分節(jié)丟失的情況
處于TIME_WAIT這個狀態(tài)時,此套接字上的綁定了資源,將在2MSL(最大報文生存時間)內(nèi)不可再使用。選擇2MSL這個時間是為了避免出現(xiàn)上一次連接中被動關(guān)閉端重復(fù)發(fā)送的數(shù)據(jù)包。
我們假設(shè)ip1:port1和ip2:port2 之間有一個TCP連接。我們關(guān)閉了這個鏈接,過一段時間后在相同IP和端口之間建立了另一個連接。TCP必須防止來自之前那個連接的老的重復(fù)分組在新連接上出現(xiàn)。為了做到這一點,TCP將不復(fù)用處于TIME_WAIT狀態(tài)的連接。2MSL的時間足以讓某個方向上的分組存活MSL秒后被丟棄,另一個方向上的應(yīng)答也最多存活MSL秒后被丟棄。
狀態(tài)轉(zhuǎn)換圖:
?
轉(zhuǎn)載于:https://www.cnblogs.com/single-dont/p/11386241.html
總結(jié)
以上是生活随笔為你收集整理的TCP连接(client、server)状态转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue.js not detected
- 下一篇: 新版本,新起点。