假设我的程序通过网络(UDP)发送1000个字节。是否保证接收器将在一个“批处理”中接收1000个字节?或者他可能需要执行几个“读取”操作。直到他收到整条信息?如果后者为真,我怎样才能确保同一消息的数据包顺序不会“混淆”。 (按顺序),或者协议保证它?
编辑:也就是说,我的邮件是否可能被拆分为多个数据包? (如果我尝试发送10000mb消息,那么会发生什么?)

有帮助吗?

解决方案

你会得到全部或全部。

但是没有特别保证您按照传输顺序只接收一次数据包;数据包丢失,重新排序和(不太常见)重复都是可能的。

最大帧大小(65,507字节),send()较大大小的数据包将返回错误。

您必须提供足够的缓冲区才能在一次通话中接收整个帧。

UDP数据包可以分段为多个IP分段,但操作系统会丢弃不完整的数据包。因此,这对应用程序是透明的。

其他提示

接收方将在一次通话中获得整个数据包。即使在理论中,数据包长度也是有限的:

  

长度       一个16位字段,指定整个字节的长度   数据报:标题和数据。最低   长度是8个字节,因为那是   标题的长度。字段大小   设定理论上的极限为65,535   字节数(8字节标题+ 65527字节   数据)用于UDP数据报。该   数据长度的实际限制   这是由底层人施加的   IPv4协议是65,507字节。

然而,实际限制要低得多,假设512字节通常是安全的。请参阅什么是最大的安全UDP数据包大小互联网

使用UDP发送的数据分组在数据包中,因此如果您发送x然后,如果接收器接收到数据包,则他将接收x个字节。

但是,您的数据包可能无法到达,或者它们可能无法到达。

与TCP不同,UDP不是一种可靠的协议。它没有提供内置机制来确保数据包以正确的顺序到达,甚至根本不到达。也就是说,您可以以锁步方式编写send / recv例程,每次发送数据包时,发送方必须等待再次发送之前收到ACK。如果在某个指定的超时后未收到ACK,则必须重新发送该数据包。这样,您可以确保以正确的顺序接收数据包。 (有关更多信息,请查看使用此策略的 RFC for TFTP protocol ) 。)

最后,如果可能,您可能需要考虑使用TCP。

使用 UDP Lite ,您可以请求接收部分损坏的数据包。这对视频和VoIP服务非常有用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top