TCP詳解

1. TCP

1.1 概念

  • 面向鏈接、可靠的基於字節流的傳輸協議。
  • 將應用層的的數據分割成報文段併發送給目標節點的 TCP 層
  • 每一個數據包都有相對應的序號,對方收到後就發送 ACK 確認,未收到就重傳
  • 使用校驗和來檢測傳輸過程當中是否出現錯誤

1.2 TCP 報文頭

TCP 報文頭

1.3 TCP 報文頭字段含義

1. Source Port和Destination Port:

分別佔用16位,表示源端口號和目的端口號,用於區別主機中的不一樣進程, 而IP地址是用來區分不一樣的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能惟一 的肯定一個TCP鏈接。編程

2. Sequence Number:

用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據 字節在數據流中的序號;主要用來解決網絡報文亂序的問題。安全

3. Acknowledgment Number:

32位確認序列號包含發送確認的一端所指望收到的下一個序號,所以,確認序號應 當是上次已成功收到數據字節序號加1。不過,只有當標誌位中的ACK標誌(下面介紹)爲1時該確認序列號的字 段纔有效。主要用來解決不丟包的問題。服務器

4. Offset:

給出首部中32 bit字的數目,須要這個值是由於任選字段的長度是可變的。這個字段佔4bit(最多能 表示15個32bit的的字,即4*15=60個字節的首部長度),所以TCP最多有60字節的首部。然而,沒有任選字段, 正常的長度是20字節。cookie

5. TCP Flags:

TCP首部中有6個標誌比特,它們中的多個可同時被設置爲1,主要是用於操控TCP的狀態機的,依次 爲URG,ACK,PSH,RST,SYN,FIN。每一個標誌位的意思以下:網絡

  • URG:此標誌表示TCP包的緊急指針域(後面立刻就要說到)有效,用來保證TCP鏈接不被中斷,而且督促 中間層設備要儘快處理這些數據。併發

  • ACK 此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1, 爲1的時候表示應答域有效,反之爲0。socket

  • PSH:這個標誌位表示Push操做。所謂Push操做就是指在數據包到達接收端之後,當即傳送給應用程序, 而不是在緩衝區中排隊。tcp

  • RST:這個標誌表示鏈接復位請求。用來複位那些產生錯誤的鏈接,也被用來拒絕錯誤和非法的數據包。線程

  • SYN:表示同步序號,用來創建鏈接。SYN標誌位和ACK標誌位搭配使用,當鏈接請求的時候,SYN=1, ACK=0;鏈接被響應的時候,SYN=1,ACK=1;這個標誌的數據包常常被用來進行端口掃描。掃描者發送 一個只有SYN的數據包,若是對方主機響應了一個數據包回來 ,就代表這臺主機存在這個端口;可是因爲這 種掃描方式只是進行TCP三次握手的第一次握手,所以這種掃描的成功表示被掃描的機器不很安全,一臺安全 的主機將會強制要求一個鏈接嚴格的進行TCP的三次握手。3d

  • FIN:表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據能夠傳送了,發送FIN標誌 位的TCP數據包後,鏈接將被斷開。這個標誌的數據包也常常被用於進行端口掃描。

6. Window:

滑動窗口大小 (流量控制)。

7. 校驗和:

奇偶校驗,此校驗和是對整個的 TCP 報文段,包括 TCP 頭部和 TCP 數據,以 16 位字進行計算所得。由發送端計算和存儲,並由接收端進行驗證。

8. 緊急指針:

只有當 URG 標誌置 1 時緊急指針纔有效。緊急指針是一個正的偏移量,和順序號字段中的值相加表示緊急數據最後一個字節的序號。 TCP 的緊急方式是發送端向另外一端發送緊急數據的一種方式。

9. 選項和填充:

