UDP消息是原子的吗?

3
如果我在UDP套接字上发送一些字节序列(即,在单个send调用中),是否有可能接收套接字只会接收到传输消息的一部分(忽略缓冲区过小的情况)?或者字节序列将完整地传递还是根本不传递,但从不部分传递或分成多个组?

3
UDP没有可靠交付,但是从客户端的角度来看,当一个数据报被接收时,它保证是完整的。 - mac
2个回答

3
是的。UDP数据报通过传输时要么完整到达,要么不到达。

我认为问题不在于数据报本身,而是在于send()调用中发送的缓冲区的整个内容。至少这是我理解的方式。 - Asblarf
1
@Asbkarf 无关大雅的区别。在send()调用中发送的缓冲区的“完整内容”就是一个数据报。 - user207421
即使它比MTU还要大? - Asblarf
@EJP酷!这个任务要求我们在UDP之上建立一个可靠的通道,我本来就是这么假设的,但有个朋友对于不考虑部分数据包丢失或类似情况感到担心,我也不确定那是否可能成为一个问题。出于好奇,你有关于这方面的资料来源吗?除了标准规范外,有什么其他地方可以解答这类问题呢? - alecbz
@alecbenzer 最好的地方标准,这种情况下是RFC。没有人能反驳。我不会要求其他任何内容。 - user207421
显示剩余6条评论

-2
UDP不能保证从A机器发送的有效负载能够到达B机器。在数据传输过程中,携带你send()调用的有效负载的数据报可能会丢失。B机器只会将到达的内容交付给应用程序。原始有效负载的一部分可能仍在传输中(或已丢失)。

1
机器B将传递整个数据报或者不传递。-1 - user207421
@EJP -1,真的吗?我从来没有说过数据报可能会被部分传送。我说的是有效载荷,也就是send()缓冲区的内容。你的-1在这里绝对不合适。 - Asblarf
1
再说一遍,这只是毫无差别的区别。每个send()调用发送一个数据报。 - user207421
是的,真的,你确实说过数据报可能会部分传送,并且你在这里说过:“机器B只会将到达那里的内容交付给应用程序。”你似乎没有理解自己的写作。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接