UDP分片与丢包,UDP真的比TCP高效吗?

1.UDP报文格式每个UDP报文分为两部分:UDP报头和UDP数据区。
标头由四个16位长(2字节)字段组成,描述源端口、目标端口、消息长度和消息校验值。
UDP报文中各个字段的含义如下:2.UDP分片1.UDP有发送缓冲区空间吗?每个UDPsocket有接收缓冲区,但没有发送缓冲区。
从概念上讲,没有缓冲,也不需要发送缓冲区,因为只要数据存在,就会发送,而不管对方能否正确接收。

UDP:当套接字的接收缓冲区已满时,没有新的数据报可以进入接收缓冲区,数据报将被丢弃。
由于UDP没有流量控制,快速的发送方很容易压倒慢速的接收方,导致接收方的UDP丢弃数据报。
而且,在发送过程中,传输被分割成多个分片,如果在传输过程中丢失了一个小分片,那么整个文件最终会在接收端被丢弃,这就是传输失败的原因。
2、UDP分片1>.数据链路层最大传输单元为1500字节(MTU)。
如果IP层不对数据包进行分片,则UDP数据包的最大大小为1500字节。
字节–IP标头(20字节)–UDP标头(8字节)=1472字节。
然而,UDP数据包的理论最大长度为65507字节。
那么,发送这么大的数据包实际上是最好的吗?我们来看看“碎片化问题”。
更多关于UDP包大小和MTU的信息,请参考之前的文章blog.csdn.net/LearnLHC/...2>。
我们知道UDP是一个分片问题。
UDP作为一种不可靠的传输协议,为了降低UDP丢包的风险,最好控制UDP数据包在IP层协议的传输过程中不被丢弃。
这是为什么呢?如果MTU是1500,客户端发送8000字节的UDP数据包,服务器收到数据包不会丢包,而recvfrom(9000)收到的是1500或8000。
如果IP片段丢失,recvfrom(9000)会返回什么?UDP通信的有限性意味着如果buf足够大,则接收到的必须是完整的数据包。
UDP数据在较低层的分片和分组由IP层处理并发送到UDP传输层。
如果周期是完整的UDP数据包,recvfrom(9000)将返回8000。
如果IP片段丢失,UDP会执行CRC校验,如果不完整则丢弃该数据包,并且不指示成功接收。
因此,UDP是不可靠的发送协议,recvfrom(9000)会被阻塞。
如果分片被分割太多,在传输层只发送和接收一次,但在发送过程中会被多次发送,增加丢包的机会。
3、UDP丢包原因假设:IP在不考虑层分片丢失和CRC校验不完整的情况下:1、UDP缓冲区已满,导致丢包。
如果套接字缓冲区已满,应用程序就没有时间处理它。
如果缓冲区中有UDP数据包,后续的UDP数据包将被内核丢弃,导致丢包。
如果socket缓冲区已满,出现丢包,增加缓冲区可以缓解UDP丢包问题。
但是,如果服务已经过载,仅仅增加缓冲区并不能解决问题,它会像滚雪球一样越滚越大,导致所有请求超时,服务变得不可用。
2、UDP缓冲区太小或文件太大造成的丢包:如果客户端发送的UDP报文很大,而socket缓冲区太小,无法容纳UDP报文,就会导致报文丢失。
我以前遇到过这个问题,通过将接收缓冲区设置为64K解决了这个问题。
设置为intnRecvBuf=32*1024;//32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(constchar*)&nRecvBuf,sizeof(int));ARP缓存过期,丢包。
如果对端的MAC地址大约10分钟不在APR缓存列表中或者缓存已过期,则在检索MAC地址之前发送ARP请求,并且在检索MAC地址之前发送用户发送的UDP报文。
我会。
由内核缓存在arp_queue队列中,默认最多缓存3个数据包,超出的UDP数据包将被丢弃。
4、接收端处理时间过长,导致丢包。
调用recv方法后,接收端处理数据需要一些时间。
处理完成后,在该时间间隔内再次调用recv方法。
在这两次调用之间,发送的数据包可能会丢失。
在这种情况下,您可以更换接收器。
当它收到数据包时,将其存储在缓冲区中并立即返回继续接收。
5.发送时丢包严重:send方法对于将大数据包分割成较小的数据包并发送它们很有用,但如果数据包太大则不起作用。
例如,如果直接使用send方法发送大于50K的UDP数据包,而没有断开连接,也会出现丢包的情况。
在这种情况下,您需要将它们切成小包裹并一一寄出。
6.数据包发送过于频繁:每个数据包的大小都小于mtusize,但也可能发送过于频繁,例如连续发送超过40个mutsize数据包,中间没有休眠。
由于丢包。
在某些情况下,这种情况可以通过设置socket的接收缓冲区来解决,但在其他情况下则无法解决。
因此,如果您的发送频率太快,您应该考虑休眠。
7.局域网内无丢包,但公网有丢包。
我还通过切割数据包并在睡眠期间发送它们来解决这个问题。
如果流量太大,这个方法就行不通了。
这意味着UDP丢包总会发生。
如果我的方法不起作用,你可以减少流量,改变TCP协议传输,或者重传丢失的数据包。
四、UDP丢包的解决办法1、从发送端解决——传输延时适用条件:①发送端必须可控。
②允许微秒量级的延迟。
解决方案:使用usleep(1)产生1微秒的延迟。
每秒发送一次。
也就是说,发送频率可以延迟1微秒。
解决方法:2.从接收端解决。
数据接收和数据处理分开。
适用条件:①发送方无法控制数据发送频率。
解决方案:要立即返回,请使用recvfrom函数。
也可以在接收到数据后执行下面的recvfrom。
用多线程+队列解决。
一旦接收到数据,它会将数据排队并启动一个新线程来处理接收到的数据。
3、从接收方解决。
适用性:该方法仍然存在较大的丢包情况。
2、需要进一步优化方案:使用setsock。
pt更改接收缓冲区大小后,您可以使用以下函数检查当前的sock缓冲区大小,但稍后您会看到默认缓冲区大小为256kb而不是1M。
Linux系统大小为128kb。
最大设置是此值的两倍,因此要解决该问题,您需要使用root帐户进入命令行,添加记录行(1049576=1024*1024=1M),然后保存。
输入后,更改的设置就会生效。
使用sysctl-a|greprmem_max检查设置是否有效。
启用后,您可以再次运行该程序以查看缓冲区是否已增长以及是否遇到数据包丢失。
数据百分比