最多見的可選字段是最長報文大小,又稱爲MSS(Maximum Segment Size),每一個鏈接方一般都在通訊的第一個報文段(爲創建鏈接而設置SYN標誌爲1的那個段)中指明這個選項,它表示本端所能接受的最大報文段的長度。選項長度不必定是32位的整數倍,因此要加填充位,即在這個字段中加入額外的零,以保證TCP頭是32的整數倍。

10. 數據部分:

TCP 報文段中的數據部分是可選的。在一個鏈接創建和一個鏈接終止時,雙方交換的報文段僅有 TCP 首部。若是一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多狀況中,也會發送不帶任何數據的報文段。

2. 三次握手

2.1 緣由

爲何須要三次握手:

  • IP 是位於網絡層的無鏈接的通信協議,IP 協議只負責將 IP 包送往發送給目的地,但不確保發送到目的地,因此在傳輸層採用有鏈接的方式,來確保數據的送 達。

2.2 概念

所謂三次握手是指創建一個 TCP 鏈接時須要客戶端和服務器端總共發送三個包以確認鏈接的創建。在socket編程中,這一過程由客戶端執行connect來觸發。

2.3 三次握手的流程圖

三次握手的流程圖

2.4 流程圖的解釋

  • 第一次握手:客戶端將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給服務器端,客戶端進入SYN_SENT狀態,等待服務器端確認。
  • 第二次握手:服務器端收到數據包後由標誌位SYN=1知道客戶端請求創建鏈接,服務器端將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給客戶端以確認鏈接請求,服務器端進入SYN_RCVD狀態。
  • 第三次握手:客戶端收到確認後,檢查ack是否爲J+1,ACK是否爲1,若是正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給服務器端,服務器端檢查ack是否爲K+1,ACK是否爲1,若是正確則鏈接創建成功,客戶端和服務器端進入ESTABLISHED狀態,完成三次握手,隨後客戶端與服務器端之間能夠開始傳輸數據了。

2.5 安全隱患

2.5.1 首次握手 —— SYN 超時

在 Server 收到 Client 的 SYN 以後,回覆 SYN-ACK 的時候未收到 ACK 確認,致使服務端不斷重試,直到超時。

2.5.2 SYN Flood 攻擊

惡意程序會在短期對服務器不斷髮起創建鏈接請求,但不響應服務器請求,致使服務器不斷重發,佔用資源,致使崩潰。

2.5.3 應對 SYN Flood 攻擊的方式
  • SYN 隊列滿後,經過 tcp_syncookies 參數回發 SYN Cookie
  • 若爲正常鏈接,則 Client 會回發 SYN Cookie,創建鏈接

2.6 創建鏈接後,Client 故障

2.6.1 保活機制

向 Client 發送探測報文,若是未收到響應則繼續發送,直到收到響應或達到保活探測數時,中斷鏈接。

3. 四次揮手

3.1 緣由

因爲TCP鏈接是全雙工的,所以,每一個方向都必需要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的鏈接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,可是在這個TCP鏈接上仍然可以發送數據,直到這一方向也發送了FIN。

3.2 概念

四次揮手即終止TCP鏈接,就是指斷開一個TCP鏈接時,須要客戶端和服務端總共發送4個包以確認鏈接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發。

3.3 四次揮手流程圖

四次揮手流程圖

3.4 爲何客戶端發送完最後一個 ACK 包以後還須要 TIME-WAIT

  • 確保有足夠的時間讓對方接收到 ACK 包
  • 避免新舊鏈接混淆

3.5 服務器出現大量 CLOSE-WAIT 狀態的緣由

客戶端關閉 socket 鏈接,服務端忙於處理讀或寫,沒有及時關閉鏈接

  • 檢查代碼,特別是資源釋放代碼
  • 檢查配置,特別是處理請求的線程配置

4. TCP 滑動窗口

4.0 必知必會

RTT

發送數據包到收到對應的 ACK,中間所花費的時間

RTO

重傳時間間隔(通過 RTT 計算獲得)

4.1 滑動窗口的做用

TCP 使用滑動窗口作流量控制和亂序重排

相關文章
相關標籤/搜索