在UDP中接收数据包

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

你会得到全部或全部。

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

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

您必须提供足够的缓冲区以在一次调用中接收整个帧。

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

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

长度一个16位字段,指定整个数据报的长度(以字节为单位):标头和数据。 最小长度为8个字节,因为这是标头的长度。 对于UDP数据报,字段大小设置理论限制为65,535字节(8字节标题+ 65527字节数据)。 由基础IPv4协议强加的数据长度的实际限制是65,507字节。

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

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

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

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