【发布时间】:2022-09-26 16:14:03
【问题描述】:
我试图了解 TCP 是如何工作的,我对接收器窗口 (rwnd) 对拥塞窗口 (cwnd) 的(不存在)影响感到有点惊讶。
从我读到的内容(主要是wikipedia 和RFC5681),我了解到如果尚未达到慢启动阈值(ssthresh)但传输速率受 rwnd 限制(因为它是 rwnd 和cwnd) 如果没有丢失或超时,则 cwnd 在慢启动阶段(甚至在避免拥塞期间)继续增加。这意味着 cwnd 可能会达到一个非常高的值,因为 ssthresh 的初始值非常大。
请参阅以下引文以确认我的推论:
实施说明:一个容易犯的错误是简单地使用 cwnd,
而不是 FlightSize,在某些实现中可能
偶然增加远远超出 rwnd.
[来自 RFC5681(RFC 的这一部分是关于在丢失后为 ssthresh 设置新值)]在这种情况下,是否可以:
- 以相对较低的传输速率保持连接(例如,在每个 ack 中将 rwnd 设置为 10mss)以保证没有丢失,因此保持连接处于慢启动阶段,
- 等待足够的时间让 cwnd 变得非常大(比如链接可以处理的 10 倍),然后
- 将rwnd 设置为更大的值,让传输速率仅受cwnd 限制?
这将导致链路上出现大量拥塞,特别是因为服务器需要花费大量时间才能通过超时注意到丢失并将 cwnd 重置回其初始值......这可能会产生巨大的对使用相同链路或至少相同瓶颈链路的其他连接的影响。
我会想象,一旦达到 rcwnd,慢启动算法就会停止,拥塞避免将开始对网络中的任何新变化(或 rwnd 增加)做出反应。