我每 10 分钟从设备向 TCP 服务器发送少量数据(最多 100 字节)。在我的情况下,开销似乎很大(我们为每个字节付费)。我发现我至少有 7-10 个数据包(三向握手(3),请求与 ack(2),响应与 ack(2,可选)和拆卸(3))。总开销至少为 400 字节(每个数据包 40 字节 TCP/IP 标头)。
问题是:
为什么我的标题大于 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)如何打印标题的键值列表而不是十六进制值?(这是次要的)
什么是可靠地发送如此少量数据的有效方法?(UDP 与 ack?)
是的,这本质上就是 UDP 的发明目的。或者使用长期存在的 TCP 连接。
为什么我的标题大于 40 字节(60 或 52)?
大多数操作系统包含的内容远不止最低限度。
如何打印标题的键值列表而不是十六进制值?
在 Wireshark 中捕获数据包并转储它的分析。
获得“键值”格式可能需要更多时间,具体取决于您要查找的内容。
TCP 连接可以存活多久?
从技术上讲,永远。实际上,这取决于... TCP 本身没有限制,可以想象,连接可以存活数年。实际上,大多数应用程序都有一个超时时间,在此时间点它们会断开非活动客户端的连接。此外,防火墙通常会在很长时间后丢弃空闲连接的状态规则。
如果保持连接打开,TCP 是否会发送额外的数据包?
如果您启用了保活,是的。否则,可能不会。取决于实施。
保持所有连接打开是否有效?
保持每个连接打开需要内存(通常为几 KB)。一两千个连接只需要几 MB。数以百万计的人开始切入“大量”内存的领域。现代操作系统可以轻松跟踪数千个连接;但是您的应用程序必须合理设计以容纳这么多。
归档时间: |
|
查看次数: |
146 次 |
最近记录: |