【问题标题】:Correct architectual way to send "datagrams" via TCP通过 TCP 发送“数据报”的正确架构方式
【发布时间】:2016-09-19 16:09:12
【问题描述】:

我需要通过 TCP 以我的自定义格式传输全字节数据包。但是如果我正确理解 TCP 是流协议,那么当我在发送方调用send 方法时,不能保证在调用recv 时接收方会以相同的大小接收它(它可以与Nagle 算法,然后在不适合帧或不适合缓冲区时拆分)。

UDP 提供完整的数据报,因此不存在此类问题。

所以问题是:recvsend 相同的包装,尺寸相同,没有胶水的最佳和正确方法是什么。我使用python开发。

我想我可以使用HDLC 之类的东西,但我不确定遍历每个字节是否是最佳选择。 也许有一些针对这种情况的开源小例子,或者书中有描述?

【问题讨论】:

  • “无胶水”是什么意思?各个电报周围没有指示符来显示它们的开始和结束?如果是这样,为什么?因为这是迄今为止解决这种情况最常见的方法。
  • “无胶水”是指我需要接收单个电报,而不是在一个流块中包含多个电报的流块。好的,常见的方法是在发送方的数据包之间添加一些指示符(几个字节)并在接收方解析它?如果这个字节将出现在数据包中,我需要转义它,它看起来效率不高,但我会考虑它。我还考虑在数据包之间添加实际数据包大小,以了解下一个完整数据包需要多少字节,这将有助于决定当前块或下一个块中是完整数据包,但也许有一些标准算法?

标签: python sockets tcp packet datagram


【解决方案1】:

由于 TCP 只是一个八位字节流,因此无论是围绕您的数据(即框架)还是在您的数据内部(具有清晰结尾的结构),如果没有胶水,这是不可能的。

这通常是通过在 HTTP 标头和正文之间添加一个分隔符(例如 \r\n\r\n)或在您的消息前面加上大小来完成的。在后一种情况下,只需读取大小(固定字节数),然后读取实际消息的字节数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-29
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多