2MSL TCP三次握手 四次揮別 (特殊三次揮別)

http://blog.csdn.net/phunxm/article/details/5085792

http://blog.csdn.net/ysdaniel/article/details/6636687

TCP連接與關閉過程

在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接,如圖1所示。

(1)第一次握手:建立連接時,客戶端A發送SYN包(SYN=j)到服務器B,並進入SYN_SEND狀態,等待服務器B確認。

(2)第二次握手:服務器B收到SYN包,必須確認客戶A的SYN(ACK=j+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。

(3)第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=k+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與服務器開始傳送數據。

確認號:其數值等於接收方期望接收的下一個序列號。

圖1 TCP三次握手建立連接

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送(報文段4)。

(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。

(3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A(報文段6)。

(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1(報文段7)。

TCP採用四次揮手關閉連接如圖2所示。

圖2  TCP四次揮手關閉連接

TCP連接的釋放:

雖然TCP連接是全雙工的,但是爲了理解TCP連接的釋放過程,最好將TCP連接看成一對單工連接。每個單工連接放單獨釋放,兩個單工連接相互獨立。爲了釋放一個連接,任何一方都可以發送一個設置了FIN位的TCP數據段,這表示它已經沒有數據要發送了。FIN數據段被確認的時候,這個方向上就停止傳送新數據然而,另一個方向上可能還在繼續無限制地傳送數據。當兩個方向都停止的時候,連接才被釋放。通常情況下,爲了釋放一個連接,需要4TCP數據段每個方向上一個FIN和一個ACK。然而,第一個ACK和第二個FIN有可能被包含在同一個數據段中,從而將總數降低到3個。

如果在兩倍最大分組生存期內FIN的應答沒有到達的話,FIN的發送方就會直接釋放連接。一方最終也會注意到,好像對方已經不再監聽該連接了,因而也會超時。雖然理論上不完美,但實際中很少出現問題。


TCP連接的

1.爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?

這是因爲服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裏來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。

2.爲什麼TIME_WAIT狀態還需要等2MSL後才能返回到CLOSED狀態?

這是因爲雖然雙方都同意關閉連接了,而且握手的4個報文也都協調和發送完畢,按理可以直接回到CLOSED狀態(就好比從SYN_SEND狀態到ESTABLISH狀態那樣);但是因爲我們必須要假想網絡是不可靠的,你無法保證你最後發送的ACK報文會一定被對方收到,因此對方處於LAST_ACK狀態下的SOCKET可能會因爲超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT狀態的作用就是用來重發可能丟失的ACK報文。

 

本文摘自:

《TCP連接的狀態轉換圖深度剖析》

http://www.diybl.com/course/6_system/linux/Linuxjs/2007104/76065.html

參考:

《TCP/IP詳解-卷1》第18章《TCP連接的建立與終止》

http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF

 

 

2MSL

     MSLMaximum Segment Lifetime英文的縮寫,中文可以譯爲“報文最大生存時間”,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。因爲tcp報文(segment)是ip數據報(datagram)的數據部分,具體稱謂請參見《數據在網絡各層中的稱呼》一文,而ip頭中有一個TTL域,TTLtime to live的縮寫,中文可以譯爲“生存時間”,這個生存時間是由源主機設置初始值但不是存的具體時間,而是存儲了一個ip數據報可以經過的最大路由數,每經過一個處理他的路由器此值就減1,當此值爲0則數據報將被丟棄,同時發送ICMP報文通知源主機。RFC 793中規定MSL2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。

     2MSL即兩倍的MSLTCPTIME_WAIT狀態也稱爲2MSL等待狀態,當TCP的一端發起主動關閉,在發出最後一個ACK包後,即第3次握手完成後發送了第四次握手的ACK包後就進入了TIME_WAIT狀態,必須在此狀態上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最後一個ACK包對方沒收到,那麼對方在超時後將重發第三次握手的FIN包,主動關閉端接到重發的FIN包後可以再發一個ACK應答包。TIME_WAIT狀態時兩端的端口不能使用,要等到2MSL時間結束纔可繼續使用。當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設置SO_REUSEADDR選項達到不必等待2MSL時間結束再使用此端口。

 

 

TCP連接關閉過程筆記

作者:fbysss
msn:[email protected]  
blog:blog.csdn.net/fbysss
聲明:本文由fbysss原創,轉載請註明出處
關鍵字:TCP協議 關閉連接
前言:
TCP協議的連接是全雙工連接,一個TCP連接存在雙向的讀寫通道。 
簡單說來是 “先關讀,後關寫”,一共需要四個階段。以客戶機發起關閉連接爲例:
1.服務器讀通道關閉
2.客戶機寫通道關閉
3.客戶機讀通道關閉
4.服務器寫通道關閉
關閉行爲是在發起方數據發送完畢之後,給對方發出一個FIN(finish)數據段。直到接收到對方發送的FIN,且對方收到了接收確認ACK之後,雙方的數據通信完全結束,過程中每次接收都需要返回確認數據段ACK。
詳細過程:
    第一階段   客戶機發送完數據之後,向服務器發送一個FIN數據段,序列號爲i
    1.服務器收到FIN(i)後,返回確認段ACK,序列號爲i+1關閉服務器讀通道
    2.客戶機收到ACK(i+1)後,關閉客戶機寫通道
   (此時,客戶機仍能通過讀通道讀取服務器的數據,服務器仍能通過寫通道寫數據)
    第二階段 服務器發送完數據之後,向客戶機發送一個FIN數據段,序列號爲j;
    3.客戶機收到FIN(j)後,返回確認段ACK,序列號爲j+1關閉客戶機讀通道
    4.服務器收到ACK(j+1)後,關閉服務器寫通道
這是標準的TCP關閉兩個階段,服務器和客戶機都可以發起關閉,完全對稱。
FIN標識是通過發送最後一塊數據時設置的,標準的例子中,服務器還在發送數據,所以要等到發送完的時候,設置FIN(此時可稱爲TCP連接處於半關閉狀態,因爲數據仍可從被動關閉一方向主動關閉方傳送)。如果在服務器收到FIN(i)時,已經沒有數據需要發送,可以在返回ACK(i+1)的時候就設置FIN(j)標識,這樣就相當於可以合併第二步和第三步。

發佈了27 篇原創文章 · 獲贊 15 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章