1

在这种情况下看到了一个奇怪的情况:

  1. 发送 HTTP 请求时带有 TCP 标志 NO_DELAY(即禁用 Nagle 算法);
  2. WireShark 不捕获带有 HTTP 动词和标头的 TCP 数据包 - 仅看到带有 HTTP 正文的数据包(数据包丢失了吗?);
  3. 带有 ACK 的远程主机响应表明并非所有数据都得到确认;
  4. 发生 TCP 重新传输,现在 WireShark 捕获 HTTP 动词和标头。

来自 WireShark 的 TCP 流

更多注释:

  1. 如果 Nagle 算法为 ON,则看不到数据包丢失或重新传输;
  2. 该问题在两个不同的网络中得到验证,因此该问题几乎与网络环境无关(除了主机是虚拟机这一事实);
  3. 使用 c# HttpClient (.NET 4) 发出请求;
  4. HTTP 正文大小似乎起作用 - 对于相对较小的数据包没有问题。

因此,看起来 NO_DELAY 会导致 TCP 数据包丢失且内部带有 HTTP 标头/动词的奇怪行为。

有什么建议吗?

4

0 回答 0