在 TCP 连接上,接收方可以控制发送方使用的 TCP 窗口大小吗?

在 TCP 连接上,接收方可以控制发送方使用的 TCP 窗口大小吗?

TCP 窗口大小是发送方在等待 TCP 确认之前将发送的数据量。接收方是否有办法控制它(例如,作为 TCP 握手的一部分),还是只有发送方可以控制?

答案1

是的,接收方可以在整个 TCP 通信过程中动态控制 TCP 窗口大小,而不仅仅是在握手时,如RFC 793

流量控制:

TCP 为接收方提供了一种控制发送方发送数据量的方法。这是通过以下方式实现的每次 ACK 都返回一个“窗口”指示成功接收的最后一个段之外的可接受序列号范围。 该窗口指示发送方可以传输的八位字节数在获得进一步许可之前。

由于您添加了中,TCP 窗口缩放只是一个乘数,用于克服最大窗口大小的初始限制 64k。这是在初始 TCP 握手中使用 TCP 选项进行协商的,如中所述RFC 7323

<SYN,ACK> 窗口缩放选项协商 TCP 会话的基本参数。因此,它仅在初始握手期间发送。此外,只有在初始段中收到相应选项时, 才会在段中发送窗口缩放选项<SYN>

....

此选项可在初始段中发送(即, SYN 位打开且 ACK 位关闭的<SYN>段)。如果 在初始段中收到了窗口缩放选项,则此选项可 在段中发送。没有 SYN 位的段中的窗口缩放选项 必须被忽略。

<SYN>
<SYN,ACK>

因此,此缩放因子以后无法更改。下文将进一步描述那里

窗口比例扩展将 TCP 窗口的定义扩展
到 30 位,然后使用隐式比例因子将此
30 位值承载在 TCP 标头的 16 位窗口字段中([RFC0793] 中的 SEG.WND)。比例因子的指数承载在 TCP
选项“窗口比例”中。此选项仅在段中发送(带有 SYN 位的段),因此打开连接时,每个方向的窗口比例都是固定的。


下面是一个极端和异常的窗口控制“滥用”的例子,它来自接收器,用于延迟传播蠕虫的扫描:Linux iptables 的TARPIT基于 LaBrea 的附加目标焦油坑(吉姆·麦克拉格,2001 年PDF):

TARPIT
不使用本地连接资源来捕获并保存传入的 TCP 连接。
[...] 像监听服务器一样运行,但除了发送 ACK 或 RST 外,不发送任何数据。[...]
--tarpit
此模式完成与攻击者的连接,但将窗口大小限制为 0,从而使攻击者等待很长时间。当他保持连接状态并尝试每 60-240 秒继续时,我们不会保留任何内容,因此它非常轻量。关闭连接的尝试将被忽略,迫使远程端在 12-24 分钟内超时连接。此模式是默认模式。

相关内容