TCP標志位:
在TCP傳輸中,標志位用於表示特定的連接狀態或提供額外信息。每個標志位占用1比特。常用的TCP標志位包含以下幾種:
-
SYN
Synchronous,TCP三次握手建立連接的第一步,主動建立連接的一方發送SYN到被動建立連接一方。在下圖中可以看到,發送方的SYN被置為1

-
ACK Acknowledgement,用於表示成功收到一個包
-
PUSH Push,告訴接收方處理接受到的數據包而不是緩沖它們
-
FIN Finish,表示發送方將不再發送數據,通常用於表示發送方發送的最后一個包
-
RST Reset,當數據包被發送到預期之外的特定主機時,從接收方發送到發送方
-
URG Urgent,該標志為用於通知接收方優先處理當前包
除此之外還有ECE、ECE、NS等。
Sequence number && Acknowledgment number
建立連接時,發送方的Seq值是隨機的,wireshark工具默認會使用相對值,可以在編輯->首選項->協議一欄選擇TCP,進行開啟/關閉相對seq值:
Seq的值等於發送方的Ack,對於Ack的值,分以下三種情況:
-
三次握手建立連接期間,Ack的值是發送方的Seq值+1;
-
連接建立后,Ack的值等於發送方的Len值加上Seq值;
-
斷開連接時,Ack的值等於發送方的Seq值+1;

四次握手斷開連接

以上,圖片來自跟着動畫來學習TCP三次握手和四次揮手。
但使用wireshark捕獲到的斷開連接過程和上面略有差異,只有三次通訊,將被動關閉一方的兩次請求合並為一次:

2MSL
TCP協議規定,從主動斷開連接一方進入TIME_WAIT狀態到真正關閉TCP連接釋放Socket資源,最大需要等待2MSL(Max Segment Lifetime),即4分鍾。這樣可以確保新的連接不會收到上個連接遺留的數據包。但對於不同的實現,這個時長略有差異。
TCP/IP模型
TCP位於傳輸層,提供字節流服務(Byte Streaam Service),即將大塊數據分割為以報文段(segment)為單位的數據包進行管理。在網絡通訊中,數據包(package)是最小的傳輸單位,網絡層負責處理數據包。

以上,圖片來自報文段、數據報、數據包和幀一文,
小結
因為想要看Redis客戶端與服務器通訊的細節,而Redis通訊協議基於TCP,所以就有了這篇筆記。本文對於TCP做了簡要介紹,能夠滿足了解Redis通訊的需要。至於更多的TCP知識,若以后需要用到再行補充。
推薦閱讀
跟着動畫來學習TCP三次握手和四次揮手
理解TCP序列號(Sequence Number)和確認號(Acknowledgment Number)
TCP的三次握手、四次揮手--非常詳細講解
TCP Flags
報文段、數據報、數據包和幀