Appearance
附录 A:其他实现说明
本附录收录了 TCP 实现决策的补充说明与参考资料,这些内容目前尚未纳入 RFC 系列或 TCP 标准。实现者可以酌情参考这些项目,但 IETF 尚未就将其纳入标准达成共识。
A.1. IP 安全隔离域和优先级
IPv4 规范在(现已废止的)服务类型(TOS)字段中规定了优先级值。RFC 1349 曾修改该字段,随后该字段又因差分服务(Diffserv)的定义而废止。现行 TCP 规范已不再沿用以往在网络层、TCP 实现与应用之间设置并传递 TOS 的做法,转而采用 Diffserv。
RFC 793 要求检查入站 TCP 报文段的 IP 安全隔离域与优先级,确保二者在连接内部保持一致,并符合应用的请求。这两类 IP 机制后来均已过时,但 RFC 793 并未得到相应的明确更新。RFC 2873(标准轨道)解决了优先级问题,现行 TCP 规范已纳入这些变更。不过,对于多级安全(MLS)系统可能用到的 IP 安全选项,IETF 目前尚未完全明确其状态。
当入站分组不符合预期的安全隔离域或优先级时便复位连接,这种做法已被确认为一种潜在的攻击向量。也有人讨论过修改 TCP 规范,以避免因 IP 安全隔离域或 Diffserv 代码点值不匹配而中断连接。
A.1.1. 优先级
在 Diffserv 中,原先的优先级值被当作 Class Selector 代码点处理,Diffserv 架构描述了相应的兼容处理方式。由 RFC 793 和 RFC 1122 定义的 TCP 规范包含如下逻辑:连接采用任一端应用所请求的最高优先级,并在整个连接期间保持一致。这些源自已废止 TOS 的逻辑并不适用于 Diffserv,不应纳入 TCP 实现;不过,在连接期间修改 Diffserv 值仍属不鼓励的做法。相关讨论见 RFC 7657 第 5.1、5.3 和 6 节。
已废止的 TOS 处理规则假定连接两端使用双向(即对称)的优先级值,而 Diffserv 架构本身是非对称的。RFC 2873 分析了旧 TCP 逻辑在这方面的问题,并给出解决方案:在 TCP 中忽略 IP 优先级。尽管 RFC 2873 未标记为对 RFC 793 的更新,但它是标准轨道文档,因此现有实现应能稳健地处理这些情况。需要注意的是,各方向所使用的 Diffserv 字段值属于 TCP 与网络层之间的接口范畴,TCP 与应用可以在两个方向上传递这些值。
A.1.2. MLS 系统
RFC 791 定义了 IP Security Option(IPSO)及隔离域,RFC 1038 对其作了细化,后又由 RFC 1108 取代。Commercial IP Security Option(CIPSO)定义于 FIPS-188(该标准已于 2015 年被 NIST 撤回),部分厂商和操作系统仍支持该选项。RFC 1108 目前已被列为 Historic,但 RFC 791 本身尚未更新,IP Security Option 仍未从中移除。IPv6 也定义了类似的 Common Architecture Label IPv6 Security Option(CALIPSO,见 RFC 5570)。
RFC 793 的逻辑将 IP 安全/隔离域信息纳入 TCP 报文段的处理流程。本文所提及的 IP“安全/隔离域”,对多级安全(MLS)系统的实现者而言可能仍有意义;对于非 MLS 实现,可依据互联网实际运行代码的通行做法予以忽略。更多讨论见附录 A.1。RFC 5570 还描述了若干可能用到 IPSO、CIPSO 或 CALIPSO 的 MLS 网络场景;在这类特殊场景中,TCP 实现者应参照 RFC 5570 第 7.3.1 节的指导行事。
A.2. 序列号验证
在某些情况下,TCP 的序列号验证规则会导致 ACK 字段无法得到处理,进而引发连接问题。RFC 5927 讨论了这些问题,涉及同时打开、自连接、同时关闭以及同时窗口探测等场景。该文档还提出了 TCP 规范的潜在修改方向:通过放宽可接受的序列号范围来缓解上述问题。
在互联网上的 TCP 实际使用中,这些情况很少出现。各主流操作系统实现了不同的替代性缓解方案;标准尚未更新以指定其中任何一种,但实现者仍应考虑 RFC 5927 所描述的问题。
A.3. Nagle 修改
主流操作系统通常已实现 Nagle 算法和延迟确认,且默认启用。许多应用采用请求-响应式通信,Nagle 算法与延迟确认叠加使用时,可能导致这类应用性能不佳。RFC 896 中建议的一项修改描述了改善此类应用表现的方法。
部分主流操作系统已实现该修改,且该修改不会影响 TCP 的互操作性。由于套接字选项通常支持直接关闭 Nagle 算法,许多应用也选择将其禁用。TCP 标准尚未纳入这项 Nagle 修改,但实现者可以权衡其收益。
A.4. 低水位设置
部分操作系统内核的 TCP 实现提供了套接字选项,用于指定缓冲区需积累多少字节后,套接字层才将发送数据移交 TCP(SO_SNDLOWAT),或在接收方向上将数据移交应用(SO_RCVLOWAT)。
此外,还可通过另一个套接字选项(TCP_NOTSENT_LOWAT)控制写队列中未发送字节的数量。这有助于发送方 TCP 应用避免积压大量缓冲数据及其带来的延迟。例如,当应用将多条上层数据流复用到同一条连接,且这些数据流同时包含交互式/实时数据与批量数据传输时,该选项可能十分有用。