我每 10 分钟从设备向 TCP 服务器发送少量数据(最多 100 字节)。就我而言,开销似乎很大(我们为每个字节付费)。我发现我至少有 7-10 个数据包(三次握手 (3)、带 ack 的请求 (2)、带 ack 的响应 (2,可选) 和拆卸 (3))。总开销至少为 400 字节(每个数据包 40 字节 TCP/IP 标头)。
问题是:
- 可靠地发送如此少量数据的有效方法是什么?(带有确认的 UDP?)
为什么我的标头大于 40 个字节(60 或 52)?例如这个:
0x0000: 4500 0034 73d7 4000 3506 d2ee 5c17 1b9b [email protected]...\... 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 ....
我怎样才能打印标题的键值列表而不是十六进制值?(这是小问题)
答案1
可靠地发送如此少量数据的有效方法是什么?(带有确认的 UDP?)
是的,这基本上就是 UDP 的发明目的。或者使用长寿命 TCP 连接。
为什么我的标头大于 40 个字节(60 或 52)?
大多数操作系统所包含的功能远多于最低限度。
如何打印标题的键值列表而不是十六进制值?
在 Wireshark 中捕获数据包并转储其分析。
可能需要花费更多时间才能获得“键值”格式,具体取决于您要查找的内容。
TCP 连接可以存活多长时间?
从技术上讲,是永远。实际上,这取决于... TCP 本身没有限制,可以想象连接可以保持数年。实际上,大多数应用程序都有超时时间,在超时后它们会断开不活动的客户端。此外,防火墙通常会在很长时间后放弃空闲连接的状态规则。
如果保持连接打开,TCP 是否会发送额外的数据包?
如果启用了保持活动,则可以。否则,可能不行。取决于实施情况。
保持所有连接保持打开状态是否有效?
保持每个连接打开需要占用内存(通常为几 KB)。一两千个连接仅占用几 MB。数百万个连接开始占用“大量”内存。现代操作系统可以轻松跟踪数千个连接;但您的应用程序必须经过合理设计才能容纳这么多连接。
答案2
可靠地发送如此少量数据的有效方法是什么?
绝对是 UDP,为了以防万一,我会使用 UDP,并将数据包中的一些字节保留用于校验和或其他错误检测机制。