【问题标题】:Why isn't cwnd restricted by rwnd in a TCP connection?为什么在 TCP 连接中 cwnd 不受 rwnd 限制?
【发布时间】:2022-09-26 16:14:03
【问题描述】:

我试图了解 TCP 是如何工作的,我对接收器窗口 (rwnd) 对拥塞窗口 (cwnd) 的(不存在)影响感到有点惊讶。
从我读到的内容(主要是wikipediaRFC5681),我了解到如果尚未达到慢启动阈值(ssthresh)但传输速率受 rwnd 限制(因为它是 rwnd 和cwnd) 如果没有丢失或超时,则 cwnd 在慢启动阶段(甚至在避免拥塞期间)继续增加。这意味着 cwnd 可能会达到一个非常高的值,因为 ssthresh 的初始值非常大。 请参阅以下引文以确认我的推论:

实施说明:一个容易犯的错误是简单地使用 cwnd,
而不是 FlightSize,在某些实现中可能
偶然增加远远超出 rwnd
.
[来自 RFC5681(RFC 的这一部分是关于在丢失后为 ssthresh 设置新值)]

在这种情况下,是否可以:

  1. 以相对较低的传输速率保持连接(例如,在每个 ack 中将 rwnd 设置为 10mss)以保证没有丢失,因此保持连接处于慢启动阶段,
  2. 等待足够的时间让 cwnd 变得非常大(比如链接可以处理的 10 倍),然后
  3. 将rwnd 设置为更大的值,让传输速率仅受cwnd 限制?

    这将导致链路上出现大量拥塞,特别是因为服务器需要花费大量时间才能通过超时注意到丢失并将 cwnd 重置回其初始值......这可能会产生巨大的对使用相同链路或至少相同瓶颈链路的其他连接的影响。

    我会想象,一旦达到 rcwnd,慢启动算法就会停止,拥塞避免将开始对网络中的任何新变化(或 rwnd 增加)做出反应。

    标签: tcp cwnd


    【解决方案1】:

    根据https://stackoverflow.com/a/21775731/20003316,当发送速率由应用程序控制(= 发送速率由 rwnd 而不是 cwnd 控制)时,TCP 的 Linux 实现不允许 cwnd 增加。
    通过更深入地研究这一点,我发现实际上有一个 RFC 处理这个问题:https://www.rfc-editor.org/rfc/rfc7661#page-10

    基本上,如果当前窗口中的 ACK 数量小于 0.5*cwnd,那么 TCP 实现一定不能增加 cwnd 的值。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2022-01-10
    • 2010-09-29
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多