在TCP傳輸中,標誌位用於表示特定的鏈接狀態或提供額外信息。每一個標誌位佔用1比特。經常使用的TCP標誌位包含如下幾種:html
SYN服務器
Synchronous,TCP三次握手創建鏈接的第一步,主動創建鏈接的一方發送SYN到被動創建鏈接一方。在下圖中能夠看到,發送方的SYN被置爲1網絡
ACK Acknowledgement,用於表示成功收到一個包tcp
PUSH Push,告訴接收方處理接受到的數據包而不是緩衝它們工具
FIN Finish,表示發送方將再也不發送數據,一般用於表示發送方發送的最後一個包post
RST Reset,當數據包被髮送到預期以外的特定主機時,從接收方發送到發送方學習
URG Urgent,該標誌爲用於通知接收方優先處理當前包動畫
除此以外還有ECE、ECE、NS等。spa
創建鏈接時,發送方的Seq值是隨機的,wireshark工具默認會使用相對值,能夠在編輯->首選項->協議一欄選擇TCP,進行開啓/關閉相對seq值:.net
Seq的值等於發送方的Ack,對於Ack的值,分如下三種狀況:
三次握手創建鏈接期間,Ack的值是發送方的Seq值+1;
鏈接創建後,Ack的值等於發送方的Len值加上Seq值;
斷開鏈接時,Ack的值等於發送方的Seq值+1;
以上,圖片來自跟着動畫來學習TCP三次握手和四次揮手。
但使用wireshark捕獲到的斷開鏈接過程和上面略有差別,只有三次通信,將被動關閉一方的兩次請求合併爲一次:
TCP協議規定,從主動斷開鏈接一方進入TIME_WAIT狀態到真正關閉TCP鏈接釋放Socket資源,最大須要等待2MSL(Max Segment Lifetime),即4分鐘。這樣能夠確保新的鏈接不會收到上個鏈接遺留的數據包。但對於不一樣的實現,這個時長略有差別。
TCP位於傳輸層,提供字節流服務(Byte Streaam Service),即將大塊數據分割爲以報文段(segment)爲單位的數據包進行管理。在網絡通信中,數據包(package)是最小的傳輸單位,網絡層負責處理數據包。
以上,圖片來自報文段、數據報、數據包和幀一文,
由於想要看Redis客戶端與服務器通信的細節,而Redis通信協議基於TCP,因此就有了這篇筆記。本文對於TCP作了簡要介紹,可以知足瞭解Redis通信的須要。至於更多的TCP知識,若之後須要用到再行補充。
跟着動畫來學習TCP三次握手和四次揮手
理解TCP序列號(Sequence Number)和確認號(Acknowledgment Number)
TCP的三次握手、四次揮手--很是詳細講解
TCP Flags
報文段、數據報、數據包和幀