1. 程式人生 > >計算機網路3——傳輸層(下)

計算機網路3——傳輸層(下)

目錄

六、面向連線傳輸協議TCP

        1、TCP可靠資料傳輸        2、TCP流量控制        3、TCP連線管理

七、擁塞控制原理

        1、擁塞的成因和代價        2、擁塞控制的方法

八、TCP擁塞控制

        1、TCP擁塞控制

        2、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=λ’inout(goodput)。

情況b:丟失後才重發,λ’inout

情況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/4W很大時,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的速率。