天天看點

TCP 三次握手TCP

TCP

        TCP是傳輸控制協定(Transmission Control Protocol),它是常用的面向連接配接的協定,通常和IP一起使用。

TCP中常見的頭部标志

  1. URG: 表明應該檢查報頭中的緊急指針部分 
  2. ACK:  表明應該檢查報頭中的确認序列号部分
  3. FSH:  表示接收者應該盡快将資料向下層傳遞
  4. RST:  指明應該重置連接配接
  5. SYN:  初始化一個連接配接
  6. NE:    顯式擁塞通知(ECN)隐蔽性保護
  7. CWR: 擁塞視窗減少标志表示資料包的ECE标志已被設定,而且擁塞控制已應答
  8. ECE:   如果SYN标志設為1,這個标志表示TCP通信的一方支援ECN。如果SYN設定為0,則表示收到的IP報頭中的擁塞通知被設定
  9. FIN:   指明發送者(可以是連接配接的另一方)已經将資料發送完畢

TCP 連接配接

        TCP是全雙工(full-duplex)的協定。建立一個TCP連接配接的過程稱為三次握手(three-way handshake)。

        由于是面向連接配接的協定,在建立TCP連接配接時,會發生一個特定的過程。在該過程中,存在許多TCP連接配接的狀态。要發起通信的一方(用戶端)會在發送的TCP封包中設定SYN标志,初始化序列号(Initial Sequence Number,ISN)以及它要通信的另一方的端口号,通常連接配接的另一方是伺服器。該封包通常被稱為SYN資料包或者SYN封包段,此時該TCP連接配接處于SYN_SENT狀态。

        此連接配接的伺服器一端會發送一個同時設定了SYN和ACK标志位的TCP封包段作為回應。此外,伺服器還會将确認序列号設定為用戶端所發送的序列号加一。該封包通常被稱為SYN+ACK資料包,此時該TCP連接配接處于SYN_RCVD狀态。

        接下來,用戶端會響應SYN-ACK資料報,發送一個設定了ACK标志的響應封包,并且發送的确認序列号為SYN-ACK序列号加一的封包段。至此,三次握手已經結束,該連結已經建立,進入ESTABLISHED狀态。

        與初始化連接配接的協定(這裡的協定指建立連接配接的過程)相對應,還有一個終止連接配接的過程。用于終止TCP連接配接的過程與建立連接配接的散步相對,共有四個步驟。多出的一個步驟來自于TCO連接配接的全雙工特性,是以任何一邊都有可能在任何時候發送資料。

        通過發送設定了FIN标志的TCP封包段,TCP連接配接的某一方可以關閉該方向上的連接配接。連接配接的任何一方都可以發送FIN标志,以表明它已經将資料發送完畢。而連接配接的另一方則可以繼續發送資料。然而,實際上,當FIN被接收時,連接配接的終止過程将開始,下面,我将想要終止連接配接的一方設定為用戶端。

        終止過程從用戶端發用FIN标志的封包開始,此時服務端的狀态為CLOSE_WAIT,而用戶端的狀态為FIN_WAIT_1。在伺服器接收到FIN後,服務端将向用戶端回複ACK包,同時序列号加一。此時,用戶端進入FIN_WAIT_2階段。服務端同時向它的高層協定指出連接配接已終止。接下來,服務端關閉連接配接,這會導緻一個設定了FIN标志位的封包被發送到用戶端,而服務端進入LAST_ACK狀态,而用戶端進入TIME_WAIT狀态。最後,用戶端發送封包段以确認此FIN标志(發送ACK封包段為服務端,序列号加一),然後連接配接便進入了CLOSED狀态。

        TCP連接配接序列中有一個可選擇部分是最大封包段長度(Maximum  Segment  Size,MSS)。MSS是通信的雙方各自所能接收的最大的資料塊大小。由于MSS是連接配接的雙方所能接受的最大大小,通常發送比MSS小一些的資料塊更合适。一般而言,我們應該考慮使用一個大一些的MSS,然後牢記應避免分片,分片會在IP層進行,分片會增加系統開銷。

為什麼建立連接配接不是兩次或者四次握手?

    如果兩次握手,即用戶端發送SYN請求連接配接信号,伺服器接收信号後發送SYN+ACK應答信号,用戶端與服務端建立連接配接。如果遇到用戶端的請求信号發生延遲現象,或者已經失效的連接配接請求突然又發送收到了用戶端,産生錯誤。

    如果四次握手,即三次握手之後,服務端再次給用戶端發送ACK信号,則服務端資源會被浪費。是以三次握手是能夠建立安全連接配接的最少次數。

TCP終止連接配接時是四次握手:

第一次握手:用戶端已經發送完資料,并且知道服務端已經接收完資料,想要終止連接配接,給服務端發送FIN終止信号。

第二次握手:服務端接收到終止信号後,會發送一個ACK确認收到的應答信号,但是由于服務端的資料還在發送中,是以無法在接收到終止連接配接請求時立即終止連接配接。

第三次握手:服務端等到資料發送完畢後,會發送FIN終止連接配接信号給用戶端。

第四次握手:用戶端接收到FIN信号後,知道服務端資料發送完畢,發送ACK确認收到信号。用戶端等待2MSL後,如果沒有收到服務端傳來的任何消息,就表明服務端已經收到确認消息,用戶端關閉連接配接,服務端也關閉連接配接。

用戶端為什麼要等待2MSL?

       在用戶端第四次握手時發送ACK後,信号有可能丢失,如果服務端沒有收到ACK,将會不斷的發送FIN信号。是以用戶端并不能在發送了ACK信号後就立即關閉,它必須确認服務端收到了ACK信号。用戶端在發送ACK信号後進入到TIME_WAIT狀态,且會設定一個計時器,等待2MSL的時間段。如果在該時間内再次收到FIN,則用戶端會重發ACK信号并再次等待2SML時間。如果等待期間一直沒有收到FIN,則可以推斷服務端已經成功接收ACK信号,結束連接配接。MSL(Maximum Segment Lifetime)是一個信号在網絡中最大的存活時間。2MSL是一個信号發送和回複所需的最大時間。

繼續閱讀