我创建了某种类型的客户端/服务器应用程序,它有自己的数据ACK系统。它最初是在TCP中制作的,因为有些限制,但基础是考虑UDP。
我发送到服务器的数据包有自己的封装(数据包ID和数据包大小标题。我知道UDP也有校验和所以我没有添加标题。),但TCP如何工作,我知道服务器可能没有收到整个数据包,因此我收集并缓冲了收到的数据,直到收到完整的有效数据包。
现在我有机会将我的客户端/服务器程序传递给UDP,我知道与TCP的一个区别是数据没有按照发送的顺序接收(这就是我添加数据包ID的原因)头)。
我想知道的是:如果我发送多个数据包,是否会收到没有保证订单但保证封装的数据包?我的意思是,如果我发送一个大小为1000字节的数据包和另一个大小为400字节的数据包,服务器将收到2个数据包,一个1000字节,另一个400字节,或者有机会接收1000个字节中的200个,然后是1000个字节的400个字节,后来其余的字节就像TCP一样?
答案 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非常适合流媒体内容,如语音丢失的数据包无关紧要。
自从这些问题成为主要问题以来,网络可靠性已经有了很大改善。