天天看點

TCP的三次握手與四次揮手(面試佛腳篇)

作者:98dev

1、TCP頭部結構

在介紹三次握手與四次揮手之前我們先來了解一下TCP的頭部結構是什麼樣的。

TCP頭部的最大長度為60位元組,其中包括TCP封包固定長度20位元組+可變位元組(最大40位元組),具體結構如下:

TCP的三次握手與四次揮手(面試佛腳篇)

在認識三次握手與四次揮手之前我們必須要直到以下字段及含義:

序号:seq,占32位,用來辨別從發送端到接收端發送的位元組流。

确認号:ack,占32位,隻有ACK标志位為1時,确認序号字段才有效,ack=seq+1。

标志位:

SYN:發起一個新連接配接。

FIN:釋放一個連接配接。

ACK:确認序号有效。

在學習三次握手四次揮手後我們需要能流暢描述三次握手的流程及其中的字段含義作用的同時還需要記住每次握手時接收端和發送端的狀态。

2、三次握手

在三次握手中發送端有CLOSED、SYN-SENT、ESTABLISHED三種狀态,接收端有CLOSED、LISTEN、SYN-RCVD、ESTABLISHED四種狀态。

三次握手過程如下圖:

TCP的三次握手與四次揮手(面試佛腳篇)

假設發送端為用戶端,接收端為服務端。開始時用戶端和服務端的狀态都是CLOSE。

第一次握手:用戶端向服務端發起建立連接配接請求,用戶端會随機生成一個起始序列号x,用戶端向服務端發送的字段中包含标志位SYN=1,序列号seq=x。

第一次握手前用戶端的狀态為CLOSE,第一次握手後:用戶端的狀态為SYN-SENT,此時服務端的狀态為LISTEN。

第二次握手:服務端在收到用戶端發來的封包後,會随機生成一個服務端的起始序列号y,然後給用戶端回複一段封包,其中包括标志位SYN=1,ACK=1,序列号seq=y,确認号ack=x+1。

第二次握手前服務端的狀态為LISTEN,第二次握手後服務端的狀态為SYN-RCVD,此時用戶端的狀态為

SYN-SENT。

第三次握手:用戶端收到服務端發來的封包後,會再向服務端發送封包,其中包含标志位ACK=1,序列号seq=x+1,确認号ack=y+1。

第三次握手前用戶端的狀态為SYN-SENT,第三次握手後用戶端和服務端的狀态都為ESTABLISHED。

需要注意的一點是:

第一次握手,用戶端向服務端發起建立連接配接封包,會占一個序列号。

但是第三次握手,同樣是用戶端向服務端發送封包,這次卻不占序列号.

是以建立連接配接後,用戶端向服務端發送的第一個資料的序列号為x+1。

3、四次揮手

用戶端在四次揮手過程中有ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、CLOSED等五個狀态,服務端有ESTABLISHED、CLOSE-WAIT、LAST-ACK、CLOSED等四種狀态。

四次揮手過程如下圖:

TCP的三次握手與四次揮手(面試佛腳篇)

假設用戶端首先發起的斷開連接配接請求

第一次揮手:用戶端向服務端發送的資料完成後,向服務端發起釋放連接配接封包,封包包含标志位

FIN=1,序列号seq=u。此時用戶端隻能接收資料,不能向服務端發送資料。

第二次揮手:服務端收到用戶端的釋放連接配接封包後,向用戶端發送确認封包,包含标志位ACK=1,序列号seq=v,确認号ack=u+1。此時用戶端到服務端的連接配接已經釋放掉,用戶端不能像服務端發送資料,服務端也不能向用戶端發送資料。但服務端到用戶端的單向連接配接還能正常傳輸資料。

第三次揮手:服務端發送完資料後向用戶端發出連接配接釋放封包,封包包含标志位FIN=1,标志位ACK=1,序列号seq=w,确認号ack=u+1。

第四次揮手:用戶端收到服務端發送的釋放連接配接請求,向服務端發送确認封包,包含标志位ACK=1,序列号seq=u+1,确認号ack=w+1。

4、為什麼TCP連接配接的時候是三次?兩次是否可以?

答:不可以,主要從以下兩方面考慮(假設用戶端是首先發起連接配接請求):

假設建立TCP連接配接僅需要兩次握手,那麼如果第二次握手時,服務端傳回給用戶端的确認封包丢失了,用戶端這邊認為服務端沒有和他建立連接配接,而服務端卻以為已經和用戶端建立了連接配接,并且可能服務端已經開始向用戶端發送資料,但用戶端并不會接收這些資料,浪費了資源。如果是三次握手,不會出現雙方連接配接還未完全建立成功就開始發送資料的情況。

如果服務端接收到了一個早已失效的來自用戶端的連接配接請求封包,會向用戶端發送确認封包同意建立TCP連接配接。但因為用戶端并不需要向服務端發送資料,是以此次TCP連接配接沒有意義并且浪費了資源。

5、為什麼TCP連接配接的時候是三次,關閉的時候卻是四次?

答:因為需要確定通信雙方都能通知對方釋放連接配接。

假設用戶端發送完資料向服務端發送釋放連接配接請求,當用戶端并不知道,服務端是否已經發送完資料,是以此次斷開的是用戶端到服務端的單向連接配接。

服務端傳回給用戶端确認封包後,服務端還能繼續單向給用戶端發送資料。

當服務端發送完資料後還需要向用戶端發送釋放連接配接請求。

用戶端傳回确認封包,TCP連接配接徹底關閉。

