TCP 通信的最小尺寸

rur*_*kyi 2 tcp udp

我每 10 分钟从设备向 TCP 服务器发送少量数据(最多 100 字节)。在我的情况下,开销似乎很大(我们为每个字节付费)。我发现我至少有 7-10 个数据包(三向握手(3),请求与 ack(2),响应与 ack(2,可选)和拆卸(3))。总开销至少为 400 字节(每个数据包 40 字节 TCP/IP 标头)。

问题是:

  • 什么是可靠地发送如此少量数据的有效方法?(UDP 与 ack?)
  • 为什么我的标题大于 40 字节(60 或 52)?例如这个:

    0x0000:  4500 0034 73d7 4000 3506 d2ee 5c17 1b9b  E..4s.@.5...\...
    0x0010:  2599 61b3 be7e 23a3 31a9 710a 6a2f 6371  %.a..~#.1.q.j/cq
    0x0020:  8010 0073 2672 0000 0101 080a 02dc 02ef  ...s&r..........
    0x0030:  1dc2 dad6                                ....
    
    Run Code Online (Sandbox Code Playgroud)
  • 如何打印标题的键值列表而不是十六进制值?(这是次要的)

Chr*_*s S 6

什么是可靠地发送如此少量数据的有效方法?(UDP 与 ack?)

是的,这本质上就是 UDP 的发明目的。或者使用长期存在的 TCP 连接。

为什么我的标题大于 40 字节(60 或 52)?

大多数操作系统包含的内容远不止最低限度。

如何打印标题的键值列表而不是十六进制值?

在 Wireshark 中捕获数据包并转储它的分析。
获得“键值”格式可能需要更多时间,具体取决于您要查找的内容。

TCP 连接可以存活多久?

从技术上讲,永远。实际上,这取决于... TCP 本身没有限制,可以想象,连接可以存活数年。实际上,大多数应用程序都有一个超时时间,在此时间点它们会断开非活动客户端的连接。此外,防火墙通常会在很长时间后丢弃空闲连接的状态规则。

如果保持连接打开,TCP 是否会发送额外的数据包?

如果您启用了保活,是的。否则,可能不会。取决于实施。

保持所有连接打开是否有效?

保持每个连接打开需要内存(通常为几 KB)。一两千个连接只需要几 MB。数以百万计的人开始切入“大量”内存的领域。现代操作系统可以轻松跟踪数千个连接;但是您的应用程序必须合理设计以容纳这么多。