contributed by <kaeteyaruyo
>
Computer Networking
在 1.1 時我們有提到,網際網路可以被視為一個提供使用者存取分散在各個終端設備上的應用服務的基礎建設。理想的情況下,我們會希望網際網路可以在一瞬間之內把所有我們希望傳送的資料都傳到目的地的終端機器上,而且沒有損失任何資料。但這種要求根本就是天方夜譚,在現實中是不可能做到的。實際上,電腦網路的吞吐量 (throughput,也就是每秒可以傳輸的資料量上限) 一定是會受限的,傳遞封包時一定會有延遲,也一定會有掉包的問題。一方面,現實中的物理法則造成了這些延遲、掉包,還有吞吐量的限制;另一方面,也因為有這些問題,才會有這麼多有趣的議題需要我們去解決 -- 這些議題多到我們這一門 computer networking 的課根本講不完,多到可以成就出上千位的 PhD!(這結論???)在這個小節中,我們就要開始探討和量化電腦網路中的延遲、掉包以及吞吐量的議題。
在網路上,一個封包會從某台主機 (source) 出來,經過一連串的路由器,最後抵達另一台主機 (destination)。當一個封包從某一個節點(可能是主機或是路由器)一路經過接下來的節點時,他可能會在每個節點因各種延遲而耽誤。在這些延遲當中,最重要的是節點處理延遲 (nodal processing delay)、佇列延遲 (queuing delay)、傳輸延遲 (transmission delay),以及傳播延遲 (propagation delay)。把這些延遲通通加總起來,就可以得到節點總延遲 (total nodal delay)。網路上的應用程式(像是搜尋引擎、網頁瀏覽、 e-mail 、地圖、即時訊息、語音電話等)的效能,會大大地受到這些延遲的影響。為了更深入地了解封包交換和電腦網路,我們必須要搞懂這些延遲的特性和重要性。
上圖中展示了我們剛剛有提到的幾種延遲的類型。這張圖展示了一個封包要從某台電腦被送到另一台電腦途中的其中一小段路程,封包被從某台電腦送到 A 路由器上,準備要被送去路由器 B。我們的目標是要分析在路由器 A 上的節點延遲是由哪些因素造成的。我們可以看到,路由器 A 有一條往外連的線路通向路由器 B, 在出口處有一個緩衝佇列擋著。當封包從上游的節點抵達了A 之後,路由器 A 會把封包的標頭拆開來看,好決定這個封包應該要透過哪一條線路往外送。在這個例子中,這條線路就是往 B 的那一條。一個封包只有在該線路沒有在傳輸其它封包,且緩衝佇列中也沒有任何一個封包時,才可以被往外送;反之,這個封包就必須被排進佇列中。
剛踏進電腦網路這個領域的人有時候會分不清楚傳輸延遲和傳播延遲(尤其中文又長得這麼像…),他們之間的差異很細微,但是很重要。
- | 傳輸延遲 | 傳播延遲 |
---|---|---|
定義 | 將一個封包完全放到 線路上的時間 |
將一個位元從一台路由器 傳到另一台路由器的時間 |
公式 | ||
備註 | 與路由器間的距離無關 | 與封包大小或傳輸速度無關 |
我們可以用一個「高速公路上的車隊」的比方來解釋這兩種延遲的觀念。
如果我們分別以
在節點總延遲中最複雜且最有趣的變項就是排隊延遲了,有一大堆論文和書籍都在探討這個東西[Bertsekas 1991; Daigle 1991; Kleinrock 1975, Kleinrock 1976; Ross 1995]。在這裡我們只做概念性的、直覺的討論,好奇的讀者們可以再自己去翻翻上面的文章(或是考上 PhD 自己寫一本)。和其他三種延遲不同,每個封包感受到的排隊延遲會大不相同。例如:如果有十個封包同時抵達了同一個緩衝佇列,第一個封包因為會馬上被丟出去,所以不會有任何排隊延遲,但是最後一個封包,他必須等前面九個封包都送出去了才可以送出,所以他的排隊延遲會非常大。因此,當我們在描述排隊延遲的時候,通常會使用他的統計特徵,像是平均排隊延遲、排隊延遲的變異數,或是排隊延遲超過某個數字的機率值等等。
排隊延遲什麼時候會很可觀、又是什麼時候小到可以忽略呢?這取決於封包流量抵達緩衝佇列的速度、線路的傳輸速度,以及這個流量的型態(封包每隔一段固定時間就來固定的量還是一次來一大堆)。為了說明的更精確,我們定義:
有了這些參數,我們可以定義流量強度 (Traffic Intensity) 為平均抵達速度和傳輸速度的比值,也就是 La / R (沒有單位)。流量強度是估算排隊延遲大小的一個重要依據。
但上面這兩個例子都太理想化了,只有在實驗室才會發生。在現實生活中,通常封包都是隨機抵達的,也就是說,相鄰的兩個封包中間的時間間隔是隨機長度,沒有任何規律的。在這個更接近現實狀況的例子中,只看 La/R 這個數值通常不足以完全描述排隊延遲的統計特徵。儘管如此,我們還是可以透過他的大小很直觀的理解現在的排隊延遲大概有多嚴重。
隨著流量強度往 1 逼近,平均隊伍長度就會變得越來越長。我們可以量化平均排隊延遲和流量強度的關係,並作圖如下所示:
這張圖上有一個很重要的資訊,那就是當流量強度趨近於 1 的時候,平均排隊延遲會增長的非常快。一點點的流量增長,都會導致延遲嚴重地增加。你或許有在高速公路上體會過這種狀況:平日就已經很容易塞車的路段(流量強度已經很接近 1),如果遇到連假,車流比平常又更多了一點,那平均車速就會慢的不可思議。
到剛才為止我們都是在「假設佇列的長度非常大,可以容納無限個位元」的狀況下探討排隊延遲的。但實際上,緩衝佇列不可能無限長,他的容量是有限的,大小會跟路由器的設計方式和價格有關。由於佇列的容量有限,排隊延遲不可能真的長到變成無限大。反之,當流量強度大到某個程度,隊伍會把整個緩衝佇列都塞滿,新來的封包沒辦法被排進隊伍中,路由器就會把這個封包丟掉,造成丟包 (Packet Loss)。
從終端設備的角度來看,「丟包」就是一個「封包被丟到核心網路中了,但是從來就沒有到達他的目的地過」的狀況。隨著流量強度增加,封包遺失的比例就會越高。因此,我們在評估一個節點的效能的時候,不會單純只看他的延遲,也會看他丟包的機率。在接下來的章節我們會談到,在端到端的基礎上 (on an end-to-end basis)(這句看不懂),這些遺失的封包會被重送,以確保所有資料最後都可以從源頭送到目的地。
在 1.4.2 我們討論的重點都放在單一節點的延遲上,接著讓我們來計算一個封包從起點送到終點會有多少的延遲。為了幫助我們清楚掌握這個概念,我們先做以下假設:
把每個節點的處理延遲都加總就會得到端到端延遲 (end-to-end delay) 為
TODO: Generalize Equation above to the case of heterogeneous delays at the nodes and to the presence of an average queuing delay at each node.
為了親身體驗什麼叫「端到端延遲」,我們可以使用 Traceroute 這套程式來進行檢測。Traceroute 在任何電腦上都可以執行,使用者指定一個目標的 hostname, traceroute 就會對目標主機發出數個特別的封包。這些封包在通往終點的路上會經過一系列的路由器,每一台路由器收到這些封包的其中一個後,就會往起點回傳一個短短的訊息,包含這台路由器的名字和位址。
更精確的說,假設在起點跟終點間總共有 N - 1 台路由器,那麼起點就會送出 N 個這種特別的封包到網路上,每一個封包的收件地址都是終點的主機。這 N 個封包會被編號,第一個編號是 1,最後一個編號是 N,中間以此類推。當第 n 台路由器收到第 n 個封包的時候,他不會把這個封包繼續往下送,而是會回傳一段訊息給起點主機。當終點主機收到第 N 個封包時,它同樣也會回傳這種訊息給起點。起點主機會記錄這些封包寄出到收到回傳的訊息中間所經過的時間,還有回傳訊息的路由器(或目標主機)的地址跟名字。有了這些資訊,起點主機就可以重建封包送往終點時所經過的路徑,也可以決定來回中間任意一台路由器所需的時間。 Traceroute 實際上會執行上述流程三次,所以其實會送出
以下是一個 Traceroute 的輸出範例。這次實驗的起點是從 gaia.cs.umass.edu
(在 University of Massachusetts 裡的一台電腦)出發的,送往 cis.poly.edu
(在 Polytechnic University in Brooklyn 裡的一台電腦)。每一列的輸出總共有六個欄位,分別是封包的編號 n 、路由器的名字、路由器的位址(可以是 IPv4 或是 IPv6,看啟動程式時怎麼下參數),還有三次實驗所測得的時間差。如果起點收到來自某台路由器的回傳訊息少於三個(可能是因為丟包),那他就會放一個星號 *
在該伺服器的那一列,提示使用者這台伺服器測得的來回時間差數量少於三次。
1 cs-gw (128.119.240.254) 1.009 ms 0.899 ms 0.993 ms
2 128.119.3.154 (128.119.3.154) 0.931 ms 0.441 ms 0.651 ms
3 -border4-rt-gi-1-3.gw.umass.edu (128.119.2.194) 1.032 ms 0.484 ms 0.451 ms
4 -acr1-ge-2-1-0.Boston.cw.net (208.172.51.129) 10.006 ms 8.150 ms 8.460 ms
5 -agr4-loopback.NewYork.cw.net (206.24.194.104) 12.272 ms 14.344 ms 13.267 ms
6 -acr2-loopback.NewYork.cw.net (206.24.194.62) 13.225 ms 12.292 ms 12.148 ms
7 -pos10-2.core2.NewYork1.Level3.net (209.244.160.133) 12.218 ms 11.823 ms 11.793 ms
8 -gige9-1-52.hsipaccess1.NewYork1.Level3.net (64.159.17.39) 13.081 ms 11.556 ms 13.297 ms
9 -p0-0.polyu.bbnplanet.net (4.25.109.122) 12.716 ms 13.052 ms 12.786 ms
10 cis.poly.edu (128.238.32.126) 14.080 ms 13.035 ms 12.802 ms
在這條路徑上,總共有九台路由器在起點跟終點之間。大部分的路由器都有自己的名字,並且所有的路由器都有自己的位址。例如:第三台路由器的名字叫做 border4-rt-gi-1-3.gw.umass.edu
,它的位址是 128.119.2.194
。在這個路由器上,我們測到第一次的來回時間差是 1.03 msec,而第二次、第三次分別是 0.48 和 0.45 msec 。這個來回時間差包含了我們上面提到的所有延遲,也就是傳輸延遲、傳播延遲、節點處理延遲和排隊延遲。其中排隊延遲是不固定的,所以有時候會發現編號比較小的封包的來回時間差居然比編號比較大的封包來回時間差還要大。在上方的例子中我們就有看到這樣的現象,第六台路由器的延遲比第七台還要大!
你也想試試看 Traceroute 嗎?我們非常推薦你到 http://www.traceroute.org 上試試看。只要從網頁提供的清單上選擇起點和終點, Traceroute 程式就會印出結果。除了這個網站之外,也還有許多免費的圖形化介面版本 Traceroute。本書作者最推薦的其中一個就是 PingPlotter [PingPlotter 2016]。
除了節點處理延遲、傳輸延遲,還有排隊延遲以外,終端系統內還有其他可能會造成重大傳輸延遲的因素。例如:有些終端系統要送封包到共享介質 (shared medium) (像是 Wi-Fi 或是 Cable modem 之類的)上時,會故意在傳送的過程中加上延遲,因為這套傳輸協定是為了跟其他終端系統共享傳輸介質而設計的。我們會在第六章詳細討論這類傳輸協定。另一個重要的延遲類型是 media packetization delay ,這在即時語音通話系統當中非常常見。在語音通話系統中,發話端必須先在封包內填滿已編碼的數位語音訊號,才可以把它送到網際網路上。這個要把封包填滿的所需時間,就叫做 packetization delay ,會大幅影響使用者感受到的通訊品質。這個議題在本章最後的 homework 中會詳細討論。
除了延遲和掉包之外,另一個評估網路效能的重要指標就是端到端吞吐量 (end-to-end throughput)。吞吐量有分兩種,想像主機 A 正在傳送一個大檔案(影片之類的)給主機 B,則
在某些應用程式中,低延遲和穩定的瞬時吞吐量比較重要,如網路電話可能就會希望瞬時吞吐量維持在 24 kbps 左右(如果是視訊電話,則可能需要到 256 kbps 以上);但是在另一些應用程式中,較大的平均吞吐量反而比較重要,偶爾有延遲則可以容忍,如檔案傳輸軟體。
為了讓我們更了解吞吐量這個重要的概念,讓我們來看看以下幾個例子。
在以上的例子中,我們可以發現吞吐量是由資料流經過的一系列線路的傳輸速率,以及當時的網路壅塞程度決定的。
在本章最後的作業和接下來的章節中,我們會更進一步試著去計算網路的吞吐量。
<< 1.3 The Network Core | 目錄 | 1.5 Protocol Layers and Their Service Models >>