tcp四次挥手,为什么是四次?
??上一篇博客說了三次握手為什么是是三次(點這里),那么現(xiàn)在就介紹一下四次揮手。大家都知道TCP是全雙工的,再建立連接時的三次握手中的SYN和ACK一起發(fā)送,這里就會有疑問,為什么在四次揮手的時候沒有將SYN和ACK一起發(fā)送呢?帶著這個問題繼續(xù)向下看,答案就在其中。
??說到四次揮手,顧名思義,就是在關(guān)閉連接的時候雙方一共要操作四次,來看一下這四次都是怎么操作的:
??從圖中可以看出來,在四次揮手的時候雙方一共進入了六種狀態(tài),這六種狀態(tài)就是理解四次揮手的關(guān)鍵所在,我們來看一下
四次揮手的狀態(tài)
FIN_WAIT_1:這個狀態(tài)和FIN_WAIT_2狀態(tài)都在再等待對方的回復,但是這兩種狀態(tài)是有區(qū)別的,FIN_WAIT_1就是主動方在ESTABLISHED狀態(tài)的時候,想要主動關(guān)閉連接,向?qū)Ψ桨l(fā)送FIN報文,這時候就進入了FIN_WAIT_1狀態(tài)。當他收到對方回復的ACK報文后,就進入了FIN_WAIT_2狀態(tài)。 但是在實際操作中是很難遇到FIN_WAIT_1狀態(tài)的,因為無論對方是什么情況都應該立刻回應ACK報文,但是FIN_WAIT_2狀態(tài)還是可以在主動方中用netstat看到的。
FIN_WAIT_2:上面已經(jīng)對FIN_WAIT_2講解過了,當主動方進入FIN_WAIT_2時,就表示著半連接狀態(tài),也就是主動方還有數(shù)據(jù)要發(fā)給對方,這個數(shù)據(jù)就是之后的ACK,所有他要等一會兒才關(guān)閉連接。
CLOSE_WAIT:這個狀態(tài)從表面也可以看出它的作用,就是等待關(guān)閉。當被動方接收到FIN時,會立刻回復一個ACK給對方,接下來就是進入CLOSE_WAIT狀態(tài)。在這個狀態(tài)中,被動方需要考慮自己還有沒有數(shù)據(jù)要發(fā)送給對方,如果有可以繼續(xù)發(fā)送,如果沒有了就可以關(guān)閉連接了,發(fā)送一個FIN給對方。 這個狀態(tài)其實也就是給自己一個緩沖的時間,讓自己處理完需要處理的事,然后去關(guān)閉連接。
TIME_WAIT:這個狀態(tài)就是一段時間后進行一些操作。當主動方收到了對方發(fā)來的FIN報文,并發(fā)出ACK報文,接下來就等2MSL就可以進入CLOSED狀態(tài)了。其實,如果主動方在FIN_WAIT_1狀態(tài)下,收到了對方的FIN+ACK標志的報文,就可以跳過FIN_WAIT_2狀態(tài)直接進入TIME_WAIT狀態(tài)了。
LAST_ACK:這個狀態(tài)從表面不難不理解他的意思,這個狀態(tài)就是被動方發(fā)送了FIN報文后,最后等待對方的ACK報文,收到ACK報文后就可以進入CLOSED狀態(tài)了。
CLOSED:上面提到了幾次這個狀態(tài),相比也猜出來了,這個狀態(tài)表示的就是連接中斷,已經(jīng)關(guān)閉。
??在上面的TIME_WAIT狀態(tài)中有提到過2MSL,那么什么是2MSL呢?那么來詳細說一下TIME_WAIT狀態(tài)和里面的2MSL。
為什么需要TIME_WAIT?
??TIME_WAIT在四次揮手中有著不可替代的位置,如果沒有TIME-WAIT,主動方就會直接進入CLOSED狀態(tài),(假設主動方時客戶端,被動方時服務端)這時候如果立即重啟客戶端使用相同的端口,如果因為網(wǎng)絡中種種原因最后一次ACK丟失了,服務端就會重復FIN請求,這時這個FIN就會被重新啟動的客戶端接收到,或者新啟動的客戶端向服務端發(fā)起請求的時候,因為服務端正在等待最后一次ACK,因此新連接請求發(fā)送的SYN就會被服務端認為時請求碼錯誤,服務端就會回復RET重置連接。所以就需要主動方發(fā)送最后一次ACK之后進入TIME_WAIT狀態(tài),等待2MSL(兩個報文最大生命周期),等待這段時間就是為了如果接收到了重發(fā)的FIN請求能夠進行最后一次ACK回復,讓在網(wǎng)絡中延遲的FIN/ACK數(shù)據(jù)都消失在網(wǎng)絡中,不會對后續(xù)連接造成影響
那么為什么TIME_WAIT的時間是2MSL呢?
??MSL是TCP報文的最大生命周期,因為TIME_WAIT持續(xù)在2MSL就可以保證在兩個傳輸方向上的尚未接收到或者遲到的報文段已經(jīng)消失,否則服務器立即重啟,可能會收到來自上一個進程遲到的數(shù)據(jù),但是這種數(shù)據(jù)很可能是錯誤的,同時也是在理論上保證最后一個報文可靠到達,假設最后一個ACK丟失,那么服務器會再重發(fā)一個FIN,這是雖然客戶端的進程不在了,但是TCP連接還在,仍然可以重發(fā)LAST_ACK。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的tcp四次挥手,为什么是四次?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 使用 TinyXml 解析 XM
- 下一篇: 利用自定义web-font实现数据防采集