1. 程式人生 > >網路安全-->淺談TCP協議

網路安全-->淺談TCP協議

簡介

TCP-傳輸控制協議 報頭:

> 16位源埠號/16位目的埠號:表示資料從哪個程序來,到那個程序去
>     32位序號:
>     4位首部長度:表示該TCP報頭有多少個4位元組
>     6位保留:保留資料
>     6位標誌位:
>       URG:標識緊急指標是否有效
>       ACK:標識確認序號是否有效
>       PSH:用來提示接收端應用程式立刻將資料從TCP緩衝區取走
>       RST:要求重新建立連線(含有此標識的報文稱為**復位報文段**)
>       SYN:請求建立連線(含有此標識的報文稱為**同步報文段**)
>       FIN:通知對端,本端即將關閉(含有此標識的報文稱為**結束報文段**)
>     16位視窗大小:
>     16位校驗和:由傳送端填充,校驗形式有CRC校驗等。接收端校驗不通過,則認為資料有問題。(校驗包含TCP首部+TCP部分資料)
>     16位緊急指標:標識那部分資料是緊急資料

連線機制(三次握手,四次揮手)

建立連線

  • 第一次:Client-->Server Server端知道Client要建立連線
  • 第二次:Server-->Client Client端知道Server收到連線請求了
  • 第三次:Client-->Server Server知道Client端收到了自己的迴應

連線具體步驟:

  1、TCP伺服器程序建立傳輸控制塊TCB,準備接收客戶端的連線請求,伺服器狀態從CLOSE進入到LISTEN監聽狀態。
  2、TCP客戶端程序建立傳輸控制塊TCB,向伺服器發出連線請求報文,報文首部同步標記為SYN=1,同時選擇一個初始序列號seq=x。客戶端進入SYN-SENT
  同步已傳送狀態。(SYN同步段不能攜帶資料,必須消耗序列號)
  3、TCP服務端收到請求報文後,如果同意連線,則發出確認報文。確認報文ACK=1,SYN=1,確認序號x+1。同事服務端初始化一個序列號seq=y,服務端進入
  SYN-RCVD同步收到狀態
  4、TCP客戶端收到確認後,向服務端給出確認。確認報文ACK=1,確認序號y+1,客戶端序列號x+1
  5、建立連線,客戶端進入ESTABLISHED已建立連線狀態。服務端收到確認後也進入ESTABLISHED已建立連線狀態

斷開連線

  • 第一次:Client-->Server Server端知道Client要斷開連線
  • 第二次:Server-->Client Client端知道Server收到了斷開請求了
  • 第三次:Server-->Client Client端知道Server要斷開連線了
  • 第四次:Client-->Server Server端知道Client收到了斷開請求了
  1、客戶端發出連線釋放報文,停止傳送資料。釋放報文首部FIN=1,序列號seq=u=已經發送的最後一個位元組的序號+1,客戶端狀態進入**FIN-WAIT-1**終止
  等待1狀態。(不攜帶資料也要消耗序列號)      
  2、服務端收到連線釋放報文後,發出確認報文ACK=1,確認序號為u+1,自帶序列號seq=v。服務端進入**CLOSE-WAIT**關閉等待狀態
    TCP伺服器通知高層應用程序,客戶端向服務端的方向釋放了,這時候處於半關閉狀態,客戶端已經停止資料傳送,服務端若傳送資料,客戶端依然要接受。
    這個過程就是整個**CLOSE-WAIT**持續的時間。
  3、客戶端收到服務端的確認請求後,客戶端進入**FIN-WAIT2**終止等待2狀態。等待伺服器傳送連線釋放報文(在此之前客戶端還在接受服務端的資料)  
  4、服務端傳送完最後的資料後,向客戶端傳送連結釋放報文FIN=1,確認序號為v+1,自帶序號seq=w。(半關閉狀態服務端可能有傳送了一些資料)服務端
  進入LAST-ACK最後確認狀態。
  5、客戶端收到服務端的連線釋放報文後,發出確認報文ACK=1,確認序號為w+1,自帶序號u+1。客戶端進入**TIME-WAIT**時間等待狀態。經過2*MSL最長報文段
  壽命時間後,客戶端撤銷TCB進入**CLOSE**狀態,TCP斷開連線。
  6、伺服器收到客戶端的確認報文後,立即進入**CLOSE**狀態,撤銷TCB,斷開TCP連線。

2*MSL保證: 1、保證客戶端傳送的確認報文能夠到達伺服器端 2、防止新連接出現舊報文

問題: 如果已經建立連線,客戶端掛了怎麼辦? -- TCP設有一個保活計時器,服務端沒收到一次客戶端請求都會重置這個計時器。計時器時間一般都是2小時。若兩個小時內服務端沒有收到任何資料, 伺服器會發送一個探測報文段,之後每75分鐘發一次,累計0次任沒有反應則認為客戶端掛了,服務端就可以直接關閉連線了。

確認應答機制(ACK機制)

超時重傳機制

傳送端在一段時間間隔內沒有收到服務端的ACK確認,則會重新發送

滑動視窗

批量傳送請求 ACK實現

流量控制

視窗大小控制

擁塞控制

慢啟動機制

-- 傳送開始的時候,定義擁塞視窗大小為1
-- 每次收到ACK應答,擁塞視窗+1
-- 每次發包時,對比擁塞視窗和接收端反饋的視窗大小,取小值
-- 初始指數增長,到達一個閾值後線性增長
-- TCP開始啟動的時候,慢啟動閾值等於視窗最大值
-- 每次超時重發,閾值變成原來一半,擁塞視窗重置為1

延遲應答

  最大限度的保證網路不擁堵的情況下提高傳輸效率
  每隔N個包應答一次
  超過最大延遲時間應答一次
  一般N取2,最大延遲時間取200ms

捎帶應答

ACK和響應資料一期返回傳送端

面向位元組流

TCP的一個連線既有傳送緩衝區,也有接收緩衝區。對於這種一個連線即可讀資料也能寫資料叫全雙工模式。

粘包問題

定長的包按照固定長度讀取 變長的包可以在資料包頭部約定好一個總長欄位或者從程式碼層定義分隔符

TCP異常情況

機器斷電或網路斷開:接收端會進行reset

TCP保證的可靠性和高效能

  **可靠性:**
    1、校驗和
    2、序列號
    3、確認應答
    4、超時重傳
    5、連線管理
    6、流量控制
    7、擁塞控制
  **高效能:**
    1、滑動視窗
    2、高速重傳
    3、延遲應答
    4、捎帶應答
    
  定時器:
    1、超時重傳定時器
    2、保活定時器
    3、TIME-WAIT定時器

基於TCP常用協議

1、HTTP 2、HTTPS 3、SSH

參考文獻:https://blog.csdn.net/sinat_36629696/article/details/80740678

持續