摘要

  • RFC 3081 用一条 TCP 连接承载一个 BEEP 会话,但 TCP 的连接级流量控制不能证明其中每条通道都有进展。
  • 新通道初始获得 4096 octets 的接收额度;SEQ 帧更新通道自己的边界并享有调度优先,轮转建议则避免繁忙通道吞掉所有服务机会。

字节没有丢,任务却可能一直不动

想象四条应用通道共用一个 TCP 流。三端读取很快,第四端读取很慢,而它的发送者正好有一大段响应。TCP 仍会按序交付、重传丢失字节、照管整条连接的拥塞。可那段大响应依然可能占住共同路径,让三项短工作在后面等待。

这里没有可靠性故障。出问题的是可靠载体内部的资源分配。

2001 年 3 月发布的 Standards Track RFC 3081,规定了 BEEP 如何运行在 TCP 之上:一个 BEEP 会话对应一条已建立的 TCP 连接,BEEP frame 作为字节进入该流。映射很简单,设计者却没有因此省略隔离问题。规范明确指出,只依赖 TCP 的单一流量控制,逻辑通道之间可能发生饥饿,甚至死锁。

TCP 只有连接账本

TCP 看不到哪些字节属于会话控制,哪些属于一项短查询,哪些又是一段批量输出。通道含义存在于 TCP 之上。RFC 3081 因而给每条 BEEP 通道设置独立滑动窗口。

通道创建时可以发送 4096 octets 的 payload。接收方随后用 SEQ 帧通告下一个期望序列号以及愿意接收的窗口大小。二者合成该通道当前的上界。发送方一旦触及上界,就必须停住这一条通道,即使底层 TCP 写缓冲区仍有空位。

这不是第二套重传。排序与可靠交付仍由 TCP 完成。BEEP 的序列计算回答另一个问题:这条具体通道还能向共享连接引入多少应用负载?

计数器终究会回绕。RFC 3081 引用 RFC 1982 的 serial number arithmetic,并限制窗口范围,使比较仍然明确。否则,一个旧位置可能在回绕后伪装成新的发送权。

解除堵塞的信号不能被堵在后面

额度更新只有抵达发送方才有意义。如果 SEQ 与普通数据排在同一条队里,而且恰好被它要解除的负载挡住,反馈回路就会停摆。规范因此让 SEQ 优先于其他 frame 发送。

这种优先级不是说控制消息“更重要”,而是承认因果次序。接收方必须先说“这条通道现在还能前进”,发送方才能合法放入更多负载。控制路径若没有逃生口,流量控制自身就可能制造死锁。

对于同等优先级的通道,RFC 3081 建议 round-robin。它没有承诺相同延迟,也没有宣称能跨越所有操作系统缓存实现数学上的公平。它给出的是最低服务纪律:不能因为一条通道始终有数据,就永远不给已经就绪的邻居轮次。

慢读者还在协议上方

字节抵达 TCP、进入 BEEP 接收窗口、交给目标应用、产生外部效果,是四张不同回执。RFC 1122 早已把 TCP 界定为可靠字节流,而不是应用事务完成器;今天的 RFC 9293 仍保留这条边界。

后来的具体 profile 说明了为什么不能越级推断。RFC 3195 用 BEEP 传送可靠 syslog,RFC 4744 用 BEEP 承载 NETCONF。序列号向前,不代表日志已经安全落地;通道获得新额度,也不代表网络配置已经生效。最终效果只能由拥有该语义的应用层证明。

窗口是一项有限授权

接收方承担缓存与交付成本,所以控制逐通道额度。发送方在有额度的通道之间选择下一个服务对象,并受优先规则约束。TCP 继续控制连接级可靠性与拥塞。应用则决定何时算作有用工作。

这些权力相邻,却不能互相代签。TCP 有空间,不等于某条 BEEP 通道有发送权;BEEP 收到数据,不等于应用完成处理;轮转器给过机会,也不等于下游结果已经出现。

RFC 3081 留下的历史经验不只属于 BEEP。给共享线路画出几条“车道”,并不会自动产生独立性。真正的独立需要分别记账,需要控制反馈不被受控流量埋没,还需要一条可观察的调度规则,防止合法使用者悄悄变成共同资源的唯一主人。

来源

  1. https://www.rfc-editor.org/info/rfc3081
  2. https://www.rfc-editor.org/rfc/rfc3081.html
  3. https://datatracker.ietf.org/doc/rfc3081/
  4. https://www.rfc-editor.org/rfc/rfc3080.html
  5. https://www.rfc-editor.org/rfc/rfc1982.html
  6. https://www.rfc-editor.org/rfc/rfc1122.html
  7. https://www.rfc-editor.org/rfc/rfc9293.html
  8. https://www.rfc-editor.org/rfc/rfc3195.html
  9. https://www.rfc-editor.org/rfc/rfc4744.html
  10. https://heng.lu/running-code-primary-the-patch-needed-to-preserve-the-internet-original-design/
  11. https://heng.lu/minimum-initial-specification-localized-future-decision-voluntary-adoption-internet-coordination-system/
  12. https://heng.lu/on-reality-layers-symbolic-power-and-why-clarity-feels-so-hostile/