是以斷開TCP連接配接需要用戶端和服務端分别通知對方并分别收到确認封包,一共需要四次。

6、TIME_WAIT和CLOSE_WAIT的差別在哪?

答:預設用戶端首先發起斷開連接配接請求,從上圖可以看出:

CLOSE_WAIT是被動關閉形成的,當用戶端發送FIN封包,服務端傳回ACK封包後進入CLOSE_WAIT。

TIME_WAIT是主動關閉形成的,當第四次揮手完成後,用戶端進入TIME_WAIT狀态。

7、為什麼用戶端發出第四次揮手的确認封包後要等2MSL的時間才能釋放TCP連接配接?

答:其中MSL的意思是封包的最長壽命,可以從兩方面考慮:

用戶端發送第四次揮手中的封包後,再經過2MSL,可使本次TCP連接配接中的所有封包全部消失,不會出現在下一個TCP連接配接中。

考慮丢包問題,如果第四揮手發送的封包在傳輸過程中丢失了,那麼服務端沒收到确認ack封包就會重發第三次揮手的封包。如果用戶端發送完第四次揮手的确認封包後直接關閉,而這次封包又恰好丢失,則會造成服務端無法正常關閉。

可靠的實作TCP全雙工連接配接的終止;

允許老的重複分節在網絡中消逝。

8、如果已經建立了連接配接,但是用戶端突然出現故障了怎麼辦?

答:如果TCP連接配接已經建立,在通信過程中,用戶端突然故障,那麼服務端不會一直等下去,過一段時間就關閉連接配接了。具體原理是TCP有一個保活機制,主要用在伺服器端,用于檢測已建立TCP連結的用戶端的狀态,防止因用戶端崩潰或者用戶端網絡不可達,而伺服器端一直保持該TCP連結,占用伺服器端的大量資源(因為Linux系統中可以建立的總TCP連結數是有限制的)。

保活機制原理:設定TCP保活機制的保活時間keepIdle,即在TCP連結超過該時間沒有任何資料互動時,發送保活探測封包;設定保活探測封包的發送時間間隔keepInterval;設定保活探測封包的總發送次數keepCount。如果在keepCount次的保活探測封包均沒有收到用戶端的回應,則伺服器端即關閉與用戶端的TCP連接配接。

9、三次握手過程中可以攜帶資料嗎?

答:第三次握手的時候可以攜帶資料的,第一次、第二次握手不可以攜帶資料。

假如第一次握手可以攜帶資料的話,如果有人要惡意攻擊伺服器,那他每次都在第一次握手中的 SYN 封包中放入大量的資料,然後瘋狂着重複發 SYN 封包的話,這會讓伺服器花費很多時間、記憶體空間來接收這些封包。也就是說,第一次握手不可以放資料,其中一個簡單的原因就是會讓伺服器更加容易受到攻擊了。

第一次、第二次握手都有SYN封包是以第一次、第二次握手都不可以攜帶資料。

而對于第三次的話,此時用戶端已經處于 ESTABLISHED 狀态。對于用戶端來說,他已經建立起連接配接了,并且也已經知道伺服器的接收、發送能力是正常的了,是以能攜帶資料也沒啥毛病。

10、各種狀态的含義

CLOSED:不在連接配接狀态(這是為友善描述假想的狀态,實際不存在)

LISTEN:等待從任何遠端TCP 和端口的連接配接請求。

SYN_SENT:發送完一個連接配接請求後等待一個比對的連接配接請求。

SYN_RCVD:發送連接配接請求并且接收到比對的連接配接請求以後等待連接配接請求确認。

ESTABLISHED:表示一個打開的連接配接,接收到的資料可以被投遞給使用者。連接配接的資料傳輸階段的正常狀态。

FIN_WAIT_1:等待遠端TCP 的連接配接終止請求,或者等待之前發送的連接配接終止請求的确認。

CLOSE_WAIT:等待本地使用者的連接配接終止請求。

FIN_WAIT_2:等待遠端TCP 的連接配接終止請求。

LAST_ACK:等待先前發送給遠端TCP 的連接配接終止請求的确認(包括它位元組的連接配接終止請求的确認)。

CLOSING:等待遠端TCP 的連接配接終止請求确認。

TIME_WAIT:等待足夠的時間過去以確定遠端TCP 接收到它的連接配接終止請求的确認。

原作者:abcccode      
源連結:https://blog.csdn.net/apple_51673523/article/details/129410551      
編輯:IT運維技術圈      

*******波哥福利區*******

騰訊雲:

新使用者騰訊雲服務産品一折購買入口

https://url.cn/0TJSTg08

華為雲:

凡是華為雲新使用者,且首次購買産品,實付款大于200元且小于2000元(以華為雲官網優惠價為準),來源資訊填寫波哥後。再享受折上7折活動,填寫表單添加小助手擷取活動參與方式(華為雲活動産品可從表單内連結進入檢視)

http://vzsbrr4yp4xvw6n0.mikecrm.com/rf5aA1E

波哥
IT行業近二十年的IT老炮。常年潛伏于國企、各一二線大廠中。硬體內建入行,直至虛拟技術、容器化。崗位曆經系統內建、DBA、全棧開發、sre、項目經理、産品經理、部門總監。
主要作品:
  • IT類資源彙聚門戶:https://www.98dev.com
  • 各大短視訊平台:98dev
  • 各大主要技術論壇部落格:IT運維技術圈
  • 長視訊教學作品:《波哥講網絡》《波哥講git》《波哥講gitlab》
  • 小程式:IT面試精選
  • 建構技術社群:+V itboge1521 入學習交流群