-2

所以无论我读到什么UDP,人们都会这样说;

  1. 可以乱序接收消息
  2. 消息可能永远不会到达

第一个我不清楚。这是可能发生的情况TCP

我发送1234,客户接收12,然后34

所以没问题;只需添加消息长度,一切都很好。毕竟,一个整数总是 4 个字节,所以即使客户端在 2 次中收到了前置长度,它也会知道继续读取,直到它至少有 4 个字节才能知道 msg 长度。

无论如何,回到UDP现在,当人们说“包裹可以乱收”时,这是怎么回事?

A) Send `1234`, client receives `34` and then `12`
B) Send `1234` and `5678`, client receives `5678` and then `1234`

如果是 A,我根本不知道如何让 UDP 为我工作。客户怎么会知道什么是什么?

4

2 回答 2

1

完全有可能一个网络有许多路径可以到达给定点,因此一个数据报可能采用一条路径到达另一端,另一个数据包可能采用另一条路径。鉴于此,发送的最后一个数据包可能在另一个数据包之前到达。UDP 没有采取任何措施来纠正这个问题,因为没有连接的概念,也没有按顺序交付。

此时,这取决于您发送数据的方式。对于 UDP,每个 send() 或类似调用发送一个 UDP 数据报,而 recv() 接收一个数据报。一个数据报可以相对于其他数据报重新排序,或者完全消失。数据不能在数据报中重新排序或删除,您要么准确地收到发送的消息,要么根本没有收到它。

如果您需要数据报/消息按顺序到达,您需要为您的数据包添加一个序列号,在接收端对它们进行排队和重新排序。

于 2013-07-07T15:40:58.400 回答
1

通常的比喻是:

  • TCP 是一种电话交谈:单词的到达顺序与说话的顺序相同
  • UDP通过邮件发送一系列信件:信件可能会丢失,可能会到达,并且可以以任何顺序到达

TCP 还涉及到一个连接:如果电话线被雷雨打断,连接就会中断,并且必须重新建立。(您需要再次拨号)

UDP 是无连接且不可靠的:如果邮递员被卡车撞到,一些信件可能会丢失。有些信件也可以由其他邮递员领取和投递。如果您的邮箱已满,甚至可以无缘无故地将信件丢在地板上。

于 2013-07-07T15:04:50.740 回答