tcp - 为什么我收到缩小窗口的 tcp 段?

标签 tcp

我在笔记本电脑上使用 Wireshark 捕获数据包,发现服务器发送的数据包缩小了其接收窗口。这是从我的 ubuntu18.04 到“connectivity-check.ubuntu.com”的连接。

我读了rfc793和TCPIP Illustration volumn1,两者都说“强烈不鼓励缩小窗口”。

这是 Wireshark 的输出。我在 Wireshark 中禁用 HTTP 解析以防止分心。

   4198 0.026547255    2019-04-03 12:27:48.870761715 192.168.3.141         35.222.85.5           TCP      74     53846 → 80 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=3960112411 TSecr=0 WS=128
   4199 0.281380222    2019-04-03 12:27:49.152141937 35.222.85.5           192.168.3.141         TCP      74     80 → 53846 [SYN, ACK] Seq=0 Ack=1 Win=28160 Len=0 MSS=1412 SACK_PERM=1 TSval=2281826280 TSecr=3960112411 WS=128
   4200 0.000092140    2019-04-03 12:27:49.152234077 192.168.3.141         35.222.85.5           TCP      66     53846 → 80 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=3960112693 TSecr=2281826280
   4201 0.000191823    2019-04-03 12:27:49.152425900 192.168.3.141         35.222.85.5           TCP      153    53846 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=87 TSval=3960112693 TSecr=2281826280
   4202 0.306769219    2019-04-03 12:27:49.459195119 35.222.85.5           192.168.3.141         TCP      66     80 → 53846 [ACK] Seq=1 Ack=88 Win=26112 Len=0 TSval=2281826585 TSecr=3960112693
   4203 0.000076022    2019-04-03 12:27:49.459271141 35.222.85.5           192.168.3.141         TCP      214    80 → 53846 [PSH, ACK] Seq=1 Ack=88 Win=26112 Len=148 TSval=2281826586 TSecr=3960112693
   4204 0.000028644    2019-04-03 12:27:49.459299785 192.168.3.141         35.222.85.5           TCP      66     53846 → 80 [ACK] Seq=88 Ack=149 Win=30336 Len=0 TSval=3960113000 TSecr=2281826586
   4205 0.000045328    2019-04-03 12:27:49.459345113 35.222.85.5           192.168.3.141         TCP      66     80 → 53846 [FIN, ACK] Seq=149 Ack=88 Win=26112 Len=0 TSval=2281826586 TSecr=3960112693
   4206 0.000183562    2019-04-03 12:27:49.459528675 192.168.3.141         35.222.85.5           TCP      66     53846 → 80 [FIN, ACK] Seq=88 Ack=150 Win=30336 Len=0 TSval=3960113000 TSecr=2281826586
   4207 0.245163856    2019-04-03 12:27:49.704692531 35.222.85.5           192.168.3.141         TCP      66     80 → 53846 [ACK] Seq=150 Ack=89 Win=26112 Len=0 TSval=2281826890 TSecr=3960113000

正如捕获的结果所示,服务器的第 4199 帧通告了一个大小为 28160 的窗口,但是在 4201 中接收到 87 字节的数据后,窗口在 4202 中缩小到 26112,正好等于 2048(这是因为服务器只是换出了一个内存页?)

我想知道服务器缩小 TCP 接收窗口的原因是什么? RFC 强烈反对这种行为,我认为这种行为不会在操作系统内的 TCPIP 堆栈中实现。

最佳答案

这是正常行为。当服务器在其缓冲区中接收到数据并且无法立即将其发送到应用程序层时,它会减小通告的窗口大小以防止丢弃接收到的数据包。 您将此预期行为与窗口缩小问题混淆了,当我们将发送者缓冲区的右边缘向左移动时,就会发生窗口缩小问题。

您可以引用以下内容以获取有关窗口缩小问题的更多指导:http://www.tcpipguide.com/free/t_TCPWindowManagementIssues.htm

关于tcp - 为什么我收到缩小窗口的 tcp 段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55489787/

相关文章:

Scala Akka TCP 角色

c++ - ASIO 直接从异步解析中获取 tcp 端点

perl - 如何在 Net::RawIP 中指定包数据?

python - requests 的 stream=True 选项如何一次一个 block 地流式传输数据?

java - Java 中的多位 TCP 请求

language-agnostic - 基于 TCP/IP 的语音通信

c++ - TCP/IP IOCP 接收的数据有时会损坏 - Windows 上的 Visual C++

http - node.js 中的 TCP/HTTP 代理

c# - 远程交易

sockets - Wireshark 中的 [TCP ACKed unseen segment] 等是什么?