跳转到正文
2022-10-23 zh

通信网络如何传递数据:分层、拥塞控制与路由

数据从一个应用到达另一个应用,需要多个环节共同完成:应用产生字节,传输层标识通信端点并按需提供可靠性,IP 负责跨越不同链路传送分组,每段链路再把帧送到下一跳。各层向上提供明确服务,同时隐藏大部分实现细节,复杂网络才得以分工协作。

学习网络时,可以沿一条具体数据流追踪状态存放在哪里,并把交付、可靠性、流量控制、拥塞控制、转发和路由区分开。许多概念混乱,正是因为把这些职责当成了同一件事。

分层是一组接口契约

协议规定对等实体交换报文时所采用的格式、语义和顺序;服务说明一层向上一层提供哪些能力;接口则定义上层如何调用这些能力。三者彼此关联,但不能混为一谈。

应用发送数据时,各层依次加入对等端处理所需的控制信息;接收端再按相反顺序拆除首部。某一层看似直接发生的对等通信,实际上仍要经过所有下层完成传输。正因如此,TCP 才能运行在以太网、Wi-Fi、蜂窝链路或隧道之上,而无需掌握每种介质的信号实现。

分层并不等于各层绝对隔离。路径 MTU、显式拥塞通知、硬件卸载和应用感知传输都会跨越传统边界来改善性能。判断这种耦合是否合理,关键是它有没有破坏清晰的服务契约,而不是它是否严格符合某张分层图。

分组交换会产生排队

分组网络通过统计复用让多条流共享链路。与专用电路不同,普通数据流不会独占整条路径。这样能够提高资源利用率,但分组也可能等待、乱序,或在链路和缓冲区过载时被丢弃。

端到端时延可以分解为

dend-to-end=k=1K(dtx,k+dprop,k+dqueue,k+dproc,k).d_{\mathrm{end\text{-}to\text{-}end}} =\sum_{k=1}^{K}\left(d_{\mathrm{tx},k}+d_{\mathrm{prop},k}+d_{\mathrm{queue},k}+d_{\mathrm{proc},k}\right).

发送时延由分组长度和链路速率决定,传播时延由距离和信号传播速度决定,处理时延来自协议处理,而排队时延取决于竞争流量,通常也是波动最大的一项。因此,链路标称时延较低,并不能保证高负载下仍有较低的尾时延。

交换机和路由器既要查表,也要调度。以太网交换机学习源 MAC 地址,并根据过滤数据库转发帧;IP 路由器在转发信息库中执行最长前缀匹配;FIFO、优先级调度和加权公平队列等规则决定下一个发送的分组,也直接影响公平性与时延隔离。

MPLS 使用由 32 bit 标签项组成的标签栈,并沿标签交换路径转发。它可以简化流量工程,但不会消除路由和排队:控制平面仍要建立路径,每一条输出链路也仍是共享资源。

IP 提供可达性,不保证可靠交付

IP 提供无连接、尽力而为的数据报传输。路由器可以丢弃分组,不同分组也可能经过不同路径。可靠性被有意留给端系统或应用处理,从而让网络核心保持通用。

在协议允许时,IPv4 路由器可以对分组进行分片,不过实际系统通常更倾向于使用路径 MTU 发现并避免分片。IPv6 的基本首部固定为 40 byte,并可携带扩展首部;IPv6 路由器不执行分片,需要分片时由源端完成。ICMP 和 ICMPv6 用于报告差错和辅助诊断,ICMPv6 还承载邻居发现等 IPv6 控制功能,并不是 IPv4 ICMP 的简单改名。

编址和路由也不是一回事。地址在路由体系中标识接口,转发表负责决定下一跳。NAT 会在管理边界改写地址或端口,能够节省公网 IPv4 地址,但也引入了状态,并削弱原有的端到端编址模型。NAT 本身不能充当安全边界。

传输层负责区分应用数据流

UDP 提供带端口和校验和的报文式数据报,但不负责重传、排序或拥塞控制。采用 UDP 的应用需要自行决定哪些能力不可缺少。TCP 提供可靠、有序的字节流;连接由两端地址和端口标识,操作系统再把这条流映射到对应的套接字(socket)。

