在瞭解三次握手和四次揮手之前,先要知道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連接時,需要客戶端和服務器共發送3個包。
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三次握手的預期:
- 客戶端發送SYN給服務端
- 服務端返回SYN+ACK給客戶端
- 客戶端確認,返回ACK給服務端
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四次揮手的過程。
為什麼三次握手和四次揮手?
三次握手時,服務器同時把ACK和SYN放在一起發送到了客戶端那裡。
四次揮手時,當收到對方的 FIN 報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方是否現在關閉發送數據通道,需要上層應用來決定,因此,己方 ACK 和 FIN 一般都會分開發送。
閱讀更多 攻城獅成長日記 的文章