1. 程式人生 > >網路TCP建立連線為什麼需要三次握手而結束要四次

網路TCP建立連線為什麼需要三次握手而結束要四次

 舉個打電話的例子:

  A : 你好我是A,你聽得到我在說話嗎

  B : 聽到了,我是B,你聽到我在說話嗎

  A : 嗯,聽到了

  建立連線,開始聊天!

為什麼TCP協議終止連結要四次?

1、當主機A確認傳送完資料且知道B已經接受完了,想要關閉傳送資料口(當然確認訊號還是可以發),就會發FIN給主機B。

2、主機B收到A傳送的FIN,表示收到了,就會發送ACK回覆。

3、但這是B可能還在傳送資料,沒有想要關閉資料口的意思,所以FIN與ACK不是同時傳送的,而是等到B資料傳送完了,才會傳送FIN給主機A。

4、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


連結:https://zhuanlan.zhihu.com/p/21940234

參考:http://blog.chinaunix.net/uid-25002135-id-3314682.html
http://www.cnblogs.com/vamei/archive/2012/12/16/2812188.html