可变长度消息的 TCP 传输

Posted

技术标签:

【中文标题】可变长度消息的 TCP 传输【英文标题】:TCP transfer of messages of variable length 【发布时间】:2021-07-13 21:46:43 【问题描述】:

通过 TCP 正确编码和解析可变长度消息的方法是什么?例如,假设我们要发送一条由字符串文本和二进制文件混合而成的消息。

【问题讨论】:

【参考方案1】:

这取决于您在 TCP 上实现的协议。它的规范会告诉你正确的使用方法。

如果您正在设计协议,通常您只需遵循与您正在做的最接近的现有协议的设计即可。常见的方案包括:

    您将每条消息编码为以换行符结尾的文本。接收方只是读取数据块并在其中搜索换行符。

    您将每条消息编码为可变长度块,并在每个块之前发送一个 4 字节整数长度(按网络字节顺序)。接收方读取数据块,当它有 4 个字节时,它确定消息的长度,当它有更多字节时,它“剪断”消息并解析任何剩余的。

    您以 XML 或 JSON 等格式对消息进行编码。

【讨论】:

【参考方案2】:

只是添加到这个帖子中已经发布的优秀答案。

如果您的问题的目的是教育,您可以查看RFC 6455, Section 5.2 如何在 WebSocket 协议中构建消息。

如果您需要通过 TCP 实现通信,您还可以通过重用现有的 RPC 协议来节省时间,例如 gRPC、Apache Thrift、XML-RPC、JSON-RPC 等。非浏览器客户端也可以使用上述 WebSocket 协议(如果您计划将来将功能扩展到浏览器,这可能是一个不错的选择)。

大多数MessagePack 库还允许您从流中反序列化 MessagePack 编码而不提供其长度,因此您可以通过套接字发送和接收 MessagePack 消息来简单地交谈。

【讨论】:

以上是关于可变长度消息的 TCP 传输的主要内容,如果未能解决你的问题,请参考以下文章

如何为可变长度有效负载格式化 NDEF 消息?

[Go] 轻量服务器框架tcp的粘包问题 封包与拆包

在 swift 中将可变长度消息的高度设置为 UIlabel 并不总是正确的

TCP协议

IP UDP TCP等最大长度

TCP/IP总结TCP 之最大消息长度