往返时延与分组间隔
制外的量 · 以 SI 秒表示 · RTT 与分组之间的 Δt
一九八三年,迈克·缪斯在查一处网络故障时,用一个晚上写了个小程序:给某台机器发一条短短的请求,把等到回话所耗的时间打出来。名字取自声呐的人:潜艇放出一声轻响,听那回声,距离便从一个时间差里算出来。这个测量的习惯里生出了这个单位——记下的既不是去路,也不是回路,而是整整一圈。
其中的妙处在于,往返是用一只钟量的:请求从哪台机器出去,回话就到哪台机器,因此读数之差并不取决于对面那头的钟对不对得上。单程的时延就没这么容易得手——它要求两头的钟对得比时延本身还细,也就是要么另有一套传递时刻的规程,要么两端各装一台收卫星时刻的机子。
01 · 定义
往返时延,是一个分组发出与它的回话到达之间的一段时间,由同一只钟量出。分组间隔,是同一道流里相邻两个分组放出来的时间之差;它不由网络定,而由往网络上压担子的人定。
往返由三项性质不同的东西凑成,把它们分清是要紧的,因为每一项的治法都不一样。头一项是传播的时间,由通路的长度和光在纤芯里的速度定下,除了更短的缆子,它对什么都不让步。第二项是串行化,把分组推进线路所用的时间,线路越快它越小。第三项是中间节点缓冲里的排队,也只有它,取决于网络此刻究竟有多忙。
由此引出一件不甚显眼的事:线路可以拓宽十倍,而往返却分毫不动,因为拓宽只去掉串行化,队列和通路的长度仍旧留在原处。更要命的是,那些「以防万一」留足余地做出来的缓冲里,分组并不丢,只是候着,负载之下往返便涨到以秒计——这便是后来被叫作 bufferbloat 的那桩祸事。
分组间隔并非偶然摆在旁边:一道流上发生的事,几乎全由间隔与往返之比来决定。只要分组出去的次数多过确认回来的次数,发送方就是在摸黑干活,必须在通路里存下它实际装得下的那么多数据——而这个量,恰恰就是速率与往返的乘积。
选一条通路,把滑块在分组大小上来回推。蓝色的分组从左边机架去右边,橙色地回来;通路下方那条带子把往返拆成三项,好看清它究竟耗在哪里。把线路拓宽,只缩短中间那一段——而在长通路上,这一段本就最小。
内存降价,比算法改变来得早;厂家便往设备里塞下几百个分组的队列,以为缓冲多些总不至于坏事。结果恰恰相反:满了的队列并不丢分组,只是把它们扣住,发送方收不到任何拥塞的信号,于是接着往里压。一条家用线路上,负载之下往返涨到一秒半,而速率还是原来那个数。
02 · 换算
往返、管道与分组流
往返用什么单位填都行,卡片会把它折算成别的,随后算出与它相关的那些:不同速率下通路里能装多少数据,窗口定下什么样的上限,各种编码器又挑什么样的分组间隔。
算容量用的速率,取自交互部分里选定的那条通路;在细项设置中可固定为一吉比特。
ping 量的并不完全是应用程序所需要的那件事。远端节点对回显请求的处理走的是另一条道,常常绕过主计算部分,因此它的时延与真实连接的时延对不上;另一些设备则把这类请求排在最后才答,或者干脆不答。所以大的 ping 未必意味着慢的连接,小的也担保不了快。
| 数值 | 说明 | ||
|---|---|---|---|
| {u} | {name} | {value} | {note} |
03 · 数量级
对数标度:从微秒到秒04 · 测量仪器
往返时延用什么来捉
程序发出一个带时间戳的分组,等它回来,读数之差就是往返。它的长处在于一只钟足矣,对面除了肯答之外别无所求;它的短处在于,对面是从另一条不一定快的道上答的。
把整场来往都录下来,往返便可从流本身取得:从一个段出去到它的确认回来的那段时间。这样量到的,正是应用程序所见的时延,而且离散也一并现了形——在通话里,它比均匀的时延更碍事。
那些直接在网卡芯片里盖时间戳的设备,去掉了操作系统带进来的不确定,把分辨率压到几十纳秒。它们按另一套约定交换,两端各盖两个戳——正是这一点,才使往返能拆成不相等的两半。
单程的时延,只有在两端的钟被对到比时延本身还细的共同时刻上,才量得出来——为此要用一套专门的同步规程把线路标定,或者装上收卫星时刻的机子。没有这些,往返便是唯一老实的数。
05 · 书写规则
往返带单位,抖动另记
记号用三个大写拉丁字母写,不加点;数值带上单位,并注明究竟量的是什么:单次取样、一列的平均,还是它的中位数。离散另作一个数写在旁边,因为单凭平均,说不出分组走得匀不匀。
头一种写法连单位都省了,连同意思一起省掉:一百三十个什么——毫秒还是微秒?第二种把假定当成测量,可去路与回路常走不同的道,两半并不相等。第三种重复着最常见的错处,把往返当成线路的性质,而不是整条通路的。第四种把两个量混作一谈:分组之间的间隔并不是往返。
07 · 历史部分
一声轻响与回声
当加州大学与门洛帕克的研究所之间传第一个词时,操作员在电话里一个字母一个字母地念,一个字母一个字母地等确认。连接在第三个字母上断了,可这套做法本身——发出去、等回话、看钟——恰恰就是沿用至今的那一套。
迈克·缪斯查故障时用一个晚上写成了他的程序,名字取自回声测深仪的声响:短短一击,随后等那一返。这名字取得如此贴切,以致「ping 一下」这个说法远远越出了网络这一行,如今指的是任何一条短消息,发出去只为看看那头有没有人。
一九八六年秋,一条大学线路的吞吐跌了一千倍:发送方收不到确认,便一遍遍地发新的副本,把通路彻底压垮。范·雅各布森提出的救法沿用至今:盯住往返和它的离散,把两者的增长当作拥塞的信号,也就是在丢失开始之前就先把发送勒住。
当今的流控算法不再盯着丢失,而是直接盯着往返怎样往上涨,赶在队列填满之前就把发送勒住。家用路由器也有了刻意把缓冲留短的调度——同一条线路上,负载之下的往返便从一秒半跌到几十毫秒。
往返的一半是假定,不是测量
往返方便就方便在不要求两只钟对得上:发出与收到都由同一台设备盖戳,两套刻度的偏差压根进不到差值里去。正因如此,ping 到处都能用,也不必调;而单程的时延则是个脾气大得多的量,它要求的同步比所量的东西还细。
把往返一劈两半的习惯所以能立住,虽说没多少道理:去对面的流与回来的流,常走不同的路由,长短不同,负载也不同,真正的两半可以差上一倍。整个网络这一行里最容易量的那个量,同时也是最常被读错的那个。
目录 · 计量单位
每个量都有一份档案
七个 SI 基本单位,二十二个有专名的导出单位,以及若干制外量 — 少了它们,工程与历法都转不动。