當咱們討論TCP的鏈接運輸管理時,咱們在說什麼

TCP鏈接管理概述

TCP是面向鏈接的協議。運輸鏈接是用來傳送TCP報文的。TCP的鏈接和釋放是每一次面向鏈接的通訊中必不可少的過程。所以,運輸鏈接就有三個階段,即:鏈接創建,數據傳輸和鏈接釋放。運輸鏈接的管理就是使運輸鏈接的創建和釋放均可以正常的進行。緩存

在TCP鏈接的創建過程當中要解決一下三個問題。服務器

1.要使每一方可以確知對方的存在。
2.要容許雙方協商一些參數(如窗口最大值、是否使用窗口擴大選項和時間戳選項以及服務質量等)。
3.可以對運輸實體資源(如緩存大小、鏈接中的項目等)進行分配。網絡

TCP鏈接的創建採用客戶服務器方式。主動發起創建鏈接的應用叫作客戶(Client),而被動等待鏈接創建的應用進程叫作服務器(server)。spa

TCP鏈接的創建

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

圖片描述

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。blog

以上的過程就是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會使本次鏈接產生的報文段都從網絡中消失。it

全文完。