因此,无论我在何处阅读有关UDP
的任何内容,人们都会这样说;
第一个对我来说并不清楚。这是TCP
:
我发送1234
,客户收到12
,然后34
没问题;只是预先添加消息长度,这一切都很好。毕竟,一个整数总是4个字节,所以即使客户端收到2中的前置长度,它也会知道继续读取,直到知道msg长度至少有4个字节为止。
无论如何,回到UDP
,当人们说'包可以无序接收'时,现在的交易是什么?
A) Send `1234`, client receives `34` and then `12`
B) Send `1234` and `5678`, client receives `5678` and then `1234`
如果它是A,我根本不知道如何让UDP为我工作。客户怎么会知道什么是什么?
答案 0 :(得分:1)
通常的比喻是:
TCP还涉及连接:如果电话线被雷暴中断,则连接中断,并且必须再次建立。 (你需要再次拨打)
UDP 无连接且不可靠:如果邮件员被卡车撞到,某些字母可能会丢失。有些信件也可以由其他邮递员领取和发送。如果您的邮箱已满,甚至没有任何理由,甚至可以将信件放在地板上。
答案 1 :(得分:1)
网络有很多路径可以到达给定点,因此其中一个数据报可能需要一条路由到达另一端,另一条数据包可能需要另一条路径。鉴于此,发送的最后一个包可以在另一个包之前到达。 UDP没有采取任何措施来纠正这个问题,因为没有连接和按顺序交付的概念。
此时,这取决于您发送数据的方式。对于UDP,每个send()或类似的调用发送一个UDP数据报,recv()接收一个数据报。数据报可以相对于其他数据报重新排序,或完全消失。数据无法在数据报中重新排序或删除,您要么完全收到已发送的邮件,要么根本不收到该邮件。
如果您需要按顺序到达数据报/消息,则需要在数据包中添加序列号,在接收端排队并重新排序。