02.29 加深理解TCP的三次握手與四次揮手

在瞭解三次握手和四次揮手之前,先要知道TCP報文內部包含了那些東西。熟悉瞭解TCP報文對日後學習網絡和排除方面有很大的幫助,所以,今天為了加深對三次握手的理解,從新去認識TCP報文格式。

加深理解TCP的三次握手與四次揮手

TCP報文格式

TCP報文詳解

TCP報文由首部和數據兩部分組成。首部一般由20-60字節(Byte),長度可變。其中前20B格式固定,後40B為可選。

因為,TCP報文還得傳給下層網絡層,封裝成IP包,而一個IP包最大長度為65535,同時IP包首部也包含最少20B,所以一個IP包或TCP包可以包含的數據部分最大長度為65535-20-20=65495B。

1、源端口號(Source Port)

長度為16位,指明發送數據的進程

2、目的端口(Destination Port)

長度為16位,指明目的主機接收數據的進程

3、序號(Sequence Number)

也稱為序列號,長度為32位,序號用來標識從TCP發送端向接入端發送的數據字節流進行編號,可以理解成對字節流的計數。

4、確認號

長度為32位,確認號包含發送確認的一端所期望收到的下一個序號。確認號只有在ACK標誌為1時才有效。

5、首部長度

長度為4位,用於表示TCP報文首部的長度。用4位(bit)表示,十進制值就是[0,15],一個TCP報文前20個字節是必有的,後40個字節根據情況可能有可能沒有。如果TCP報文首部是20個字節,則該位應是20/4=5

6、保留位(Reserved)

長度為6位,必須是0,它是為將來定義新用途保留的。

7、標誌(Code Bits)

長度為6位,在TCP報文中不管是握手還是揮手還是傳數據等,這6位標誌都很重要。6位從左到右依次為:

URG:緊急標誌位,說明緊急指針有效;

ACK:確認標誌位,多數情況下空,說明確認序號有效

PSH:推標誌位,置位時表示接收方應立即請求將報文交給應用層

RST:復位標誌,用於重建一個已經混亂的連接;

SYN:同步標誌,該標誌僅在三次握手建立TCP連接時有效

FIN:結束標誌,帶該標誌位的數據包用於結束一個TCP會話。

8、窗口大小(window Size)

長度為16位,TCP流量控制由連接的每一端通過聲明的窗口大小來提供。

9、檢驗和(Checksum)

長度為16位,該字段覆蓋整個TCP報文端,是個強制性的字段,是由發送端計算和存儲,到接收端後,由接收端進行驗證。

10、緊急指針(Urgent Pointer)

長度為16位,指向數據中優先部分的最後一個字節,通知接收方緊急數據的長度,該字段在URG標誌置位時有效

11、選項(Options)

長度為0-40B(字節),必須以4B為單位變化,必要時可以填充0。

12、數據

在瞭解TCP報文格式,通過捕捉一個TCP報文直觀感受一下。

加深理解TCP的三次握手與四次揮手

三次握手

建立TCP連接時,需要客戶端和服務器共發送3個包。

加深理解TCP的三次握手與四次揮手

1、客戶端主動打開,發送連接請求報文段,將SYN標識位置為1,Sequence Number置為x(TCP規定SYN=1時不能攜帶數據,x為隨機產生的一個值),然後進入SYN_SEND狀態。

2、服務器收到SYN報文段進行確認,將SYN標識位置為1,ACK置為1,Sequence Number置為y,Acknowledgment Number置為x+1,然後進入SYN_RECV狀態,這個狀態被稱為半連接狀態。

3、客戶端再進行一次確認,將ACK置為1(此時不用SYN),Sequence Number置為x+1,Acknowledgment Number置為y+1發向服務器,最後客戶端與服務器都進入ESTABLISHED狀態

為了加深對TCP三次握手的理解,抓包看一下TCP三次握手的過程。

加深理解TCP的三次握手與四次揮手

TCP三次握手

從抓包結果看來,整個過程符合TCP三次握手的預期:

  1. 客戶端發送SYN給服務端
  2. 服務端返回SYN+ACK給客戶端
  3. 客戶端確認,返回ACK給服務端

TCP四次揮手

TCP四次揮手則是TCP連接釋放的過程下面是TCP四次揮手的流程圖:

加深理解TCP的三次握手與四次揮手

當客戶端沒有數據再需要發送給服務端時,就需要釋放客戶端的連接,這整個過程為:

1、客戶端發送一個報文給服務端(沒有數據),其中FIN設置為1,Sequence Number置為u,客戶端進入FIN_WAIT_1狀態。

2、服務端收到來自客戶端的請求,發送一個ACK給客戶端,Acknowledge置為u+1,同時發送Sequence Number為v,服務端年進入CLOSE_WAIT狀態。

3、服務端發送一個FIN給客戶端,ACK置為1,Sequence置為w,Acknowledge置為u+1,用來關閉服務端到客戶端的數據傳送,服務端進入LAST_ACK狀態。

4、客戶端收到FIN後,進入TIME_WAIT狀態,接著發送一個ACK給服務端,Acknowledge置為w+1,Sequence Number置為u+1,最後客戶端和服務端都進入CLOSED狀態。

為了加深對TCP四次揮手的理解,抓包看一下TCP四次揮手的過程。

加深理解TCP的三次握手與四次揮手

為什麼三次握手和四次揮手?

三次握手時,服務器同時把ACK和SYN放在一起發送到了客戶端那裡。

四次揮手時,當收到對方的 FIN 報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方是否現在關閉發送數據通道,需要上層應用來決定,因此,己方 ACK 和 FIN 一般都會分開發送。


分享到:


相關文章: