Wireshark 中计算的窗口大小

网络工程 线鲨 linux 包分析 数据包跟踪器
2022-02-19 12:51:43

我看到计算的窗口大小在三次握手时设置为 5888,但是在第一次 ACK 时它跳到 7808。有人可以解释一下为什么以及 Linux(Linux OS 和 Wireshark)用来计算这个窗口的算法吗?

我了解窗口缩放概念,此时我没有任何拥塞或启动缓慢。5888 是 SYN。经过两次 seg push 后,2000 在飞行中。所以你现在有 3888 可用。此时您发送 ACK 1001,因此接收器会以更新的窗口大小 (3888+1000=4888) 发出 ACK。但是我看到了7808!如何?我观察到每个 ack 都有这样的增加,无法定量地推断出这一点。

1个回答

这篇文章很好地解释了你所看到的。

你看到的是正常行为。双方都发送一个小的窗口大小,并且都没有宣布他们能够使用窗口缩放。因此,在下一步中,他们都将 TCP 窗口拉高至 64k,以允许其他节点发送更多的数据包,以防有大量数据要传输。

看到这种会话行为是很正常的——只要双方都知道建立了连接以及参数是什么,他们就会简单地调整他们的窗口。

和,

这是为尚未保证建立的连接节省内存。OS/TCP 堆栈需要为传入字节保留与窗口大小(本质上只是一个缓冲区)所承诺的一样多的内存,因此如果您从一开始就在连接上浪费太多内存,您可能会耗尽内存。