為什么建立TCP連接需要三次握手,為什么斷開TCP連接需要四次握手,TIME_WAIT狀態的意義

轉自:https://www.cnblogs.com/zhoudayang/p/6012257.html

為什么建立TCP連接需要三次握手?

原因:為了應對網絡中存在的延遲的重復數組的問題

例子:

假設client發起連接的連接請求報文段在網絡中沒有丟失,而是在某個網絡節點長時間滯留了,導致延遲到達server。本來這是一個已經失效的連接報文,但是server接收到這個連接報文之后,誤認為client發起了新的連接,于是向client發送確認報文段。此時因為沒有了連接的3次握手,client不會對server的確認報文作出回應,也不會向server發送數據,server就以為連接已經建立,一直在空等client的數據,這樣server的這一部分網絡資源就被浪費了。

另外:

基于通信方式和雙全工的特性,所以在tcp連接建立時

client需要將自己的ISN序號告知對方,同時需要對方的確定。

server也需要將自己的ISN序號告知對方,同時也要對方的確定。

在上圖中,server將自己的ack和發出的syn標志的告知對方ISN的合并在一次傳遞中,這樣子節省流量。所以三次握手很合理。

為什么斷開TCP連接需要進行四次握手 ?

TCP通信雙方都可以獨立關閉自己的通信通道,也就是半關閉。

client先發送FIN告知對方我已經完成數據發送了,server回復ack來確定我知道了。這樣一個流程,就關閉了client的發送信息通道。但是client還可以接收。

server此時已經知道接收不到client的數據了,但是還可以給它發送數據。如果server也沒有啥數據要發送給對方了,server也會以FIN標志位發送一個信息給client,client接到后,也會傳遞一個ack表示知道了。這樣子,雙方都完成了關閉。

因為TCP連接是全雙工的網絡協議,允許同時通信的雙方同時進行數據的收發,同樣也允許收發兩個方向的連接被獨立關閉,以避免client數據發送完畢,向server發送FIN關閉連接,而server還有發送到client的數據沒有發送完畢的情況。所以關閉TCP連接需要進行四次握手,每次關閉一個方向上的連接需要FIN和ACK兩次握手。

TIME_WAIT狀態的意義

在TCP連接中,當被動關閉連接的一方(圖中client)發送的FIN報文到達時,被動關閉連接的一方會發送ACK確認報文,并且進入TIME_WAIT狀態,并且等待2MSL時間段(MSL:maximum segment life)。這么做有下述兩個原因:

被動關閉連接的一方(圖中的server)在一段時間內沒有收到對方的ACK確認數據包,會重新發送FIN數據包,因而主動關閉連接的一方需要停留在等待狀態以處理對方重新發送的FIN數據包。否則他會回應一個RST數據包給被動關閉連接的一方,使得對方莫名其妙。

在TIME_WAIT狀態下,不允許應用程序在當前ip和端口上和之前通信的client(這個client的ip和端口號不變)建立一個新的連接。這樣就能避免新的連接收到之前的ip和端口一致的連接殘存在網絡中的數據包。這也是TIME_WAIT狀態的等待時間被設置為2MSL的原因,以確保網絡上當前連接兩個方向上尚未接收的TCP報文已經全部消失。

尤其是通信雙方都可以獨立關閉自己的通信通道,也就是半關閉。

client先發送FIN告知對方我已經完成數據發送了,server回復ack來確定我知道了。這樣一個流程,就關閉了client的發送信息通道。但是client還可以接收。

server此時已經知道接收不到client的數據了,但是還可以給它發送數據。如果server也沒有啥數據要發送給對方了,server也會以FIN標志位發送一個信息給client,client接到后,也會傳遞一個ack表示知道了。這樣子,雙方都完成了關閉。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容