TCP連接管理概述

TCP是面向連接的協議。運輸連接是用來傳送TCP報文的。TCP的連接和釋放是每一次面向連接的通信中必不可少的過程。因此,運輸連接就有三個階段,即:連接建立,數據傳輸和連接釋放。運輸連接的管理就是使運輸連接的建立和釋放都可以正常的進行。

在TCP連接的建立過程中要解決一下三個問題。

1.要使每一方能夠確知對方的存在。

2.要允許雙方協商一些參數(如窗口最大值、是否使用窗口擴大選項和時間戳選項以及服務質量等)。

3.能夠對運輸實體資源(如緩存大小、連接中的項目等)進行分配。

TCP連接的建立採用客戶伺服器方式。主動發起建立連接的應用叫做客戶(Client),而被動等待連接建立的應用進程叫做伺服器(server)。

TCP連接的建立

下圖表示的是TCP連接建立的過程。主機A運行的是TCP客戶端程序,而B運行TCP伺服器端程序。最初的時候,雙方的TCP進程都處於關閉(CLOSED)狀態。然後A主動打開連接,而B被動打開連接。

1.A發送一個SYN=1的TCP報文,序列號seq是x。A的狀態由CLOSED進入到SYN-SENT。

2.B收到之後發送SYN=1,ACK=1的TCP報文,同樣為自己選一個序列號seq=y,確認號ack=x+1。B的狀態由LISTEN進入到SYN-RCVD。

3.A收到B的確認之後,需要給B確認。ACK=1,seq=x+1,確認號ack是y+1。A的狀態由SYN-SENT進入到ESTABLISH,B在收到A的確認之後也由SYN-RCVD進入到ESTABLISH。

以上的過程就是3次握手。這裡一個常見的問題就是為什麼在A發送建立連接的請求後還需要發送一個確認報文?這是因為主要是為了避免已經失效的連接請求報文段突然又傳到了B而產生錯誤。失效的報文主要是在出現在網路不是很通暢的時候會產生,而三次握手機制避免了這種情況會產生的問題。

TCP連接的釋放

在傳輸結束之後,通信雙方都可以釋放連接。A的應用進程先向其TCP發出連接釋放報文段,並停止發送數據,主動關閉TCP連接。

1.A將連接釋放報文的終止控制位FIN設置為1,seq序列號為u。此時A的狀態由ESTABLISH進入到FIN-WAIT-1。

2.B在收到這個報文之後,隨即發出確認。ACK=1 seq=v ack=u+1。此時B由ESTABLISH進入到CLOSE-WAIT狀態。A收到B的確認之後進入到FIN-WAIT-2。此時B的TCP伺服器進程會通知高層應用進程。這個時候A到B的傳輸就釋放了,TCP的連接處於半關閉狀態。A沒有數據發送到B,若B還有數據,可以發送到A。

3.B發送FIN=1 ACK=1 seq=w ack=u+1(必須重複上次的確認號)。B由CLOSE-WAIT進入到LAST-ACK狀態。

4.A收到B的連接釋放報文之後,發送確認ACK=1 seq=u+1 ack=w+1。此時A由FIN-WAIT-2進入到TIME-WAIT。B在收到A的確認之後由LAST-ACK進入CLOSED狀態。A在2MSL(大約是4分鐘)之後進入到CLOSED狀態。

這裡一個常見的問題就是A為什麼需要2MSL的等待時間。第一是為了保證A最後發送的ACK報文到達B。第二是為了當時出現上文提到的失效的報文段。因為2MSL會使本次連接產生的報文段都從網路中消失。

全文完。


推薦閱讀:
相關文章