第六章 傳輸層-Transport Layer(上)
6.1傳輸層概述
在之前的幾章內容中,我們自底向上的描述了計算機網絡的各個層次,還描述了一些處於不同層次下的經典網絡協議(如以太網、無線局域網、或者因特網)。現在我們將把視野放在傳輸層,看看這一層的的協議提供了怎樣的服務、以及他們是如何實現的。由於傳輸層的內容也比較多,所以也會拆分成兩篇來寫。這一篇文章會介紹一下傳輸層的功能、提供給上層的服務,以及傳輸層是如何完成差錯控制、流量控制、擁塞控制等任務的。
6.1.1 傳輸層概述
在網絡層,我們使用VC和Datagram實現了鏈路上的通信;而傳輸層把傳輸服務擴展到了存在於兩台計算機的進程上(provides end-to-end delivering),並強調提供一種可靠的跨網絡傳輸方法。傳輸層的任務主要是:1.接收應用層的數據(並有可能需要切分成小段);2.發送數據段segment;3.區分屬於不同進程的segment
同時,傳輸層還決定了究竟提供哪種類型的服務。如果應用層不需要一種可靠的數據流(比如斗魚一類的視頻直播,就算有幾幀幀畫面的數據發生了錯誤也無傷大雅),那么傳輸層向網絡層發送的數據就不會設計過多的差錯控制及確認機制以節省資源;而反過來,如果應用層需要一種可靠的無錯信道(雖然現實中不可能完全不出錯),那么傳輸層發送給網絡層的段就會包含序列號以保證順序、ACK機制以應對丟包發生...此外,傳輸層還需要繼續考慮擁塞控制的問題,因為僅僅憑借網絡層是無法徹底解決網絡擁塞的。
6.1.2 傳輸層提供給上層的服務
- 提供了面向連接的服務(如TCP)與無連接(如UDP)的服務。
6.1.3 傳輸服務原語
6.2 傳輸協議的要素
這部分將描述一些傳輸協議的要素(比如傳輸層如何尋址或者進行流量控制),為后面介紹TCP、UDP做好鋪墊。但是這些要素並不是全部出現在傳輸層的所有協議之中。比如UDP協議就沒有連接建立的過程。
6.2.1 尋址
傳輸服務的訪問點:端口(port)
相對應的,網絡層服務的訪問點可以理解成:IP地址
6.2.2 傳輸建立(連接建立)
連接建立的過程是一個很經典的三次握手的過程。如下。
簡單的三次握手其實包含了很多考量,如在連接建立時發送的序列號(是為了防止早先發送的數據包超時到達導致重復接受),以及設置的計時器,等等。主機發送一個連接建立請求(CR),接收方收到后返回一個ACK表示已經收到,並返回一個自己的起始需要y(Host2的后續數據包將從y開始發送),最后主機一把對於這一消息的確認夾帶在需要發送的數據中。下面我們考慮幾種特殊的情況(其實在實際的操作過程中是很容易發生的)
首先考慮上圖的情況。主機1在很久之前向主機2發送了一個連接請求,而當這個請求真正到達的時候H1已經不再需要這個連接了。在這種情況下,盡管主機2並不知道到達的這個請求是否是真心實意的需要建立,H2仍舊可以通過確認機制實現對於數據包的判斷(如,H1已經不需要這個連接,就會向H2發送拒絕的數據)
在下圖這種情況中,H1所發送的超時CR和超時DATA同時存在於網絡中。當H2收到一個請求后,照常發出一個ACK等待H1開始發送數據(此時H2並不知道這是一個已經過期的請求)。而下一刻,當超時的DATA數據包也到達H2,H2經過判斷發現這個數據包的ACK和自己發送的確認序列號不符(y和z),所以判斷出這是一個超時的數據包,繼續等待H1的回復。
總而言之,在傳輸層,三次握手的存在使得老的段的任何組合都不會讓協議失敗,主機間也不會出人意料的建立一個連接。
6.2.3 連接釋放(2)
連接釋放的問題相對復雜。一個典型的例子是兩軍對壘問題(感興趣的同學可以搜索一下,這里不再花費大量篇幅展開)。總之,不存在一種兩方都完全確認並做好准備的釋放連接。現在的釋放連接方法分成兩種,對稱釋放與非對稱釋放
非對稱釋放
例如電話,在一方掛機之后連接直接斷開
對稱釋放
將一個連接看成是兩個單向的連接,需要分別單獨釋放。
6.2.3 差錯控制&流量控制
在之前的內容里,我們已經討論過鏈路層和網絡層的流量控制。
差錯控制:確保數據傳輸具備可靠性(所有的數據被無差錯的傳輸至目的地)
流量控制:防止快速發送端淹沒慢速接收端
這兩個問題已經在鏈路層考察過,而在傳輸層,我們采用了和鏈路層基本一致的解決方案,即:
-
- 幀中攜帶一個驗錯碼(如CRC或者checksum),在接收端檢測信息是否正確。
-
- 使用自動重復請求(ARQ)
-
- 使用停-等式協議
-
- 使用滑動窗口
6.2.4 多路復用(可以解決地址匱乏問題!!!!)
除了在網絡層講到了的三種解決方案之外,在傳輸層還有一個方法可以用於緩解地址匱乏問題,那就是多路復用(multiplexing)。
上圖中左圖使用的方法就是多路復用。同一個地址上到達的端,分給不同的進程(前面已經講過傳輸層和網絡層接入點的問題)。相對應的,另一種方法稱為逆向多路復用,即把一個連接的流量分給多條路徑。通過逆向多路復用,傳輸層可以合並多條低速鏈路,把他們當作一條高速鏈路來使用。
6.3 傳輸層擁塞控制
如果讀者還能想起來,在網絡層中,我們說到擁塞控制需要網絡層與傳輸層的共同努力。下面的內容將解釋傳輸層如何進行擁塞控制
擁塞控制的唯一途徑就是減少傳輸層向下發送數據包的速度。
6.3.1 最大-最小公平
上圖很形象的闡述了最大最小公平的原則:如果分配給一個流的帶寬,在不減少分配給另一個流帶寬的前提下,無法得到進一步增長,那么就不分配給這個流更多帶寬。
這個定義繞來繞去不好理解,我們還是用圖片來闡釋。上圖中存在6個路由器、一個工字形的鏈路以及ABCD四條數據流。我們假設每一段鏈路的最大上限都是1。任意拿一條流距離,分配給B流的帶寬,在不減少其它流的前提下已經無法再進一步增長(比如再R4和R5之間已經達到了瓶頸,不能再增加了)。同理用A流舉例來說,盡管在R1R2之間沒有到達流量上限,但是A流在R2R3之間已經達到了上限(如果不減少流B就無法進一步增長),全部判斷之后,我們可以說這種分配是符合最大-最小公平的。讀者可以自行判斷一下流C和流D。
6.3.2 調整發送速率
然而,單獨依靠最大-最小公平仍舊不足以使每個流都公平的分配到最大帶寬。下面介紹的內容將是傳輸層一個重點算法的基礎。
在傳輸層,發送速率會受到兩個因素的影響。分別是流量控制和擁塞控制。當接收端沒有足夠的緩沖區,據必須進行流量控制;而擁塞控制針對的是網絡層容量不足的情況,如下圖。
加法遞增與乘法遞減:AIMD-additive increase and multiplicative decrease
我們還是通過圖片來理解。假設在某一條網絡上存在兩個用戶(或着說,兩個數據流)同時需要占用帶寬。我們構建一個坐標系,橫軸是用戶1的實際帶寬,縱軸是用戶2的帶寬,網絡的總容量為C。由於兩個用戶處於一個網絡下,易知對於任意的x,y,一定存在:
當x+y=c,這條網絡的帶寬被全部占滿,我們稱這條曲線位效率線。同時,對於x和y兩個用戶來說,為了維持收發速度的公平,兩個用戶應該能夠獲取相同大小的帶寬,即:
這條線被稱作公平線我們把這兩條曲線表示在剛剛的坐標系中,他們的交點被稱作最優點。這是每一個網絡希望達到的理想狀態。因此現在的問題是,網絡應該采取何種策略,到達之前所說的公平點呢?我們給出的答案稱作加法遞增與乘法遞減控制法。
所謂加法,指的是同時增加或減少用戶1和用戶2 的帶寬;而所謂乘法,指的是按照比例改變用戶1和用戶2的帶寬。可想而知,如果在圖像上表示這兩種更改方式,加法一定是一條斜率為1的直線,乘法一定是一條過原點的直線。
而之所以加法只用在增加,乘法只用在減少,是由於TCP擁塞控制中的穩定性觀點:驅使網絡擁堵非常容易,而想要使其恢復,則相對困難。因此,遞增策略應相對溫柔,遞減策略應相對積極。

對於剛才的網絡,我們假設當前網絡的效率處在A點。(即用戶1 的帶寬位x1,用戶2的帶寬為x2)

從A點開始,首先進行加法遞增(藍紫色實線)。當X+Y到達1號點,超出了網絡的容量之后,網絡層會向用戶發送一個擁塞信號,這是各個用戶開始使用乘法遞減原則,共同減少自己占用的帶寬,到達2號點(路徑為途中紅色實線)。反復執行這一流程多次后,系統會慢慢趨近最優點。
AIMD是TCP采用的擁塞控制法則。但這個法則不是完全的公平。因為TCP每次都要根據往返時間測量值來調整窗口的大小,所以接近主機的連接往往比距離遠的連接要獲得更多帶寬(距離近則往返時間短)。
到此為止,本章的內容已經全部結束。下一章將繼續傳輸層的下半部分內容,介紹兩個傳輸層的超重要協議:TCP與UDP協議。傳送門:傳輸層(下)