udp协议如何限制接收数据的大小

对于以太网环境下UDP传输的数据包长度问题,我们首先要了解TCP/IP协议,它涉及到四层:链路层、网络层、传输层和应用层。
其中,以太网数据帧处于链路层,IP数据包处于网络层,TCP或UDP数据包处于传输层,TCP或UDP中的数据处于数据帧的应用层{IP数据包{TCP或UDP数据包{Data}}}我们在应用程序中使用的数据的最大长度直接取决于底层限制。
我们从下到上分析一下:在链路层,以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中18是数据帧的头和尾,46+18=64是以太网帧中最短的帧长度,1500+18=1518是最大帧长度。
即一个数据帧的最大内容为1500,即MTU(MaximumTransmissionUnit)为1500(但是为什么我在用wireshark抓包的时候看到有14字节的帧头,而且有;没有4-bit校验位?!,帧长度最小为62?)在网络层,因为IP包头占用20字节,所以MTU在传输层为1500-20=1480,UDP包头占用8字节,所以MTU为1480-8=1472;所以,在应用层,你的Data的最大长度是1472。
(当我们的UDP数据包中的数据超过MTU(1472)时,发送方的IP层需要分片进行传输,接收方的IP层需要重新组装数据报因为UDP是一种不可靠的传输协议,如果分片丢失并且重组失败,UDP数据包将被丢弃)。
从上面的分析来看,在正常的局域网环境下,UDP数据最好最大为1472字节(以避免分片和重组)。
但在网络编程时,互联网上的路由器可能会设置为不同的值(小默认值。
互联网上的标准MTU值为576,所以互联网上UDP编程时的最佳数据长度为576)。
-20-8=548以字节为单位。
修改本机MTU的方法如下:Windows平台下1.运行regedit2,打开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces3.Interfaces下有几个子项,每个子项对应网卡。
请按如下方式选择网卡:A.指定本机用于连接互联网的网卡或IP拨号连接,如192.168.0.19B.用鼠标单击Interface上的子项,即可看到值列表中的IPAddress项键C;4、进入该子项,在右侧窗口右键,选择“新建”->“DWORD值”,输入名称“MTU”,回车。
然后用鼠标双击“MTU”,会出现修改窗口,填写MTU值(一般为十进制的1480)。
填写前请先将基数设置为十进制。
设置完成后需要重启机器才能生效。
Windows7(未在XP和Vista上测试)1.以管理员权限运行cmd2.使用netshinterfaceipv4showsubinterfaces命令查看本地连接MTU和名称。
3.使用netshinterfaceipv4setsubinterface"连接名称"mtu=300store=persistent(注意:这里的连接名称是与您使用上面命令看到的MTU值匹配的连接名称。
它显示在右侧。
)附件:1.这个。
该方法不需要重新启动;如果是ipv6,将上面的Changeipv4改为ipv6。
Linux下可以使用以下命令修改需要root权限的ifconfig网卡的MTU值,如ifconfigeth0mtu1460为TCP/IP传输单元最大的发送分为较小的组发送,每组的大小为576字节。
Windows默认字节大小为1500,这是以太网数据包标准。
ADSL使用的PPPoE略小于该值,一般为1492。
有些网站使用的MaxMTU大于1492,因此有些网页可能无法访问。
修改Windows默认的MaxMTU可以解决这个问题。
无论是PC上安装的PPPoE软件还是Modem内置的PPPoE软件,在使用过程中都可能会遇到这个问题。
如果使用路由器时发生这种情况,请在防火墙配置=>基本设置中将MTU更改为手动并将其设置为1492。
然后...如何确定您的路由器从ISP获取的MTU是1500,