一、tcp協議格式

1. 源端口號 :
發送方使用的端口號
2. 目的端口號 :
接收方使用的端口號
3. 序號:
數據包編號 , tcp 協議為每個數據都設置編號,用于確認是否接收到相應的包
4. 確認序列號 :
使用 tcp 協議接收到數據包,會根據這個接收到這個數據包編號發送一個應答包,一般為上一次的數據包的編號加上長度,如果是 SYN或者FIN ,則是上一次的數據包的編號 加1
5. 標志位: 用于標識
URG: 表示緊急指針是否有效ACK : 表示確認號是否有效。稱攜帶ACK標志的tcp報文段位確認報文段PSH : 提示接收端應用程序應該立即從tcp接受緩沖區中讀走數據,為接受后續數據騰出空間(如果應用程序不將接收的數據讀走,它們就會一直停留在tcp緩沖區中)
RST: 表示要求對方重新建立連接。攜帶RST標志的tcp報文段為復位報文段。
SYN: 表示請求建立一個連接。攜帶SYN標志的tcp報文段為同步報文段。
FIN: 表示通知對方本端要關閉連接了。攜帶FIN標志的tcp報文段為結束報文段。
6. 窗口大小:
用于 tcp 進行流量控制,這里的窗口用于向發送端說明當前 tcp 接收緩沖區還能存儲的數據大小
7. 校驗和:
用于接收端用于校驗接收的數據是否正確,由發送端進行填充,計算校驗和主要包括 tcp 協議頭與數據區校驗的方式為 CRC 校驗
二、tcp三次握手
1. 設置 wireshark 使用絕對數據包編號
?
?2. 選擇網卡,并設置tcp端口過濾,開啟抓包
?3. 啟動tcp服務器,并使用網絡調試助手連接服務器
?
?4. 查看抓包結果
?第一次握手 : 客戶端給服務器發送 SYN 數據包
Flags標志設置為 SYN ,數據包編號為 2968294989
第二次握手 : 服務器給客戶端發送 SYN + ACK 的數據包
?
?
Flags 標志: 設置為 SYN + ACK
數據包應答編號為 2968294990,相當是 SEQ_SYN + 1
數據包編號為 672472624
第三次握手 : 客戶端給服務器發送 ACK 數據包
?
Flags 標志 : ACK
數據包應答編號為 672472625,是第二個數據包的編號加1
數據包編號為 2968294990
?三、tcp 四次揮手
TCP(傳輸控制協議)的四次揮手是用于關閉一個已經建立的TCP連接的過程。它確保了數據的可靠傳輸,并且能夠讓雙方安全地斷開連接。以下是四次揮手的詳細過程:
1.?第一次揮手(FIN):主動方發起關閉請求
-
操作:假設客戶端(A)想要關閉連接,它會發送一個帶有
FIN
標志的TCP報文給服務器(B)。這個FIN
報文表示客戶端已經沒有數據要發送了,但仍然可以接收來自服務器的數據。 -
狀態變化:客戶端進入
FIN_WAIT_1
狀態,等待服務器的響應。
2.?第二次揮手(ACK):被動方確認關閉請求
-
操作:服務器(B)收到客戶端(A)的
FIN
報文后,會發送一個帶有ACK
標志的TCP報文作為確認。這個ACK
報文的確認號是客戶端FIN
報文序列號加1,表示服務器已經收到了客戶端的關閉請求。 -
狀態變化:客戶端收到
ACK
后,進入FIN_WAIT_2
狀態;服務器進入CLOSE_WAIT
狀態。此時,服務器可能還有數據要發送給客戶端。
3.?第三次揮手(FIN):被動方發起關閉請求
-
操作:當服務器(B)完成數據發送后,它會發送一個帶有
FIN
標志的TCP報文給客戶端(A),表示服務器也沒有數據要發送了,希望關閉連接。 -
狀態變化:服務器進入
LAST_ACK
狀態,等待客戶端的最終確認。
4.?第四次揮手(ACK):主動方確認關閉請求
-
操作:客戶端(A)收到服務器(B)的
FIN
報文后,會發送一個帶有ACK
標志的TCP報文作為確認,確認號是服務器FIN
報文序列號加1。此時,客戶端進入TIME_WAIT
狀態,等待2個最大報文段壽命(2MSL)的時間,以確保最后一個ACK
報文能夠被服務器收到。 -
狀態變化:服務器收到客戶端的
ACK
后,進入CLOSED
狀態,完成關閉過程。客戶端在2MSL時間后也進入CLOSED
狀態。
為什么需要四次揮手
-
確保數據完整傳輸:TCP是一個面向連接的協議,需要確保數據的可靠傳輸。四次揮手確保了雙方都明確知道對方已經沒有數據要發送,并且雙方都收到了對方的關閉請求。
-
防止資源泄露:通過四次揮手,可以優雅地關閉連接,釋放系統資源,避免連接長時間占用資源。
TIME_WAIT 狀態的作用
-
確保最后一個ACK報文能夠被對方收到:在第四次揮手時,客戶端發送的
ACK
報文可能會丟失。服務器在等待ACK
超時后會重新發送FIN
報文。客戶端進入TIME_WAIT
狀態后,可以重新發送ACK
,確保連接能夠正確關閉。 -
防止老的連接干擾新的連接:在2MSL時間內,網絡中可能還殘留著舊連接的報文。
TIME_WAIT
狀態可以防止這些報文干擾新的連接。
TCP四次揮手是TCP協議中非常重要的機制,它確保了連接的可靠關閉,是TCP協議可靠性的關鍵體現之一。