一、TCP概述
-
點對點:一個發送方,一個接收方。
-
可靠的、按序的字節流
-
流水線機制:TCP擁塞控制和流量控制設置窗口尺寸。
-
發送方/接收方緩存
-
全雙工(full-duplex):同一連接中能夠傳輸雙向數據流。
-
面向連接
- 通信雙方在發送數據之前必須建立連接;
- 連接狀態只在連接的兩端中維護,在沿途節點中並不維護狀態;
- TCP連接包括:兩臺主機上的緩存、連接狀態變量、socket等。
-
流量控制機制
二、TCP:序列號和ACK
序列號
- 序列號指的是segment中第一個字節的編號,而不是segment的編號
- 建立TCP連接時,雙方隨機選擇序列號
ACKs
- 希望接收到的下一個字節的序列號
- 累計確認:該序列號之前的所有字節均已被正確接收到
問題:接收方如何處理亂序到達的segment?
- TCP規範中沒有規定,由TCP的實現者做出決策
三、TCP可靠數據傳輸概述
- TCP在IP層提供的不可靠服務基礎上實現可靠數據傳輸服務
- 流水線機制
- 累計確認
- TCP使用單一重傳定時器
- 觸發重傳的事件
- 超時
- 收到重複ACK
- 漸進式
- 暫不考慮重複ACK
- 暫不考慮流量控制
- 暫不考慮擁塞控制
四、TCP RTT和超時
如何設置定時器的超時時間?
-
大於RTT,但RTT是變化的
-
過短:不必要的重傳
-
過長:對段丟失時間反應慢
如何估計RTT?
- SampleRTT:測量從段發出去到收到ACK的時間,忽略重傳
- SampleRTT變化:測量多個SampleRTT,求平均值,形成RTT的估計值EstimatedRTT
定時器超時時間的設置
-
EstimatedRTT+“安全邊界”
-
EstimatedRTT變化大→較大的邊界
測量RTT的變化值:SampleRTT與EstimatedRTT的差值
- DevRTT=(1-β)×DevRTT + β×|SampleRTT-EstimatedRTT|(typically,β=0.25)
定時器超時時間的設置
TimeoutInterval=EstimatedRTT+4×DevRTT
五、TCP發送方事件
- 從應用層收到數據
- 創建Segment
- 序列號是Segment第一個字節的編號
- 開啓計時器
- 設置超時時間:TimeOutInterval
- 超時
- 重傳引起超時的segment
- 重啓定時器
- 收到ACK
- 如果確認此前未確認的segment
- 更新SendBase
- 如果窗口中還有未被確認的分組,重新啓動定時器
六、快速重傳機制
- TCP的實現中,如果發生超時,超時時間間隔將重新設置,即將超時時間間隔加倍,導致其很大
- 重發丟失的分組之前要等待很長時間
- 通過重複ACK檢測分組丟失
- Sender會背靠背地發送多個分組
- 如果某個分組丟失,可能會引發多個重複的ACK
- 如果sender收到對同一數據的3個ACK,則假定該數據之後的段已經丟失
- 快速重傳:在定時器超時之前即進行重傳
七、TCP流量控制
- 思想:接收方爲TCP連接分配buffer
- 上層應用可能處理buffer中數據的速度較慢
- 控制發送方不會傳輸的太多、太快以至於淹沒接收方(buffer溢出)
- 本質:速度匹配機制
八、TCP連接管理
- TCP sender和receiver在傳輸數據前需要建立連接
- 初始化TCP變量
- seq.#
- Buffer和流量控制信息
- Client:連接發起者
- Server:等待客戶連接請求
- 建立:三次握手