数据包在定期发送时被堆叠
Posted
技术标签:
【中文标题】数据包在定期发送时被堆叠【英文标题】:Packets Are Stacked When Sent at Regular Intervals 【发布时间】:2011-10-17 12:50:00 【问题描述】:我正在尝试定期(每秒)通过 TCP 套接字发送一条消息。有时不会发送完整的消息,或者会堆叠两四条消息并同时发送。如果返回值为 0 或
【问题讨论】:
你怎么知道问题出在发送端而不是接收端?如果您想要一个真正的答案,您可能需要同时包含发送和接收示例代码。 @antlersoft:代码在这里并不重要……重要的是概念。 是的,现在我想起来了,在接收端检查字节的准确性会更有意义。但我假设可以在读取端使用相同的过程。 您的消息中应该有一些指示符,以便您知道如何拆分消息,例如消息 ID 和大小加上校验和。 底线是,几乎可以肯定,使用 TCP 来解决这个问题是错误的。在这种情况下,UDP 可能更有意义。根据情况,您可能需要在 UDP 之上构建更多内容(这很常见),但它更适合作为您正在做的事情的基础(即,它可能无法满足您的所有需求,但至少它不会'不要做很多你真的不想要的)。 【参考方案1】:TCP 提供可靠的流 字节,没有消息边界。如果您需要知道消息的长度,则必须将其构建到协议中,例如:发送带有指定消息长度的 2 字节标头的每条消息。
【讨论】:
【参考方案2】:TCP 没有这样的功能。如何将 TCP stream 分割成数据包取决于内核网络堆栈。话虽如此,您可以在套接字上设置TCP_NODELAY
选项以禁用Nagle algorithm。
【讨论】:
我试过了,但它并没有真正做任何事情。不过,感谢您提供的知识以供将来参考。 TCP_NODELAY 有助于小应用程序写入的延迟(telnet、rsh、ssh 一次执行字符),但不保证任何特定的数据包化。【参考方案3】:如果我的理解正确,有时您发送两个或多个数据包,它们在远端作为一个接收。
这是 TCP/IP 的本质。您不能保证数据包会以不同的方式到达,只能保证它们会按顺序可靠地到达。
【讨论】:
【参考方案4】:不确定您正在使用什么平台或您正在使用什么语法(流、FILE
对象或文件描述符;一些代码会澄清这一点)但您可能需要在编写每个 message 强制内核。我通常使用 C 风格的文件描述符,通常在描述符上调用 fflush
就足以让我排队的任何内容立即消失。
【讨论】:
以上是关于数据包在定期发送时被堆叠的主要内容,如果未能解决你的问题,请参考以下文章