當我們討論TCP的連線運輸管理時,我們在說什麼

xx19941215發表於2019-02-16

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會使本次連線產生的報文段都從網路中消失。

全文完。

相關文章