天天看點

tcp三次握手和四次揮手的全過程_加深了解TCP的三次握手與四次揮手TCP封包詳解三次握手TCP四次揮手為什麼三次握手和四次揮手?

在了解三次握手和四次揮手之前,先要知道TCP封包内部包含了那些東西。熟悉了解TCP封包對日後學習網絡和排除方面有很大的幫助,是以,今天為了加深對三次握手的了解,從新去認識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的三次握手與四次揮手TCP封包詳解三次握手TCP四次揮手為什麼三次握手和四次揮手?

三次握手

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

tcp三次握手和四次揮手的全過程_加深了解TCP的三次握手與四次揮手TCP封包詳解三次握手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封包詳解三次握手TCP四次揮手為什麼三次握手和四次揮手?

TCP三向交握

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

  1. 用戶端發送SYN給服務端
  2. 服務端傳回SYN+ACK給用戶端
  3. 用戶端确認,傳回ACK給服務端

TCP四次揮手

TCP四次揮手則是TCP連接配接釋放的過程。下面是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三次握手和四次揮手的全過程_加深了解TCP的三次握手與四次揮手TCP封包詳解三次握手TCP四次揮手為什麼三次握手和四次揮手?

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

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

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

繼續閱讀