突然頓悟了,無論三次握手,仍是四次握手,這是保證信息來回兩個鏈路可達(也就是信息能從A到B,也能從B到A)的最低要求。-2018-9-17-晚上九點html
舉個打電話的例子:網絡
A : 你好我是A,你聽獲得我在說話嗎ui
B : 聽到了,我是B,你聽到我在說話嗎spa
A : 嗯,聽到了.net
創建鏈接,開始聊天!unix
爲何TCP協議終止連接要四次?htm
一、當主機A確認發送完數據且知道B已經接受完了,想要關閉發送數據口(固然確認信號仍是能夠發),就會發FIN給主機B。blog
二、主機B收到A發送的FIN,表示收到了,就會發送ACK回覆。請求
三、但這是B可能還在發送數據,沒有想要關閉數據口的意思,因此FIN與ACK不是同時發送的,而是等到B數據發送完了,纔會發送FIN給主機A。im
四、A收到B發來的FIN,知道B的數據也發送完了,回覆ACK, A等待2MSL之後,沒有收到B傳來的任何消息,知道B已經收到本身的ACK了,A就關閉連接,B也關閉連接了。
A爲何等待2MSL,從TIME_WAIT到CLOSE?
在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鏈接。
這個網上轉載的例子不錯:
三次握手:
A:「喂,你聽獲得嗎?」A->SYN_SEND
B:「我聽獲得呀,你聽獲得我嗎?」應答與請求同時發出 B->SYN_RCVD | A->ESTABLISHED
A:「我能聽到你,今天balabala……」B->ESTABLISHED
四次揮手:
A:「喂,我不說了。」A->FIN_WAIT1
B:「我知道了。等下,上一句還沒說完。Balabala…..」B->CLOSE_WAIT | A->FIN_WAIT2
B:」好了,說完了,我也不說了。」B->LAST_ACK
A:」我知道了。」A->TIME_WAIT | B->CLOSED
A等待2MSL,保證B收到了消息,不然重說一次」我知道了」,A->CLOSED
參考:http://blog.chinaunix.net/uid-25002135-id-3314682.htmlhttp://www.cnblogs.com/vamei/archive/2012/12/16/2812188.html