假设我的程序通过网络(UDP)发送1000个字节。是否保证接收器将在一个“批处理”中接收1000个字节?或许他需要进行几次“阅读”,直到他收到整个信息?如果后者是真的,我如何确保同一消息的数据包顺序不会“混淆”(按顺序),或者协议可能保证呢?
编辑:也就是说,我的邮件是否可能被拆分为多个数据包? (如果我尝试发送10000mb消息,那么会发生什么?)
答案 0 :(得分:13)
你会得到全部或全部。
但是没有特别保证您按照传输顺序只接收一次数据包;数据包丢失,重新排序和(不太常见)重复都是可能的。
最大帧大小(65,507字节),send()较大大小的数据包将返回错误。
您必须提供足够的缓冲区才能在一次通话中接收整个帧。
UDP数据包可以分段为多个IP分段,但操作系统会丢弃不完整的数据包。因此,这对应用程序是透明的。
答案 1 :(得分:4)
接收方将在一次通话中获得整个数据包。数据包长度有限,即使在theory:
长度 一个16位字段,指定整个字节的长度 数据报:标题和数据。最低 长度是8个字节,因为那是 标题的长度。字段大小 设定理论上的极限为65,535 字节数(8字节标题+ 65527字节 数据)用于UDP数据报。该 数据长度的实际限制 这是由底层人施加的 IPv4协议是65,507字节。
然而,实际限制要低得多,假设512字节通常是安全的。请参阅What is the largest Safe UDP Packet Size on the Internet。
答案 2 :(得分:1)
使用UDP发送的数据分组在packets中,因此如果您发送x个字节,那么如果接收方收到数据包,他将收到x个字节。
但是,您的数据包可能无法到达,或者它们可能无法到达。
答案 3 :(得分:1)
与TCP不同,UDP不是一种可靠的协议。它没有提供内置机制来确保数据包以正确的顺序到达,甚至根本不到达。也就是说,您可以以锁步方式编写send / recv例程,每次发送数据包时,发送方必须等待再次发送之前收到ACK。如果在某个指定的超时后未收到ACK,则必须重新发送该数据包。这样,您可以确保以正确的顺序接收数据包。 (有关更多信息,请查看使用此策略的RFC for the TFTP protocol。)
最后,如果可能,您可能需要考虑使用TCP。
答案 4 :(得分:1)
使用UDP Lite,您可以请求接收部分损坏的数据包。这对视频和VoIP服务非常有用。