運輸層
一、引言
前面說過,運輸層負責向兩個主機中的進程之間的通信提供服務。它是面向通信部分的最高層,也是用戶功能中的最低層。
運輸層提供複用(multiplexing)和分用(demultiplexing)的功能,還對報文進行差錯檢測。它的兩個主要協議是無連接的用戶數據報協議UDP (User DatagramProtocol)和面向連接的傳輸控制協議TCP (Transmission ControlProtocol)。
運輸層使用協議端口號(protocol port number)來識別主機上的進程。端口號只具有本地意義,分爲兩大類:服務器端使用的端口號(又分爲熟知端口號和登記端口號)和客戶端使用的端口號(短暫端口號)。
二、UDP和TCP
UDP和TCP的特點如下表。
|
UDP |
TCP |
相同點 |
①複用和分用的功能 |
|
②差錯檢測功能 |
||
不同點 |
①無連接 |
①面向連接 |
②盡最大努力交付 |
②可靠交付 |
|
③面向報文(對上層交下來的報文既不合並也不拆分) |
③面向字節流 |
|
④無擁塞控制 |
④有擁塞控制 |
|
⑤支持m對n的交互通信 |
⑤只支持點對點的全雙工通信 |
|
⑥首部開銷小(8字節) |
⑥首部相對大(20字節) |
UDP的首部格式如下。
“檢驗和”檢測整個數據報。計算方法同IP數據報。檢驗時加上僞首部。
TCP報文段的首部格式如下。
“序號”對每個字節都按序編號;“確認號”是期望收到的下一個字節的序號;“數據偏移”是首部長度,單位爲4字節;檢驗和與UDP類似。TCP報文段首部長度爲20~60字節。
“緊急指針”和“緊急URG”位用來傳送緊急消息(下面僅作爲學問擴充與探討來介紹)。TCP的緊急機制是允許發送者使接收者接收一些緊急消息,並讓接收方在接收到這一消息後立刻通知用戶。這種機制是在數據流是加入一個點(緊急指針),指出這是緊急數據的結束點,當接收方要接收到這個點之前,它會通知用戶進入緊急狀態,在接收到這個點的數據後,它會通知用戶進入通常狀態。好像緊急數據不僅會優先發送,還會優先接收。這一點還請知情人士和我一起討論。
可以發現,UDP和TCP中都出現了“僞首部”這一字段。僞首部僅僅是爲了計算檢驗和,既不向下傳送也不向上遞交。Stevens 的《tcp/ip詳解卷一 協議》書中原話“其目的是讓UDP兩次檢查數據是否已經正確到達目的地”。第一次,通過僞首部的IP地址檢驗,UDP可以確認該數據報是不是發送給本機IP地址的;第二,通過僞首部的協議字段檢驗,UDP可以確認IP有沒有把不應該傳給UDP而應該傳給別的高層的數據報傳給了UDP。從這一點上,僞首部的作用其實很大。
三、TCP的“高級功能”
我們知道,TCP比UDP多了很多功能,也使得它表現得更加強大。這裏不是說UDP比TCP差,它們各有各的用處。比如在視頻會議等實時性比可靠性更重要的應用中,或要求開銷小的場合下,還是非UDP莫屬的。TCP的“高級功能”主要有可靠傳輸、流量控制、擁塞控制和連接管理四部分。下面我們來進行一一介紹。
3.1 可靠傳輸
理想的傳輸條件有以下兩個特點:傳輸信道不產生差錯;不管發送方以多快的速度發送數據,接收方總是來得及處理收到的數據。
最簡單的方法是停止等待協議。它能自動重傳。信道利用率U=T_D/(T_D+RTT+T_A )(咦,CSDN裏面不能粘WORD的公式啊……這裏公式裏面的下劃線就是下標的意思)。T_D爲單個分組的發送時間,T_A是確認分組發送時間,RTT爲往返時間。
停止等待協議的缺點是信道利用率太低。因此採用流水線傳輸,即一次連續發送多個分組。可以使用連續ARQ協議和滑動窗口協議。
滑動窗口協議是可靠傳輸的最重要的協議。最複雜的問題之一就是超時重傳時間的選擇。
超時重傳時間RTO(Retransmission Time-Out)應略大於RTT。但考慮到網絡是動態的,RTT時刻在變化,因此需要動態計算出兩個參數——加權平均往返時間和偏差的加權平均值——來動態得出RTO的值:RTO=RTT_S+4×RTT_D。
其中,RTT_S=(1-α)×(舊的RTT_S )+α×(新的RTT樣本)
RTT_D=(1-β)×(舊的RTT_D )+β×|RTT_S-新的RTT樣本|
通常,α=1/8,β=1/4。
3.2 流量控制、擁塞控制
流量控制(flow control)就是讓發送方的發送速率不要太快,要讓接收方來得及接收。採用將自己的接收窗口rwnd值反饋給發送方的方式來動態控制發送方的發送窗口。
擁塞控制(congestion control)就是防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或鏈路不致過載。
兩者的區別是流量控制是端到端的問題,考慮接收方的接收;而擁塞控制是涉及到全局的問題,考慮網絡的暢通。
擁塞控制的四種算法是非常重要的機制:慢開始(slow-start)、擁塞避免(congestion avoidance)、快重傳(fast retransmit)、快恢復(fastrecovery)。
由於算法三言兩語說不清,所以在這裏只總結一下。如果對算法不熟悉最好要看教材。
(1)慢開始
剛開始時設置擁塞窗口cwnd=發送窗口=1 MSS(最大報文段)。接着每經過一個傳輸輪次,cwnd和發送窗口就加倍,直到cwnd>ssthresh(慢開始門限)。
(2)擁塞避免
cwnd>ssthresh後,每經過一個傳輸輪次,cwnd就加1MSS(加法增大),而不是加倍。直到網絡出現擁塞(超時)。
出現擁塞後將ssthresh設置爲此時cwnd的一半(乘法減小),然後把cwnd置1,執行慢開始算法。
(3)快重傳
接收方收到失序的報文段後就立即發出重複確認,且接下來每收到一個報文段都發送一次重複確認。發送方只要一連收到三個重複確認就應當立即重傳對方尚未收到的報文段。
(4)快恢復
發送方連續收到三個重複確認時,執行乘法減小算法,把ssthresh設置爲cwnd的一半,然後(不執行慢開始)把cwnd也設置爲ssthresh的數值,執行加法增大算法。
在實際中發送窗口不一定一直等於cwnd,因爲它還要受接收窗口rwnd的限制。
TCP還使用隨機早期檢測RED (Random Early Detection)來在路由器的平均隊列長度介於最大門限和最小門限之間時就以概率p隨機丟棄個別分組,來避免全局同步(多條TCP同時擁塞,又幾乎同時恢復)。p不是常數。
3.3 連接管理
這節比較簡單。TCP的連接建立過程是三次握手:客戶機請求並設置客戶端發送的初始序號、服務器確認請求並設置服務器端發送的初始序號、客戶再次確認。前兩次都各消耗一個序號,第三次如果報文段不攜帶數據則不消耗序號。(我就是在期末考試中忘記了才做錯了一道題)
連接釋放相對較複雜,經過兩個二次握手。第一次握手(客戶端發起)使TCP連接處於半關閉狀態,客戶端不能發送數據,而服務器端還可以;第二次握手(服務器端發起)結束連接。
四、尾聲
好了,運輸層的內容終於介紹完了。可以看出運輸層和網絡層的內容最多,也十分重要,需要好好理解並適當記憶。網絡層主要是IP數據報、RIP報文、OSPF報文、RIP/OSPF的區別,運輸層主要是UDP用戶數據報、TCP報文段、UDP/TCP的區別、TCP的高級功能。
本文留下了一個問題,關於緊急數據的,應該不會考,不過還是值得探討的。歡迎大家不吝賜教!