TCP連接要點

TCP三次握手

客戶端:A
服務器:B
兩者未建立連接
A:發送SYN=1,seq=x,A的狀態變爲同步已發送
B:收到數據,狀態由收聽狀態變爲同步收到狀態,並且發送SYN=1,ACK=1,seq=y,ack=x+1
A:收到數據,狀態變爲已建立連接,併發送ACK=1,seq=x+1,ack=y+1
B:收到數據,狀態變爲已建立連接。

TCP四次分手

客戶端:A
服務器:B
兩者已建立連接
A:發送FIN=1,seq=u,狀態變爲FIN-WAIT-1終止等待1
B:收到數據,發送ACK=1,seq=v,ack=u+1,通知應用進程,等當前報文發送完畢在發送FIN字段,進入CLOSE_WAIT關閉等待狀態。
A:收到數據,狀態變爲FIN-WAIT-2終止等待2.
B:當前報文發送完畢,發送FIN=1,ACK=1,seq=w,ack=u+1,狀態變爲最後確認狀態。
A:收到數據,發送ACK=1,seq=u+1,ack=w+1,讓B進行確認,並進入TIME-WAIT時間等待狀態,啓動計時器。
B:收到數據,可以放心關閉了,狀態變爲CLOSE狀態。
A:計時期間沒有收到服務器的回覆,當計時完成的時候就進入CLOSE狀態。

常見問題

【問題1】爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?

答:因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

【問題2】爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。在Client發送出最後的ACK回覆,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重複發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網絡中最大的存活時間,2MSL就是一個發送和一個回覆所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連接。
————————————————
版權聲明:本文爲CSDN博主「青柚_」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38950316/article/details/81087809

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章