TCP 鏈接管理

概述

  TCP是面向鏈接的協議。運輸鏈接是用來傳輸報文的。運輸鏈接的創建和釋放在每一次通訊中是必不可少的內容。所以運輸鏈接分爲三個階段:創建鏈接、傳輸數據和釋放連接。運輸管理就是保證每一步都能正常運行。緩存

在TCP 鏈接的創建過程主要解決三個問題:服務器

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

1、TCP 鏈接的創建

在這裏插入圖片描述

TCP 的鏈接創建,咱們經常稱爲三次握手。網絡

A:您好,我是A。計算機網絡

B:您好,我是B指針

A:您好B。cdn

鏈接過程

假設A 爲客戶端(上圖左),B 爲服務端(右)blog

  1. 一開始A、B 均爲關閉狀態。B先開啓服務器,創建傳輸控制塊TCB。準備接受鏈接請求,而後處於LISTEN 狀態。等待用戶鏈接請求並做出響應。

TCB:(Transmission Control Block,存儲了每個鏈接中的一些重要信息,如:TCP 鏈接表,指向發送和接受緩存的指針,指向重傳隊列的指針,當前發送和接受序號等等)隊列

  1. A 也是先建立鏈接控制模塊TCB 。而後A 向B 發送請求報文段,這時首部中的同部位SYN = 1,同時選擇一個初始序號 seq = x。TCP 規定,SYN 報文段不能攜帶數據,但要消耗掉一個序號。而後客戶端進入SYN-SEND (同步已發送)狀態。
  2. B 接受到A 的鏈接請求後,若是贊成鏈接須要給S 發送確認。確認報文段ACK 置爲1,確認號ack = x+1,同時選擇一個本身的初始序號seq = y。請注意這個報文段也不能傳輸數據,但也要消耗一個序號。這是B 進入SYN-RCVD (同步收到)狀態。
  3. A 收到B 的確認後,須要發送一個確認給B。確認報文段ACK 置爲1,確認號ack = y + 1,而本身的序號seq = x + 1,。TCP 規定,ACk 報文段能夠添加數據。但若是沒有添加數據則不消耗序號。這時,TCP 鏈接已經創建,A 進入ESTABLISHED (已經創建鏈接)狀態。
  4. B 收到 A 的確認也進入ESTABLISHED (已經創建鏈接)狀態。

爲何TCP 是三次握手?

假設A B 只用兩次握手就創建鏈接。圖片

當A 第一次發送給B 鏈接請求時,若是遲遲得不到迴應,A會再次發送鏈接請求。那麼如今網絡中有兩次請求,通常狀況下第一次請求掛掉了,那麼B 收到第二次請求,而後迴應A,鏈接創建,沒毛病。可是第一次請求可能只是滯後了,假設AB斷開鏈接後,B 又收到了第一次請求,又會嘗試創建鏈接,可是A 會以爲本身沒有嘗試創建鏈接,從而拒絕B。由於是兩次握手,B 會覺得本身已經創建鏈接了,等待A 發送數據,白白浪費資源。資源

三次握手就不會出現這個問題,B 在發送確認後,得不到A 的確認,就會知道這是個過期的請求,知道A 沒有要求創建鏈接。

2、TCP 鏈接釋放

在這裏插入圖片描述
好了,說完了鏈接,接下來講一說「拜拜」,好說好散。這常被稱爲四次揮手。

A:B 啊,我不想玩了。

B:哦,你不想玩了啊,我知道了。

這個時候,還只是 A 不想玩了,也即 A 不會再發送數據,可是 B 能不能在 ACK 的時候,直接關閉呢?固然不能夠了,,頗有可能 A 是發完了最後的數據就準備不玩了,可是 B 還沒作完本身的事情,仍是能夠發送數據的,因此稱爲半關閉的狀態。

這個時候 A 等待 B 也主動關閉。

B:A 啊,好吧,我也不玩了,拜拜。

A:好的,拜拜。

釋放連接的過程

首先AB 都處於ESTABLISHED 狀態

  1. A 先發送鏈接釋放報文段,並中止發送數據,主動關閉TCP 鏈接。A 把連接釋放報文段首部的停止控制位FIN 置爲1 ,其序號爲seq = u(等於前一個傳輸數據的序號+1)。這是A 進入 FIN-WAIT-1(終止等待鏈接1)狀態,等待B 的確認。TCP規定,FIN 報文段即便不攜帶數據,也會消耗一個序號。
  2. B 收到A 的鏈接釋放報文段後發出確認。確認號ack = u + 1,而報文段本身的序號seq = v(等於前一個傳輸數據的序號+1)。而後B 進入CLOSED-WAIT(關閉等待)狀態,這是A->B方向的鏈接就已經斷開了,TCP 鏈接處於半關閉狀態.
  3. A 收到B 的確認後,進入FIN-WAIT-2(終止等待2)狀態,等待B 發送釋放報文段。
  4. 若B 發送完數據後,向A 發送TCP 釋放報文段。FIN 置爲1 ,先假設序號seq = w (B可能又發送了一些數據),B 還必須重複上次已經發送的確認號ack = u + 1。這是B 進入LAST-ACK(最後確認)狀態,等待A 的確認
  5. A 在收到鏈接釋放報文段後發送確認。在確認報文段中把ACK 置爲1 ,確認號ack = w + 1,而本身的序號seq = u + 1(TCP 規定,前面發送過的FIN 報文段要消耗一個序號)。而後進入到TIME-WAIT(時間等待)狀態
  6. 如今TCP 鏈接尚未斷掉。必須通過時間等待計時器(TIME-WAIT time)設置的2MSL時間事後,A 才進入到CLOSED 狀態。

MSL(Maximum Segment Lifetimr)最長報文生存時間,RFC793 建議爲2 分鐘。

  1. B 收到A 的ACK 後進入CLOSED 狀態

爲何A 在TIME-WAIT 必須等待2MSL時間?

  1. 爲了保證A 發送的最後一個ACK 報文段可以到達B。
  2. 防止已失效的鏈接請求報文段出如今本連接中。A 在發送完最後一個ACK 後,在通過2MSL 的等待時間能夠保證本連接持續時間內發送的報文在網絡中消失。這樣就不會出現舊鏈接請求出如今新鏈接請求裏面的狀況

TCP 保活計時器

除了時間等待器外,TCP 還設有一個保活計時器(keepalive timer)。

當客戶與服務器創建了鏈接,而客戶出現故障沒法響應客戶端時,服務器就會發一個探測報文,75秒發一個,若連續發10 個客戶端都沒響應,則服務器端自動關閉鏈接。保活計時器默認爲2 個小時,每收到一次請求刷新。

TCP 狀態機

在這裏插入圖片描述

參考資料

  • 極客時間:《趣談網絡協議》
  • 《計算機網絡》
相關文章
相關標籤/搜索