UDP数据包可以像TCP一样部分发送吗?

时间:2015-02-03 00:55:06

标签: sockets tcp udp difference

我创建了某种类型的客户端/服务器应用程序,它有自己的数据ACK系统。它最初是在TCP中制作的,因为有些限制,但基础是考虑UDP。

我发送到服务器的数据包有自己的封装(数据包ID和数据包大小标题。我知道UDP也有校验和所以我没有添加标题。),但TCP如何工作,我知道服务器可能没有收到整个数据包,因此我收集并缓冲了收到的数据,直到收到完整的有效数据包。

现在我有机会将我的客户端/服务器程序传递给UDP,我知道与TCP的一个区别是数据没有按照发送的顺序接收(这就是我添加数据包ID的原因)头)。

我想知道的是:如果我发送多个数据包,是否会收到没有保证订单但保证封装的数据包?我的意思是,如果我发送一个大小为1000字节的数据包和另一个大小为400字节的数据包,服务器将收到2个数据包,一个1000字节,另一个400字节,或者有机会接收1000个字节中的200个,然后是1000个字节的400个字节,后来其余的字节就像TCP一样?

2 个答案:

答案 0 :(得分:10)

UDP是一种数据报服务。数据报可以拆分进行传输,但在传递到应用程序层之前会重新组装。

答案 1 :(得分:-2)

对于小数据包大小,您不应该担心数据包会被分成多个数据包。当数据包越过以太网时,这通常只是一个问题。

你问" 服务器将接收2个数据包,1000个字节中的一个和400字节中的另一个,或者有机会接收1000个字节中的200个字节,然后接收该1000个字节中的400个字节以及其余的字节像TCP可以做什么?

如果数据包大小低于1492字节,则不会有任何部分数据包。

<强>更新:
显然我认为有必要澄清为什么我说UDP包长度为1492字节或更少不会影响传输的健壮性。

RFC 768中隐式指定的最大UDP长度为65535,包括8字节的标头。最大有效载荷帧长度为65527字节。

虽然这不应该是有争议的数字,但UDP数据长度通常报告不正确。这在前一篇文章中举例说明:

What is the largest Safe UDP Packet Size on the Internet

数据分组不受底层网络ToS的MTU或通信协议的帧长度(例如分别为IP和以太网)的约束。 MTU和协议长度之间的差异可通过分段和重组来解决

在传输层,每个网络服务类型(ToS)都有一个特定的最大传输单元(MTU)。 UDP封装在IP数据包中,IP数据包由传输网络的ToS封装。 IP数据包通常通过各种ToS网络传输,包括以太网,PPP,HDLC和ADCCP。

当接收网络ToS的MTU小于发送ToS时,接收网络必须对接收到的数据包进行分段。当网络向具有更高MTU的网络发送数据包时,接收网络必须重新组合任何分段数据包。

以太网是具有最低MTU的事实主流协议。非Mainsteam Arcnet MTU为507字节。实际最低MTU是以太网的1500字节,减去开销使最大有效载荷长度为1492字节。

如果UDP数据包超过1492字节,则数据包可能会被分段并重新组装。片段和重组增加了已经复杂的UDP和IP耦合过程的复杂性,因此应该避免。

因为UDP是一种无保证的数据报传送协议,所以它可以提高传输性能。鲁棒性留给始发和终止应用程序。 RFC 1166设置了通信协议链路层,IP层和传输层的标准,UDP应用程序负责打包,重组和流量控制。

通信主机的应用层也可以降低最大UDP数据包大小。数据包长度是性能和稳健性之间的平衡。

通信主机的应用层可以设置最大UDP数据包大小。应用层的典型UDP最大数据长度将使用IP协议或主机数据链路层允许的最大值,通常为以太网。

应用程序的程序员选择使用主机应用程序层或主机数据链路层。主机应用层将检测UDP数据包错误,并在必要时丢弃该数据包。当应用程序直接与主机数据链路通信时,应用程序将负责检测数据包错误。

使用以太网的最大UDP数据包长度最大有效载荷长度为1492字节将消除多帧的碎片和传送顺序问题。

这就是为什么我说数据包长度不是数据包长度为1000和400字节的碎片问题。

<强> ###

我不知道&#34;保证封装&#34; 是什么意思,对我来说毫无意义。

使用IP无法保证订单的数据包传送,无论是UDP还是TCP。

只要您控制会话的两端,就可以在数据包中计算出自己的协议来处理订阅和发布数据包。保留数据包的前x个字节,以获得连续的订单号和数据包总数。 (例如3个中的1个,2个中的2个,3个中的3个)。如果客户端缺少数据包,则客户端必须发送重传请求。您需要确定数据完整性的级别。也许重传数据包丢失了。

这可能是&#34;保证封装&#34; 的意思,其中数据报包中有其他信息以确保一定的完整性。如果分成多个数据报,您应该为发送的总数据添加自己的CRC。校验和不是很健壮,只适用于一个数据包。

UDP比TCP快得多,但TCP具有流量控制和保证传输。

UDP非常适合流媒体内容,如语音丢失的数据包无关紧要。

自从这些问题成为主要问题以来,网络可靠性已经有了很大改善。