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