全国直销电话:4006-854-568
IT-technology
以人为本,众志成城,以“用户至上”.“服务上乘”为原则,
追求产品和服务高质量,努力实现与客户之间真诚有效的沟通,
不断地圆梦、奔跑与腾飞。
新闻动态   NEWS
UDP 分片 与 丢包,UDP 真的比 TCP 高效吗?UDP 的应用场景-北京赛维博信科技发展有限公司
来源:本文摘自网络,如有侵权请联系删除 | 作者:svbx001 | 发布时间: 2022-12-26 | 1947 次浏览 | 分享到:

3、ARP 缓存过期,导致丢包:

ARP 的缓存时间约 10 分钟,APR 缓存列表没有对方的 MAC 地址或缓存过期的时候,会发送 ARP 请求获取 MAC 地址,

在没有获取到 MAC 地址之前,用户发送出去的 UDP 数据包会被内核缓存到 arp_queue 这个队列中,默认最多缓存 3 个包,多余的 UDP 包会被丢弃。

4、接收端处理时间过长导致丢包:

调用 recv 方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用 recv 方法,在这二次调用间隔里,发过来的包可能丢失。

对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续 recv。

5、发送的包巨大丢包:

虽然 send 方法会帮你做大包切割成小包发送的事情,但包太大也不行。

例如超过 50K 的一个 udp 包,不切割直接通过send 方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个 send。

6、发送的包频率太快:

虽然每个包的大小都小于 mtu size 但是频率太快,例如 40 多个 mut size 的包连续发送中间不 sleep,也有可能导致丢包。

这种情况也有时可以通过设置 socket 接收缓冲解决,但有时解决不了。

所以在发送频率过快的时候还是考虑 sleep一下吧。

7、局域网内不丢包,公网上丢包。

这个问题我也是通过切割小包并 sleep发送解决的。如果流量太大,这个办法也不灵了。

总之 udp 丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法:要么减小流量,要么换 tcp 协议传输,要么做丢包重传的工作。

四、UDP 丢包的解决方案

1. 从发送端解决 - 延迟发送

适用条件:

发送端是可以控制的.
微秒数量级的延迟可以接受.

解决方法:

发送时使用 usleep(1) 延迟 1 微秒发送,即发送频率不要过快
延迟1微妙发送,可以很好的解决这个问题.

2.从接收端解决:数据接收 与 数据处理相分离

适用条件:

无法控制发送端发送数据的频率

解决方法:

用 recvfrom 函数收到数据之后尽快返回,进行下一次 recvfrom,可以通过 多线程+队列 来解决。
收到数据之后将数据放入队列中,另起一个线程去处理收到的数据.

3.从接收端解决:修改接收缓存大小 适用条件:

使用方法 2 依然出现大规模丢包的情况,需要进一步优化

解决方法:

使用 setsockopt 修改接收端的缓冲区大小

int rcv_size = 1024*1024//1M
int optlen=sizeof(rcv_size);
//设置好缓冲区大小
int err=setsockopt(sock,SOL_SOCKET,SO_RCVBUF,(char *)&rcv_size,optlen);

 

服务热线

1391-024-6332