計算機網路3——傳輸層(下)
目錄
1、TCP可靠資料傳輸 2、TCP流量控制 3、TCP連線管理
六、面向連線傳輸協議TCP
TCP(RFCs-793, 1122, 1323, 2018, 2581)的特點:點對點,一個傳送方,一個接收方。可靠的、按序的位元組流。流水線機制,TCP擁塞控制和流量控制機制動態設定視窗尺寸。傳送方/接收方快取。面向連線,通訊雙方在傳送資料之前必須建立連線;連線狀態只在連線的兩端中維護,在沿途節點中並不維護狀態;TCP連線包括兩臺主機上的快取、連線狀態變數、socket等;全雙工(full-duplex),同一連線中能夠傳輸雙向資料流。
序列號:序列號指的是segment中第一個位元組的編號,而不是segment的編號。建立TCP連線時,雙方隨機選擇序列號。
ACKs:希望接收到的下一個位元組的序列號。累計確認,該序列號之前的所有位元組均已被正確接收到。
接收方如何處理亂序到達的Segment,TCP規範中沒有規定,由TCP的實現者做出決策。
1、TCP可靠資料傳輸
TCP在IP層提供的不可靠服務基礎上實現可靠資料傳輸服務,流水線機制、累積確認、使用單一重傳定時器。觸發重傳的事件超時或收到重複ACK。暫不考慮重複ACK、流量控制和擁塞控制。
(1)超時時間
超時時間過短,不必要的重傳;過長,對段丟失時間反應慢。設定定時器的超時時間,大於RTT但RTT是變化的,如何估計RTT?SampleRTT,測量從段發出去到收到ACK的時間,忽略重傳。測量多個SampleRTT,求平均值,形成RTT的估計值EstimatedRTT。指數加權移動平均,典型值0.125。
EstimatedRTT = (1-α)*EstimatedRTT +α*SampleRTT
定時器超時時間的設定,EstimatedRTT+“安全邊界”,EstimatedRTT變化大則設定較大的邊界(與網路狀況有關)。測量RTT的變化值,SampleRTT與EstimatedRTT的差值。
DevRTT = (1-β)*DevRTT + β*|SampleRTT-EstimatedRTT| (typically,β= 0.25)
TimeoutInterval = EstimatedRTT + 4*DevRTT
(2)TCP傳送方
從應用層收到資料,建立Segment,序列號是Segment第一個位元組的編號。開啟計時器, 設定超時時間TimeOutInterval。
超時,重傳引起超時的Segment,重啟定時器。
收到ACK,如果確認此前未確認的Segment,更新SendBase。如果視窗中還有未被確認的分組,重新啟動定時器。
// TCP傳送端程式
NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum
loop (forever) {
switch(event)
event: data received from application above
create TCP segment with sequence number NextSeqNum
if (timer currently not running)
start timer
pass segment to IP
NextSeqNum = NextSeqNum + length(data)
event: timer timeout
retransmit not-yet-acknowledged segment with
smallest sequence number
start timer
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
} /* end of loop forever */
(3)TCP接收方(RFC1122, 2581)
(4)快速重傳機制
TCP的實現中,如果發生超時,超時時間間隔將重新設定,將超時時間間隔加倍,導致其很大,重發丟失的分組之前要等待很長時間。Sender會背靠背地傳送多個分組,如果某個分組丟失,可能會引發多個重複的ACK,通過重複ACK檢測分組丟失。
如果Sender收到對同一資料的3個ACK,則假定該資料之後的段已經丟失。快速重傳,即在定時器超時之前進行重傳。
// 快速重傳演算法
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
} else { // a duplicate ACK for already ACKed segment
increment count of dup ACKs received for y
if (count of dup ACKs received for y = 3) {
resend segment with sequence number y // fast retransmit
}
}
2、TCP流量控制
接收方為TCP連線分配buffer,上層應用可能處理buffer中資料的速度較慢。流量控制(flow control)指傳送方不會傳輸的太多、太快以至於淹沒接收方,導致buffer溢位,是一種速度匹配機制。
假定TCP receiver丟棄亂序的segments,Buffer中的可用空間(spare room) RcvWindow= RcvBuffer-[LastByteRcvd - LastByteRead]。Receiver通過在Segment的頭部欄位將RcvWindow告訴Sender,Sender限制自己已經發送的但還未收到ACK的資料不超過接收方的空閒RcvWindow尺寸。
Receiver告知Sender RcvWindow=0,傳送方仍可以傳送一個很小的段,得到新的RcvWindow資訊,避免RcvWindow為0時即使之後有空閒傳送方也不知道。
3、TCP連線管理
TCP sender和receiver在傳輸資料前需要建立連線,初始化TCP變數(Seq.#、Buffer和流量控制資訊)。通常連線發起者是Client,Server等待客戶連線請求。
Socket clientSocket = new Socket("hostname","port number");
Socket connectionSocket = welcomeSocket.accept();
TCP連線建立過程中採用“三次握手機制(Three way handshake)”。Step 1: client host sends TCP SYN segment to server, specifies initial seq #, no data(SYN標誌位置為1表示要建立連線、初始序列號). Step 2: server host receives SYN, replies with SYNACK segment. server allocates buffers, specifies server initial seq. #(分配快取、選擇初始序列號告知客戶端、ACK).Step 3: client receives SYNACK, replies with ACK segment, which may contain data(與伺服器確認收到了同意建立連線的報文段).
在握手的第二步,伺服器分配資源,假如第三次握手的ACK沒有傳送至伺服器,伺服器的資源會保留一段時間再釋放。網路攻擊。
TCP連線的關閉Closing a connection,一般由客戶機發起關閉的請求clientSocket.close();。client向server傳送TCP FIN控制segment;server收到FIN,回覆ACK關閉連線,傳送FIN;client收到FIN,回覆ACK,進入“等待”,如果重複收到FIN,會重新發送ACK;server收到ACK,連線關閉。
七、擁塞控制原理
擁塞(Congestion),非正式定義“太多傳送主機發送了太多資料或者傳送速度太快,以至於網路無法處理”,表現為分組丟失(路由器快取溢位)或分組延遲過大(在路由器快取中排隊)。A top-10 problem。擁塞控制(網路)vs.流量控制(傳送方和接收方)。
1、擁塞的成因和代價
場景一:兩個senders,兩個receivers,A->C,B->D,共享一個路由器。假定鏈路頻寬C,路由器有無限快取,分組不會丟失沒有重傳。λin傳送資料的速率,λout接收資料的速率。
場景二:一個路由器,有限快取,Sender重傳分組。λ’in原始需要傳送的資料加重傳資料,比λin大。
情況a:假設Sender能夠通過某種機制獲知路由器buffer資訊,有空閒才發,不會丟包。λin=λ’in=λout(goodput)。
情況b:丟失後才重發,λ’in>λout。
情況c:分組丟失和定時器超時後都重發,λ’in變得更大。
擁塞的代價:對給定的“goodput”,要做更多的工作(重傳),造成資源的浪費。
場景三:四個傳送方,四個接收方,A->C,C->A,B->D,D->B,四個路由器。多跳,超時/重傳。
擁塞的另一個代價:多跳網路中,當分組被drop時,任何用於該分組的“上游”傳輸能力全都被浪費掉。
2、擁塞控制的方法
端到端擁塞控制:網路層不需要顯式的提供支援,端系統通過觀察loss、delay等網路行為判斷是否發生擁塞。TCP採取這種方法。
網路輔助的擁塞控制:路由器向傳送方顯式地反饋網路擁塞資訊,簡單的擁塞指示(1bit)SNA, DECbit, TCP/IP ECN, ATM,指示傳送方應該採取何種速率。
案例ATM ABR擁塞控制:提供ABR(available bit rate)“彈性服務”,如果傳送方路徑負載低(underloaded),使用可用頻寬,如果傳送方路徑擁塞,將傳送速率降到最低保障速率。傳送方傳送若干Data cells發一個RM(resource management)cells,網路裝置交換機設定RM cell位(網路輔助),NI bit rate不許增長,CI bit擁塞指示,RM cells由接收方返回給傳送方。
在RM cell中有顯式的速率(ER)欄位,兩個位元組,擁塞的交換機可以將ER置為更低的值(定量),傳送方獲知路徑所能支援的最小速率。
資料cell中的EFCI位,擁塞的交換機將其設為1,如果RM cell前面的data cell的EFCI位被設為1,那麼傳送方在返回的RM cell中置CI位。
八、TCP擁塞控制
1、TCP擁塞控制
Sender限制傳送速率LastByteSent-LastByteAcked <= CongWin(擁塞視窗)。CongWin根據所感知到的網路擁塞,動態調整以改變傳送速率,限定已傳送但未確認的資料的量。
rate ≈ CongWin/RTT(Bytes/sec)
感知網路擁塞:Loss事件(timeout或3個重複ACK),發生Loss事件後,傳送方降低速率。
(1)合理地調整發送速率:
加性增-乘性減(AIMD),擁塞避免。逐漸增加發送速率,謹慎探測可用頻寬,直到發生Loss。Additive Increase,每個RTT將CongWin增大一個MSS(最大段長度),擁塞避免;Multiplicative Decrease,發生Loss後將CongWin減半。
慢啟動(SS)。TCP連線建立時,CongWin=1,例MSS=500byte,RTT=200msec,初始速率=20k bps,可用頻寬可能遠遠高於初始,希望速率快速增長。當連線開始時,指數型增長,每個RTT收到每個ACK將CongWin翻倍。
// Slowstart algorithm
initialize:Congwin=1
for (each segment ACKed)
Congwin++
until (loss event OR CongWin>threshold)
Threshold變數。當CongWin達到Loss事件前值的1/2時,將指數型增長切換為線性增長(擁塞避免)。Loss事件發生時,變數Threshold被設為Loss事件前CongWin值的1/2。
3個重複ACKs,CongWin切到一半,然後線性增長。Timeout事件,CongWin直接設為1個MSS,然後指數增長,達到threshold後再線性增長。3個重複ACKs表示網路還能夠傳輸一些 segments,timeout事件表明擁塞更為嚴重。
(2)總結
When CongWin is below Threshold, sender in slow-start phase, window grows exponentially. When CongWin is above Threshold, sender is in congestion-avoidance phase, window grows linearly.
When a triple duplicate ACK occurs, Threshold set to CongWin/2 and CongWin set to Threshold. When timeout occurs, Threshold set to CongWin/2 and CongWin is set to 1 MSS.
(3)TCP擁塞控制演算法
Th = ? // 設定一個合適的值
CongWin = 1 MSS
/* slow start or exponential increase */
While (No Packet Loss and CongWin < Th) {
send CongWin TCP segments
for each ACK increase CongWin by 1
}
/* congestion avoidance or linear increase */
While (No Packet Loss) {
send CongWin TCP segments
for CongWin ACKs, increase CongWin by 1
}
Th = CongWin/2
If (3 Dup ACKs) CongWin = Th;
If (timeout) CongWin=1;
(4)例題
一個TCP連線總是以1 KB的最大段長髮送TCP段,傳送方有足夠多的資料要傳送。當擁塞視窗為16 KB時發生了超時,如果接下來的4個RTT(往返時間)時間內的TCP段的傳輸都是成功的,那麼當第4個RTT時間內傳送的所有TCP段都得到肯定應答時,擁塞視窗大小是多少?
解:threshold=16/2=8 KB,CongWin=1 KB,1個RTT後,CongWin=2 KB,2個RTT後, CongWin=4 KB,3個RTT後,CongWin=8 KB,Slowstart is over;4個RTT後,CongWin=9 KB。
2、TCP效能分析
(1)TCP throughput(吞吐率)
給定擁塞視窗大小和RTT,忽略Slow start,TCP的平均吞吐率是多少?假定發生超時時CongWin的大小為W,吞吐率是W/RTT;超時後,CongWin=W/2,吞吐率是W/2RTT。
平均吞吐率為0.75W/RTT。
(2)未來的TCP
假設每個Segment有1500個byte,RTT是100ms,希望獲得10Gbps的吞吐率。throughput = W*MSS*8/RTT, 則W=throughput*RTT/(MSS*8)=83,333。視窗大小為83,333。
吞吐率與丟包率(loss rate, L)的關係:CongWin從W/2增加至W時出現第一個丟包,那麼一共傳送的分組數為W/2+(W/2+1)+(W/2+2)+….+W=3W2/8+3W/4。W很大時,3W2/8>>3W/4,因此L≈8/(3W2)=2·10-10。
高速網路下需要設計新的TCP。
(3)TCP的公平性
公平性指如果K個TCP Session共享相同的瓶頸頻寬R,那麼每個Session的平均速率為R/K。TCP具有公平性。
公平性與UDP:多媒體應用通常不使用TCP,以免被擁塞控制機制限制速率。使用UDP以恆定速率傳送,能夠容忍丟失,產生了不公平。研究TCP friendly。
公平性與併發TCP連線:某些應用(如Web瀏覽器)會開啟多個併發連線,產生公平性問題。如鏈路速率為R,已有9個連線,新來的應用請求1個TCP,獲得R/10的速率,新來的應用請求11個TCP,獲得R/2的速率。