【发布时间】:2022-04-25 14:15:34
【问题描述】:
我正在研究我所知道的两种不同 TCP 消息成帧方法的优缺点。
- Delimited:使用分隔符字节将 TCP 流分成非固定长度的消息。发送数据时,例程必须检查消息数据的分隔符并将其转义以确保消息帧的安全传输。接收数据时,例程必须通读流,寻找分隔符字节以将帧分解为消息。
EG:用户 [用户名]\n密码 [密码]\n
- Length-Prefixed:通过使用 4 个字节的前缀来说明消息的长度,将 TCP 流分成预定大小的消息。接收数据时,例程将首先读取前缀以确定消息帧的长度。发送数据时,例程必须在传输前为消息添加长度前缀。
例如:[MessageLength]User [Username][MessageLength]Password [Password]
这两种方法都允许传输大小不同并包含要解释的字节流的消息帧。更高级别的消息结构或协议不相关。
因此,我将注意力集中在可扩展性和性能效率上。我发现自己需要运行基准测试,看看哪种方法可以在不涉及任何消息处理的情况下获得最大的效率吞吐量。
我目前的想法,无论如何我都不是专家。
分隔消息帧在接收例程期间效率较低,因为需要检查流中的每个字节是否有消息帧分隔符。长度前缀消息帧将始终读取前缀字节,其余消息帧流将直接进入缓冲区而不进行处理,直到接收到整个消息帧。
在发送例程中,作为长度前缀的消息帧在消息本身之前传输的消息前缀效率较低。
我认为可能的其他因素包括:
- 大量小消息帧会导致为长度前缀结构传输更多数据包。
- 使用 Length-Prefixed 结构可以更有效地处理大量较大的消息帧,因为不会读取每个字节来检查分隔符。
这个主题的任何亮点都会很棒。我发现很难找到关于 TCP 消息帧结构之间差异的好的资源。
【问题讨论】:
-
您正在尝试发明 IP,即 TCP/IP 的另一部分。这是行不通的,它已经存在了,你不能直接影响它,也不需要任何帮助。 TCP 是一个流,试图将它分解成碎片会使其效率非常低下。只有选项 2 符合条件。
-
我说的是你必须实现的消息框架,以通过 TCP 流以数据包的形式传输数据。我不想发明任何东西。我正在尝试讨论您选择实施的框架的优缺点。例如。像“USER [用户名]\n”这样的定界消息帧:其中“\n”是定界符,因此它是一个定界消息帧。