TCP協議原理與格式初探


可靠數據傳輸原理

如何在一條不可靠的信道上得到可靠的傳輸?
不可靠的原因:可能出現比特差錯、丟包

停等傳輸下的情況

從簡單到難的情況一步步分析:

1.經過完全可靠信道的可靠數據傳輸

這時只需要一發一收,值得注意的是:發送端的發送動作是由上層(應用層)觸發,接收端的接收動作是由下層(網絡層)觸發

2.經具有比特差錯信道的可靠數據傳輸

既然可能出現比特差錯,那首先要能檢測出比特差錯,這可以用校驗和的方法
當接收端檢測到比特差錯,應該向發送端反饋出錯了(NAK),發送端再重新發送直到沒有錯誤(即使無錯誤也要反饋接受無誤(ACK)),注意反饋時也要用到校驗和
這里又出現了問題,沒有辦法保證發送端反饋的信息無差錯傳輸(反饋信息也可能出現錯誤,表現為校驗和錯誤,不過錯誤背后的信息即可能是NAK也可能是ACK),因此發送端為了保證萬無一失,只要收到的反饋有錯誤,就重新發送該分組
然然然而,數據運輸是許多個分組,一個接着一個,然后想到如果是ACK分組受損,發送端重傳分組,會導致接收端錯把重傳分組當成新分組,所以必須區分一前一后兩個分組,這可以通過在分組前增加0/1來解決(0/1對應一前一后)

3.經具有比特差錯的丟包信道的可靠數據傳輸

先考慮丟包的后果,丟包會導致接收端無回應,因此發送端可以選定一個時長,當發送分組在經過此時長后就判定發生丟包,隨后重傳分組,具體操作是設定一個定時器

流水線傳輸

上面討論的傳輸都是停等傳輸,即發送端收到一個確定,發送一個分組,要想提高效率,可以允許發送端發送多個分組而無需等待確認,一回合發送多個分組后必須要做的工作有:增加序號范圍,緩存多個分組,此外對於如何處理丟失、損壞和超時,有兩種方法:

1.回退N步(Go-Back-N,GBN)協議

發送端:維護一個發送窗口,[Send Base,SendBase+N-1],窗口已滿時拒絕上層調用,累計確認ACK(序號n),定時器
接收端:按序接受,累計確認,丟棄亂序包並反饋
丟棄一個正確接受的分組的缺點是最后對該分組的重傳也許會丟失或出錯,因此需要更多的重傳

2.選擇重傳(Selective Repeat,SR)

發送端:每個分組一個單獨一個定時器,采用單個確認
接收端:維護一個接收窗口,[rcv_base,rcv_base+N-1],用來緩存失序的分組
收到序號在小於現在 一個窗口大小范圍內 的分組,必須產生一個ACK
發送端和接收端的窗口並不總是一致,最大錯位一個窗口,所以序號范圍有限時,為了避免對一個序號的含義混淆(重傳/新分組),窗口長度必須小於或等於序號空間大小的一半

TCP解析

特點:面向連接的(connection-oriented),全雙工服務,點對點的

TCP報文段結構

首部一般20字節:源端口號(16bits),目的端口號(16bits),檢驗和字段(16bits),序號(32bits),確認號(32bits),接收窗口(16bits),首部長度(4bits,以32bits的字為單位),選項(可變長),標志(ACK確認,(RST,SYN,FIN)連接建立與拆除,(CWR,ECE)擁塞報告,PSH(表明應立即將數據交給上層),URG(緊急報文)),緊急數據指針(16bits,配合URG標志使用)
序號和確認號:序號對數據流中的字節編號,確認號表示下一次接收時期望的序號

往返時間(Round-Trip Time,RTT)

往返時間的估計:某個時刻的值SampleRTT,其均值為EstimateRTT
計算公式:EstimateRTT=(1-α)EstimateRTT+αSampleRTT,α的推薦值為0.125
(指數加權移動平均)
偏差的估計:DevRTT=(1-β)DevRTT+β
|SampleRTT-EstimateRTT|
設置和管理重傳時間間隔:重傳超時間隔TimeoutInterval=EstimateRTT+4*DevRTT,初始值為1s

TCP可靠數據傳輸

這里指出上節可靠數據傳輸技術的缺點:定時器的管理需要相當大的開銷
擁塞控制的簡單方法:超時間隔加倍,初始0.75s
快速重傳:3個冗余ACK--->重傳
累計確認,緩存失序分組

流量控制(區別於擁塞控制)

為了消除發送方發送太快,使接收方緩存溢出的可能性
方法:維護一個接收窗口變量,表明接收方還有多少可用的緩存空間

TCP連接管理:

三次握手(客戶發起)

1.客戶主機隨機生成序號,SYN標志置為1,發送連接請求
2.服務器隨機生成序號,SYN標志置為1,確認號置為客戶序號+1,允許連接
3.客戶回復序號+1,SYN置為0,確認號為服務器序號+1,連接建立

四次揮手(雙方都可發起)

1.一方將FIN標志置為1,請求關閉連接,這一方進入FIN_WAIT_1狀態
2.另一方回復ACK,進入CLOSE_WAIT,(發起方收到ACK,進入FIN_WAIT_2)
3.並接着回復FIN=1,進入LAST_ACK
4.初始方收到FIN,回復ACK,進入TIME_WAIT,定時(30s/1min/2min)關閉,(另一方收到ACK,進入CLOSED)

SYN洪泛攻擊的應對

服務器以請求連接方的IP和Port為參數使用一個私密的散列函數計算出一個值,使其作為服務器初始序號,並發送SYNACK給請求方,這時並不建立半開連接
如果用戶回復ACK,且ACK-1=f(IP,Port),那么說明用戶合法,允許建立連接
如果回復的ACK錯誤,說明此用戶並沒有較早的SYN請求,是非法的
如果沒有回復,也不會產生危害,因為服務器並沒有給它分配資源

TCP擁塞控制

加性增,乘性減(Additive-Increase,Multiplicative-Decrease,AIMD)

TCP吞吐量

一條連接的平均吞吐量=0.75W/RTT,W為丟包發生時的窗口長度
經高帶寬路徑的平均吞吐量=1.22MSS/(RTT*根號L),L為丟包率

AIMD算法公平嗎

公平,因為擁塞發生時,原本占帶寬大的減少較多的窗口長度,原本占帶寬少的減少較少的窗口長度,擁塞避免狀態又是以同樣速度增加窗口長度,數次擁塞發生后,各連接的窗口長度接近相等,帶寬占用趨於平均


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM