首页 > 解决方案 > Boost Asio 网络发送/接收是否有任何类型的数据完整性保证?

问题描述

我一直在使用 boost asio 套接字(UDP 和 TCP)来处理我的客户端服务器程序之间的自定义协议。它一直工作得很好,直到我发现在 TCP async_send/async_recieve 调用上数据可以以组合块的形式到达。

例如,如果我发出两个发送调用,每个调用都有自己的数据包,它们可以在一个接收调用中合并到达。我错误地假设每个发送都对应一个接收,但我显然错了。然而,在我发现为不同操作系统运行客户端的问题之前,它一直运行良好。

所以我的问题是:是否可以保证每次接收呼叫时数据的完整性?(例如 async_send 128 字节以 128 字节的倍数到达,或者它如何到达必须始终被视为随机的,比如 1 字节到达然后 127 字节是可能的)

更具体地说,这是否意味着:

我四处搜索,找不到任何关于此的文档,所以我想知道是否有人有任何想法。

标签: c++socketsnetworkingtcpboost-asio

解决方案


首先,重要的是要理解 boost asio 套接字接收和发送方法只是意味着它们命令底层网络堆栈接收或发送数据。通过网络堆栈,这可能是 Windows 套接字 API。

如果您通过所谓的环回地址将数据发送到同一台计算机,则操作系统(如果有)可以将其“提供”给监听程序,即接收程序。在这种情况下,您将最幸运地把事情整理好并始终完成所有情况。

但是,如果您希望您正在处理另一台计算机或因为操作系统处于心情状态,您将有不同的行为:

TCP 旨在让您按照发送的顺序获取数据。但是即使在同一个连接上,发送的块或数据包大小也会不同,这是 TCP 的一个关键特性。在通知您之前,您的操作系统或硬件网络适配器也可能会进行一些发送或接收缓冲。但是,事情不会丢失。

async_read_until简而言之,TCP:您可以通过等待数据中的某个点就在这种情况下来确保数据是完整的。来自多个发送调用的数据可能在一个接收或多个

与 TCP 相比,UDP 被设计为具有低延迟,但没有其顺序和完整性保证。所以当你发送一个UDP数据报即数据包时,通常操作系统和网络适配器会尝试尽快发送出去。但是在去另一台计算机的路上,互联网可能会丢失它,或者将一个数据包保留到您发送的第一个数据包之后,以便您稍后发送的数据可以稍后接收,而您也可以先发送,稍后,或者可能不会。但是当你收到一个数据报时,它本身就是完整的。

所以简而言之,UDP:数据将以数据报块的形式到达,但某些数据报可能会丢失,或者可能以不同于发送的顺序到达。一次发送的数据可能在一次接收中,可能不是,或者稍后


推荐阅读