Boost Asio网络发送/接收是否具有任何形式的数据完整性保证



我一直在使用Boost ASIO插座(UDP和TCP(来处理我的客户端服务器程序之间的自定义协议。直到我在TCP async_send/async_recieve上发现数据可以到达合并的块。

之前,它一直运作良好。

例如,如果我用自己的数据包进行两个发送电话,则它们可以通过一个接收电话组合到达。我错误地认为每个发送都对应于接收,但显然我错了。但是,它在最长的时间内运行良好,直到我发现该问题运行客户端的其他操作系统。

所以我的问题是:是否可以保证每个接收电话的到达数据的完整性?(例如,async_send 128字节以128个字节的倍数到达,或者必须始终将其到达的方式始终为随机,就像1个字节到达,然后127个字节是可能的(

(

更具体地说,这意味着:

  • 数据可以到达每个发送呼叫的连接或部分,我必须始终手动处理串联/部分数据
  • 对于UDP和TCP ASIO插座,这是正确的吗?

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

首先要了解Boost Asio套接字接收并发送方法只是意味着他们订购了基础网络堆栈以接收或发送数据。通过网络堆栈,这可能是Windows套接字API。

如果您将数据直接发送到同一台计算机,则通过所谓的环回地址,操作系统(如果有的话(只能将其"将"授予"到侦听程序,即接收程序。那就是您最幸运地井井有条并始终完成所有情况的情况。

但是,如果您想解决另一台计算机或由于操作系统处于情绪状态,您将具有不同的行为:

TCP的设计,您将在"订单" 中获得数据。但是,即使在相同的连接上,块或数据包大小也会有所不同,并且是TCP的关键功能。在通知您之前,您的操作系统或硬件网络适配器可能也可以进行一些发送或接收缓冲。但是事情不会丢失。

因此,对于TCP来说,您可以通过等待数据async_read_until中的某个点来确保数据完成。来自多个发送呼叫的数据可能是一个接收或许多

与TCP相比,

UDP的延迟量较低,但没有其订购和完整性保证。因此,当您发送UDP数据报(即数据包(时,通常操作系统和网络适配器会尝试尽快将其发送出去。但是,在到达另一台计算机的路上,互联网可能会放松它,或者将一个数据包放回原处,直到您在第一个计算机上发送的数据包,以便以后发送的数据,以后收到,而您也可以先获得发送的数据,以后,或者可能不会。但是,当您收到数据报时,它就完整了。

因此,简而言之:数据将到达数据报块,但可能缺少某些数据报,或者可能以其他顺序到达。来自一个发送的数据可能是一个接收的,或者可能不会或以后

因此,在进行了更多测试之后,这就是我得出的结论:答案是否定的。Boost ASIO插座没有魔术可以强制执行数据完整性超出TCP/UDP协议的执行。

编辑:所以这是我的更多研究:

对于TCP,它的作用就像数据流。因此,数据包可以部分到达或组合并完成。因此,用户应用需要处理合并或部分数据的避难所。

对于UDP,因为它是数据报数据包,如果数据包到达,则可以保证独立且完整。因此,无需处理部分或组合数据包。

最新更新