通过 TCP 发送 "datagrams" 的正确架构方式
Correct architectual way to send "datagrams" via TCP
我需要通过 TCP 传输自定义格式的完整字节数据包。但是如果我理解正确 TCP 是流协议,那么当我在发送方调用 send
方法时,不能保证在调用 recv
时接收方会以相同的大小接收它(它可以与 Nagle 的算法合并在一起,然后在不适合框架或不适合缓冲区时拆分)。
UDP 提供完整的数据报,因此不存在此类问题。
所以问题是:什么是 recv
与 send
相同的包装的最佳和正确方法,尺寸相同,没有胶水。我使用 python 进行开发。
我想我可以使用 HDLC
之类的东西,但我不确定遍历每个字节是否是最佳选择。
这种情况有没有开源的小例子或者书上有描述?
由于 TCP 只是一个八位字节流,如果没有胶水,无论是在您的数据周围(即成帧)还是在您的数据内部(具有清晰末端的结构),这都是不可能的。
这通常是通过使用分隔符(如 HTTP header 和 body 之间的 \r\n\r\n
)或仅在消息前加上大小作为前缀来完成的。在后一种情况下,只需读取大小(固定字节数),然后读取实际消息的字节数。
我需要通过 TCP 传输自定义格式的完整字节数据包。但是如果我理解正确 TCP 是流协议,那么当我在发送方调用 send
方法时,不能保证在调用 recv
时接收方会以相同的大小接收它(它可以与 Nagle 的算法合并在一起,然后在不适合框架或不适合缓冲区时拆分)。
UDP 提供完整的数据报,因此不存在此类问题。
所以问题是:什么是 recv
与 send
相同的包装的最佳和正确方法,尺寸相同,没有胶水。我使用 python 进行开发。
我想我可以使用 HDLC
之类的东西,但我不确定遍历每个字节是否是最佳选择。
这种情况有没有开源的小例子或者书上有描述?
由于 TCP 只是一个八位字节流,如果没有胶水,无论是在您的数据周围(即成帧)还是在您的数据内部(具有清晰末端的结构),这都是不可能的。
这通常是通过使用分隔符(如 HTTP header 和 body 之间的 \r\n\r\n
)或仅在消息前加上大小作为前缀来完成的。在后一种情况下,只需读取大小(固定字节数),然后读取实际消息的字节数。