TCP 通过序号、累积确认、重传计时器和滑动窗口实现可靠传输。接收方通告窗口避免发送方压垮接收端,这属于流量控制;拥塞窗口限制网络中的在途数据量,这属于拥塞控制。发送方同时受到二者约束,因此稳态吞吐量可以粗略估计为

throughputmin(cwnd,rwnd)RTT.\mathrm{throughput}\lesssim\frac{\min(\mathrm{cwnd},\mathrm{rwnd})}{\mathrm{RTT}}.

这只是便于理解的近似上界,并不是完整的 TCP 性能公式。丢包恢复、延迟确认、发送节奏控制(pacing)、应用停顿、接收端行为以及实际启用的拥塞控制算法,都会影响最终吞吐量。

SCTP 在一个关联内提供可靠报文传输、多流和多宿能力。它的 cookie 机制会推迟关联建立期间的状态分配,从而缓解部分资源耗尽攻击,但不能据此认为 SCTP 对拒绝服务攻击免疫。任何协议安全结论都必须说明具体威胁模型。

拥塞控制维持共享链路稳定

流量控制回答接收端能否及时处理数据,拥塞控制回答网络能否承载所有发送方提供的流量。当总到达速率超过瓶颈的服务速率时,队列会持续增长;缓冲区填满后,丢包和重传还可能进一步加重负载。

经典的加性增、乘性减可以概括为

WW+αper round trip,WβWafter congestion,0<β<1.W\leftarrow W+\alpha \quad \text{per round trip}, \qquad W\leftarrow \beta W \quad \text{after congestion},\quad 0<\beta<1.

TCP 还包含慢启动、重传超时和丢包恢复等机制。Reno 在 TCP 发展中影响深远,但不能代表所有现代实现。CUBIC 使用不同的窗口增长规律;按照本文标注的 2022 年日期,当时适用的是信息性 RFC 8312,其设计目标是改善高速、长距离网络上的可扩展性。显式拥塞通知则允许网络在不丢包的情况下传递拥塞信号。

实际排查时,需要查看端点启用的具体算法和真实路径。一次超时可能由拥塞、乱序、无线丢包或突发路由变化引起。没有测量证据时,不能仅凭传输层症状断定唯一原因。

转发是逐包动作,路由负责生成路径信息

转发是数据平面对单个分组执行的本地动作:查找匹配表项,再把分组送往下一跳。路由则是控制平面根据拓扑、可达性、度量和策略创建并更新这些表项的过程。

对于链路代价为 wew_e 的图,最短路径路由求解

P=arg minPP(s,t)ePwe.P^\star=\underset{P\in\mathcal{P}(s,t)}{\operatorname{arg\,min}}\sum_{e\in P}w_e.

距离向量协议与邻居交换距离估计;链路状态协议泛洪拓扑信息,再由每台路由器独立计算路径。OSPF 是链路状态型内部网关协议。BGP 在自治系统之间交换可达性和路径属性,其决策受到策略约束,不能简化成全局最短路径问题。

路由信息库可以保存由直连接口、静态配置和多个路由协议产生的候选路由;选中的路由再被安装到适合高速查找的转发信息库中。所谓收敛,是指网络变化后路由状态完成调整。在过渡阶段,不同设备的状态可能暂时不一致,从而造成环路、黑洞或乱序。

排障时逐层验证

有效的网络排障应沿分组经过的路径逐项检查:

  1. 解析目标名称,并确认使用的地址族。
  2. 检查本地路由和下一跳。
  3. 验证链路可达性与路径 MTU。
  4. 在负载下测量丢包、RTT 分布和排队时延。
  5. 检查传输层状态、重传、窗口以及正在使用的拥塞控制算法。
  6. 把应用行为与网络可达性分开测试。

没有哪一个指标能够解释整条路径。ping 成功不能证明 TCP 服务正常,TCP 能够建立连接也不能保证吞吐量达标,平均时延还可能掩盖严重的尾时延。分层的价值在于帮助我们组织证据,而不是背诵协议名称。

延伸阅读