來回時間與封包間隔
制外的量 · 以 SI 秒錶示 · RTT 與封包之間的 Δt
一九八三年,邁克·繆斯在查一處網路故障時,用一個晚上寫了個小程式:給某臺機器發一條短短的請求,把等到回話所耗的時間打出來。名字取自聲吶的人:潛艇放出一聲輕響,聽那回聲,距離便從一個時間差裡算出來。這個測量的習慣裡生出了這個單位——記下的既不是去路,也不是迴路,而是整整一圈。
其中的妙處在於,往返是用一隻鍾量的:請求從哪臺機器出去,回話就到哪臺機器,因此讀數之差並不取決於對面那頭的鐘對不對得上。單程的延遲就沒這麼容易得手——它要求兩頭的鐘對得比延遲本身還細,也就是要麼另有一套傳遞時刻的協定,要麼兩端各裝一臺收衛星時刻的機子。
01 · 定義
來回時間,是一個封包發出與它的回話到達之間的一段時間,由同一只鍾量出。封包間隔,是同一道流裡相鄰兩個封包放出來的時間之差;它不由網路定,而由往網路上壓擔子的人定。
往返由三項性質不同的東西湊成,把它們分清是要緊的,因為每一項的治法都不一樣。頭一項是傳播的時間,由通路的長度和光在纖芯裡的速度定下,除了更短的纜子,它對什麼都不讓步。第二項是序列化,把封包推進線路所用的時間,線路越快它越小。第三項是中間節點緩衝區裡的排隊,也只有它,取決於網路此刻究竟有多忙。
由此引出一件不甚顯眼的事:線路可以拓寬十倍,而往返卻分毫不動,因為拓寬只去掉序列化,佇列和通路的長度仍舊留在原處。更要命的是,那些「以防萬一」留足餘地做出來的緩衝區裡,封包並不丟,只是候著,負載之下往返便漲到以秒計——這便是後來被叫作 bufferbloat 的那樁禍事。
封包間隔並非偶然擺在旁邊:一道流上發生的事,幾乎全由間隔與往返之比來決定。只要封包出去的次數多過確認回來的次數,傳送方就是在摸黑幹活,必須在通路里存下它實際裝得下的那麼多資料——而這個量,恰恰就是速率與往返的乘積。
選一條通路,把滑塊在封包大小上來回推。藍色的封包從左邊機櫃去右邊,橙色地回來;通路下方那條帶子把往返拆成三項,好看清它究竟耗在哪裡。把線路拓寬,只縮短中間那一段——而在長通路上,這一段本就最小。
記憶體降價,比演算法改變來得早;廠家便往裝置裡塞下幾百個封包的佇列,以為緩衝區多些總不至於壞事。結果恰恰相反:滿了的佇列並不丟封包,只是把它們扣住,傳送方收不到任何擁塞的訊號,於是接著往裡壓。一條家用線路上,負載之下往返漲到一秒半,而速率還是原來那個數。
02 · 換算
往返、管道與封包流
往返用什麼單位填都行,卡片會把它折算成別的,隨後算出與它相關的那些:不同速率下通路里能裝多少資料,視窗定下什麼樣的上限,各種編碼器又挑什麼樣的封包間隔。
算容量用的速率,取自互動部分裡選定的那條通路;在細項設定中可固定為一吉位元。
ping 量的並不完全是應用程式所需要的那件事。遠端節點對回顯請求的處理走的是另一條道,常常繞過主計算部分,因此它的延遲與真實連線的延遲對不上;另一些裝置則把這類請求排在最後才答,或者乾脆不答。所以大的 ping 未必意味著慢的連線,小的也擔保不了快。
| 數值 | 說明 | ||
|---|---|---|---|
| {u} | {name} | {value} | {note} |
03 · 數量級
對數標度:從微秒到秒04 · 測量儀器
來回時間用什麼來捉
程式發出一個帶時間戳的封包,等它回來,讀數之差就是往返。它的長處在於一隻鍾足矣,對面除了肯答之外別無所求;它的短處在於,對面是從另一條不一定快的道上答的。
把整場來往都錄下來,往返便可從流本身取得:從一個段出去到它的確認回來的那段時間。這樣量到的,正是應用程式所見的延遲,而且離散也一併現了形——在通話裡,它比均勻的延遲更礙事。
那些直接在網絡卡晶片裡蓋時間戳的裝置,去掉了作業系統帶進來的不確定,把解析度壓到幾十納秒。它們按另一套約定交換,兩端各蓋兩個戳——正是這一點,才使往返能拆成不相等的兩半。
單程的延遲,只有在兩端的鐘被對到比延遲本身還細的共同時刻上,才量得出來——為此要用一套專門的同步協定把線路標定,或者裝上收衛星時刻的機子。沒有這些,往返便是唯一老實的數。
05 · 書寫規則
往返帶單位,抖動另記
記號用三個大寫拉丁字母寫,不加點;數值帶上單位,並註明究竟量的是什麼:單次取樣、一列的平均,還是它的中位數。離散另作一個數寫在旁邊,因為單憑平均,說不出封包走得勻不勻。
頭一種寫法連單位都省了,連同意思一起省掉:一百三十個什麼——毫秒還是微秒?第二種把假定當成測量,可去路與迴路常走不同的道,兩半並不相等。第三種重複著最常見的錯處,把往返當成線路的性質,而不是整條通路的。第四種把兩個量混作一談:封包之間的間隔並不是往返。
07 · 歷史部分
一聲輕響與回聲
當加州大學與門洛帕克的研究所之間傳第一個詞時,操作員在電話裡一個字母一個字母地念,一個字母一個字母地等確認。連線在第三個字母上斷了,可這套做法本身——發出去、等回話、看鐘——恰恰就是沿用至今的那一套。
邁克·繆斯查故障時用一個晚上寫成了他的程式,名字取自回聲測深儀的聲響:短短一擊,隨後等那一返。這名字取得如此貼切,以致「ping 一下」這個說法遠遠越出了網路這一行,如今指的是任何一條短訊息,發出去只為看看那頭有沒有人。
一九八六年秋,一條大學線路的傳輸量跌了一千倍:傳送方收不到確認,便一遍遍地發新的副本,把通路徹底壓垮。範·雅各布森提出的救法沿用至今:盯住往返和它的離散,把兩者的增長當作擁塞的訊號,也就是在丟失開始之前就先把傳送勒住。
當今的流控演算法不再盯著丟失,而是直接盯著往返怎樣往上漲,趕在佇列填滿之前就把傳送勒住。家用路由器也有了刻意把緩衝區留短的排程——同一條線路上,負載之下的往返便從一秒半跌到幾十毫秒。
往返的一半是假定,不是測量
往返方便就方便在不要求兩隻鍾對得上:發出與收到都由同一臺裝置蓋戳,兩套刻度的偏差壓根進不到差值裡去。正因如此,ping 到處都能用,也不必調;而單程的延遲則是個脾氣大得多的量,它要求的同步比所量的東西還細。
把往返一劈兩半的習慣所以能立住,雖說沒多少道理:去對面的流與回來的流,常走不同的路由,長短不同,負載也不同,真正的兩半可以差上一倍。整個網路這一行裡最容易量的那個量,同時也是最常被讀錯的那個。
目錄 · 計量單位
每個量都有一份檔案
七個 SI 基本單位,二十二個有专名的導出單位,以及若干制外量 — 少了它們,工程与曆法都轉不動。