文章目錄
- 前言
- 一、TCP三報文握手
- 二、TCP四報文揮手
- 三、TCP保活計時器
前言
??TCP通信,通常需要經歷三個階段:三報文握手->發送,接收數據->四報文揮手。
一、TCP三報文握手
??三報文握手處于TCP的連接建立階段,主要解決了以下的問題:
- 使TCP通信的雙方知道對方的存在,確認雙方的接收與發送能力。
- 客戶端發送 SYN 報文,請求建立連接。
- 服務器回復 SYN + ACK 報文,表示“我收到了你的請求,也同意建立連接”。
- 客戶端再次回復 ACK 報文,表示“我也收到了你的確認”。
- 在握手報文中可以攜帶 TCP 選項字段,允許雙方就這些參數進行協商,使得通信性能更優。
- MSS(最大報文段長度)
- Window Scale(窗口擴大因子)
- SACK(選擇性確認)
- Timestamps(時間戳)等
- 使TCP雙方可以對運輸的實體資源進行分配和初始化。在三次握手完成后,操作系統會:
- 在內核中為該連接分配 socket 緩存(接收緩沖區、發送緩沖區)
- 初始化連接狀態(如 TCP 狀態機進入 ESTABLISHED 狀態)
??三報文握手的流程如下,分為TCP服務
和TCP客戶
兩個角色:
-
最初,兩端的TCP進程都處于關閉的狀態。TCP連接進程首先創建傳輸控制塊**(服務端和客戶都要)**,用于存儲TCP連接中的一些重要信息,隨后
TCP服務
進入監聽狀態。 -
TCP客戶
發送連接請求報文段,該請求報文段不能攜帶數據,TCP客戶
進入同步已發送狀態,連接請求報文段的關鍵參數:- SYN:1
- seq:設置為初始值x,作為TCP客戶進程的初始序號。
-
TCP服務
接收到TCP
客戶的連接請求報文段,并且向TCP客戶
發送連接請求確認報文段(不能攜帶數據),TCP服務
進入同步已接收狀態,連接請求確認報文段的關鍵參數:- SYN:1
- ACK:1
- seq:設置為初始值y,作為TCP服務進程的初始序號。
- ack:x + 1
-
TCP客戶
接收到TCP服務
的請求確認報文后,最后向服務器發送一個普通TCP確認報文段**(可以攜帶數據,也可以不攜帶,如果不攜帶數據,TCP客戶進程要發送的下一個數據報文段的seq依舊是x + 1,否則是x + 2)**,TCP客戶
進入連接已建立狀態。普通TCP確認報文段的關鍵參數:- ACK:1
- seq:x + 1
- ack:y + 1
-
TCP服務
在接收到普通TCP確認報文段后,就會進入連接已建立狀態。然后雙方基于已建立的連接,進行通信。
TCP服務和TCP客戶,初始都是關閉狀態,由TCP客戶去主動打開。
當TCP服務創建了傳輸控制塊后,進入監聽狀態
TCP客戶發送第一次握手的消息時,進入同步已發送狀態
TCP服務發送第二次握手的消息時,進入同步已接收狀態
TCP客戶發送第三次握手的消息時,進入連接已建立狀態
TCP服務接收到TCP客戶的最后一次握手消息,進入連接已建立狀態。
三報文握手,TCP客戶占兩次,TCP服務占一次。
??為什么TCP服務
在接收到TCP客戶
的連接請求報文段,并且向TCP客戶
發送連接請求確認報文段后**(二次握手),不是立刻進入連接已建立狀態,而是需要等待TCP服務
再次發送一個普通TCP確認報文段,才會進入連接已建立狀態?(三次握手)**
??假設使用二次握手,那么可能會存在如下圖的情況。所以TCP服務
需要等到TCP客戶
在接收到連接請求確認報文段后,再發送一個普通TCP確認報文段,才能進入連接已建立狀態。
二、TCP四報文揮手
??四報文揮手處于TCP的連接終止階段,是由TCP客戶
發起的。它的流程:
TCP客戶
主動關閉連接,發送TCP連接釋放報文段并進入終止等待1狀態,TCP連接釋放報文段的關鍵參數::- FIN:1
- ACK:1
- seq:u = TCP客戶進程傳送過的最后一個字節的序號 + 1
- ack:v = TCP客戶進程已收到的最后一個字節的序號 + 1
TCP服務
進程,在接收到TCP客戶
釋放連接的報文后,會發送一個普通的TCP確認報文段,并且自身進入關閉等待狀態。普通的TCP確認報文段的關鍵參數:- ACK:1
- seq:v
- ack:u + 1,作為對于TCP連接釋放報文段的確認
??這時的TCP連接處于半關閉狀態,也就是TCP客戶
已經沒有數據需要發送了,但是TCP服務
如果有數據需要發送,TCP客戶
還是需要接收的。
TCP客戶
在接收到確認報文段后,進入終止等待2狀態。等待TCP服務
發送TCP連接釋放報文段。(等到TCP服務
已經沒有數據要發送了)TCP服務
發送TCP連接釋放報文段,進入最后確認狀態,TCP連接釋放報文段的關鍵參數:- FIN:1
- ACK:1
- seq:w,因為在半關閉狀態下,TCP服務可能又發送了一些數據。
- ack:u + 1,對收到的TCP客戶的連接釋放報文的重復確認
TCP客戶
在接收到TCP服務
的連接釋放報文段后,發送TCP普通確認報文段,進入時間等待狀態。TCP普通確認報文段的關鍵參數:- ACK:1
- seq:u + 1,先前TCP客戶發送的連接釋放報文段,雖然不攜帶數據,但是要消耗一個序號。
- ack:w + 1,對收到的TCP服務連接釋放報文段的確認。
6. TCP服務
在接收到TCP客戶
的TCP普通確認報文段后,就進入關閉狀態,TCP服務
進程撤銷傳輸控制塊(是在建立連接時新建的)。TCP客戶
進程在經過2倍的msl后,才能進入關閉狀態,撤銷傳輸控制塊。
??TCP客戶在發送最后一個TCP普通確認報文段后,為什么不直接進入關閉狀態?如同下圖的場景
??關鍵點就在于,最后一次TCP客戶
發送的TCP普通確認報文段,可能存在丟失的問題。如果發生該問題,那么TCP
服務的超市重傳,TCP客戶
已經處于關閉狀態,是無法進行處理的。
TCP服務和TCP客戶,都是處于連接狀態,由TCP客戶去主動發起關閉。
TCP客戶發送第一次揮手的消息后,進入終止等待1狀態。
TCP服務發送第二次揮手的消息后,進入關閉等待狀態。
TCP客戶接收第二次揮手的消息后,進入終止等待2狀態。
TCP服務發送第三次揮手的消息后,進入最后確認狀態。
TCP客戶接收第三次揮手的消息后,并且發送第四次揮手,進入時間等待狀態,。
TCP服務接收第四次揮手的消息后,就進入關閉狀態,撤銷傳輸控制塊
TCP客戶進程在經過2倍的msl后,才能進入關閉狀態,撤銷傳輸控制塊。
四報文揮手,TCP客戶占兩次,TCP服務占兩次。
客戶端的狀態流轉:終止等待1 -> 終止等待2 -> 時間等待 -> 關閉
服務端的狀態流轉:關閉等待 -> 最后確認 -> 關閉
三、TCP保活計時器
??如果TCP連接建立后,客戶端出現了故障,那么服務端是如何知道客戶端發生故障的呢?
??TCP保活計時器
正是用于解決這樣的問題,**類似于注冊中心的心跳機制。**服務端在接收到客戶端的數據后,會重新設置并啟動保活計時器,假設TCP客戶出現問題,超過保活計時器的時限后仍然沒有發送數據,則服務端會發送一個TCP探測報文段,每隔75s發送一次,如果發送10次客戶端仍然沒有響應,TCP服務進程就確認客戶出現了故障,就斷開連接。