【发布时间】:2016-09-19 16:09:12
【问题描述】:
我需要通过 TCP 以我的自定义格式传输全字节数据包。但是如果我正确理解 TCP 是流协议,那么当我在发送方调用send 方法时,不能保证在调用recv 时接收方会以相同的大小接收它(它可以与Nagle 算法,然后在不适合帧或不适合缓冲区时拆分)。
UDP 提供完整的数据报,因此不存在此类问题。
所以问题是:recv 与send 相同的包装,尺寸相同,没有胶水的最佳和正确方法是什么。我使用python开发。
我想我可以使用HDLC 之类的东西,但我不确定遍历每个字节是否是最佳选择。
也许有一些针对这种情况的开源小例子,或者书中有描述?
【问题讨论】:
-
“无胶水”是什么意思?各个电报周围没有指示符来显示它们的开始和结束?如果是这样,为什么?因为这是迄今为止解决这种情况最常见的方法。
-
“无胶水”是指我需要接收单个电报,而不是在一个流块中包含多个电报的流块。好的,常见的方法是在发送方的数据包之间添加一些指示符(几个字节)并在接收方解析它?如果这个字节将出现在数据包中,我需要转义它,它看起来效率不高,但我会考虑它。我还考虑在数据包之间添加实际数据包大小,以了解下一个完整数据包需要多少字节,这将有助于决定当前块或下一个块中是完整数据包,但也许有一些标准算法?
标签: python sockets tcp packet datagram