编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限。

网络环境:1000M,直连,多网卡

系统:Linux version 3.19.0

接收模式:udp模式的raw socket(优化的话,可以直接通过网卡处理)

发送模式:udp模式的raw socket(优化的话,可以直接通过网卡处理),单线程/多线程

2M               1转N

设备A   ---------------->   转发设备  ---------------->  设备B

但N大到一定程度时,发现发送丢包。

注意,是转发设备发送丢包,不是设备B接收丢包。

设备B接收丢包是可以理解的,毕竟2M码率本身的突发性相当高,1转N时,这个突发率更加扩大。

但是发送丢包是一个什么情况,sendto的返回值都进行了判断,如果异常是会出现打印信息的,但是没有异常出现。

上网查资料。其中最靠谱的是

1.发送频率过高导致丢包

很多人会不理解发送速度过快为什么会产生丢包,原因就是UDP的SendTo不会造成线程阻塞,也就是说,UDP的SentTo不会像TCP中的SendTo那样,直到数据完全发送才会return回调用函数,它不保证当执行下一条语句时数据是否被发送。(SendTo方法是异步的)这样,如果要发送的数据过多或者过大,那么在缓冲区满的那个瞬间要发送的报文就很有可能被丢失。至于对“过快”的解释,作者这样说:“A few packets a second are not an issue; hundreds or thousands may be an issue.”(一秒钟几个数据包不算什么,但是一秒钟成百上千的数据包就不好办了)。

发送方丢包:内部缓冲区(internal buffers)已满,并且发送速度过快(即发送两个报文之间的间隔过短);

但是更让人郁闷的事情出现了。无论是网上资料,还是询问同事,与tcp不同,发送这一块没有缓存区啊。

问题的,已经设置SO_SNDBUF为64M,修改系统值为128M,设置后获取到的SO_SNDBUF为128M。

现在就是在此种情况下发送丢包,128M是什么概念啊,所以基本可以排除这一块的问题。

通过命令watch netstat -s,可以明确的看出 Ip 项下的 outgoing packets dropped 持续增长,也就意味着确实是发送丢包。

然后就通过outgoing packets dropped ,sendto频率过快等等关键词开始查资料,结果让人蓝瘦香菇啊

阴差阳错的情况下,查到了 IOCTLS

SIOCGIFTXQLEN , SIOCSIFTXQLEN

使用 ifr_qlen 读取 或 设置 设备的 传输队列长度. 设置 传输队列长度 是 特权操作.

于是通过

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));

strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));

if (-1 == ioctl(sock_, SIOCGIFTXQLEN, &ifr))

PLOG(ERROR) << "failed to get dev eth0 queue length";

LOG(KEY) << "Dev eth0 queue length " << ifr.ifr_qlen;

获取到eth0上的队列长度为1000,设置成10000试试

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));

strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));

ifr.ifr_qlen = 10000;

if (-1 == ioctl(sock_, SIOCSIFTXQLEN, &ifr))

PLOG(ERROR) << "failed to set dev eth0 queue length";

if (-1 == ioctl(sock_, SIOCGIFTXQLEN, &ifr))

PLOG(ERROR) << "failed to get dev eth0 queue length";

LOG(KEY) << "Dev eth0 queue length " << ifr.ifr_qlen;

果然,发现好了,没有发送丢包了

去掉SO_SNDBUF的设置,获取下SO_SNDBUF,才多少K,再测试,仍然没有发送丢包。

结论:

sendto过快导致发送丢包,是因为发送队列满了,如果说缓存区,估计大部分人都将误解。

至于接收方因为突发率导致接收丢包的问题,那么就要在发送方进行发送平滑进行解决。

udp丢包 处理

转自: 自己在做UDP传输时遇到的问题,接收端没设置缓存,结果总是丢包. 看到这篇文章设置了一下接收缓存就好 *;//设置为32K setsockopt(s,SOL_SOCKET,SO_RCVBUF, ...

UDP丢包原因总结

丢包检查方法 给每个UDP包编号,对比收发端的接收到的包.对于UDP协议层上的包,例如RTP包,可以从RTP包中读出包的序列号进行判断. 抓包.发送端和接收端分别抓包.linux下可以使用tcpdum ...

浅谈UDP&lpar;数据包长度,收包能力,丢包及进程结构选择&rpar;

UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

Linux服务器丢包故障的解决思路及引申的TCP&sol;IP协议栈理论

我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...

linux 系统 UDP 丢包问题分析思路

转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

【VS开发】浅谈UDP&lpar;数据包长度,收包能力,丢包及进程结构选择&rpar;

UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

&lbrack;转载&rsqb;Linux服务器丢包故障的解决思路及引申的TCP&sol;IP协议栈理论

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论 转载至:https://www.sdnlab.com/17530.html 我们使用Linux作为服务器操作系统时,为了达到高并发处理 ...

java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案

try { //向指定的ip和端口发送数据~! //先说明一下数据是谁发送过来的! byte[] ip = InetAddress.getLocalHost().getHostAddress().ge ...

【疑】checkpoint防火墙双链路切换导致丢包问题

拓扑: 外线联通.电信各200M,通过边界交换机(纯二层,用于分线),分别接到主.备防火墙. 具体配置如下: 故障现象: 由于电信光缆中断导致电信链路不可用.大量员工反映频繁出现断网现象,通过公网注册 ...

随机推荐

带你使用h5开发移动端小游戏

带你使用h5开发移动端小游戏 在JY1.x版本中,你要做一个pc端的小游戏,会非常的简单,包括说,你要在低版本的浏览器IE8中,也不会出现明显的卡顿现象,你只需要关心游戏的逻辑就行了,比较适合逻辑较为 ...

MySQL更新优化

通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作).当读取者完成对表的操作的时候,锁就会 ...

大家注意:升级 win8&period;1 火狐浏览器 谷歌浏览器 搜狗五笔输入法 都不能用啦

大家注意:升级 win8.1 火狐浏览器 谷歌浏览器 搜狗五笔输入法 都不能用啦 我的电脑64位 win8 thinkpad e531,8G内存 刚在线升级完8.1,发现这些问题,大家注意,有知道问题 ...

04---XML编程整理

一.XML概述       XML(eXtensible Markup Language),可扩展标记语言,       被设计的宗旨是传输数据,而非显示数据       W3C发布的,目前遵循1.0 ...

解决NSAttributedString与UILabel高度自适应计算问题

两个类扩展方法: /** *  修改富文本的颜色 * *  @param str   要改变的string *  @param color 设置颜色 *  @param range 设置颜色的文字范围 ...

Android 蓝牙&lpar; Bluetooth&rpar;耳机连接分析及实现

Android 实现了对Headset 和Handsfree 两种profile 的支持.其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它. if ( ...

CSS position 笔记&plus;实验

目录: 1.static 2.relative 3.absolute 4.fixed 5.实验:static, relative, absolute中,父元素-子元素高度关系 6.z-index 7. ...

导入Spreadsheet到sharepoint2013报错

当导入Spreadsheet到sharepoint2013会报下面的错: an unexpected error has occurred -2147467259 The specified file ...

jquery遍历集合&amp&semi;数组&amp&semi;标签

jquery遍历集合&数组的两种方式 CreateTime--2017年4月24日08:31:49Author:Marydon 方法一: $(function(){ $("inp ...

【C】常用的字符串函数

1. strcpy 函数名:strcpy 用法:char *strcpy(char *destin, char *cource) 功能:将一个字符串从一个拷贝到另外一个 程序示例: #include ...

linux ip转发 丢包,sendto频率过快导致发送丢包相关推荐

  1. UDP sendto频率过快导致发送丢包

    sendto频率过快导致发送丢包 - 逸蒙 - 博客园 编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络 ...

  2. linux ip 转发设置 ip_forward

    工作原理: 内网主机向公网发送数据包时,由于目的主机跟源主机不在同一网段,所以数据包暂时发往内网默认网关处理,而本网段的主机对此数据包不做任何回应.由于源主机ip是私有的,禁止在公网使用,所以必须将数 ...

  3. linux ip转发如何设置,如何在Linux上启用IP转发

    为了安全起见,在现代Linux操作系统中默认禁用IP转发.如果需要在系统上启用IP转发,需要执行以下步骤.在本篇文章中,将带你了解如何检查是否启用了IP转发.如果没有,如何启用它. 检查当前IP转发 ...

  4. linux ip转发 丢包,关于ip_conntrack跟踪连接满导致网络丢包问题的分析

    我们的线上web服务器在访问量很大时,就会出现网络连接丢包的问题,通过dmesg命令查看日志,发现如下信息: kernel: ip_conntrack: table full, dropping pa ...

  5. linux ip转发 丢包,高并发下iptables丢包导致网络变慢解决方法

    很多人估计遇到这个问题,开启iptables时,一旦网络连接并发较多,比如5000个以上,就发现网络响应变得很慢, 这时syslog中出现大量以下日志: ip_conntrack: table ful ...

  6. Android Socket通信 发送心跳包 重连

    最近项目中,有使用Socket与后端进行通信,然后简单的了解了下Socket使用,大致流程是配置服务端的Ip.端口号,连接,监听数据和发送数据,数据的读取和发送都是以流的形式实现的,然后自己将项目中的 ...

  7. TCP协议RST:RST介绍、什么时候发送RST包

    一.RST介绍 RST标示复位.用来异常的关闭连接. 1. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST. 2. 而接收端收到RST包后,也不必发送ACK包来确 ...

  8. 【linux】net-speeder减少由于网络距离过远导致的丢包问题

    介绍 当网络距离过远时,可能会由于中间节点性能太差或延迟过高导致数据丢包的问题.虽然tcp有重传的机制,但是同时也会增大网络延迟.net-speeder采用多倍发包,同时发送N个数据到出来,只要其中有 ...

  9. Linux 利用 IP转发使内网连接到公网

    一.项目背景描述 实际运维工作中,很多机器是不带公网的,一般一个集群或一个平台只有前端能访问互联网,划属于DMZ区域,而内网机器一些因安全所进行的升级,如果采用手动离线升级的话,效率低,而且比如内核升 ...

  10. linux centos7开启IP转发、路由转发解决docker 端口映射 及外部无法访问问题

    1.临时开启,(写入内存,在内存中开启)echo "1" > /proc/sys/net/ipv4/ip_forward2.永久开启,(写入内核)在 vim /etc/sys ...

最新文章

  1. 【Spring框架家族】Spring--Security权限控制密码加密
  2. JavaScript——易班优课YOOC课群在线测试禁止右键和复制解决方案
  3. mysql主从配置原理_MySQL主从复制原理
  4. 如何在UE4中创建线程
  5. linux网络通信移植,基于socket API的C/S通信:将Qt程序从Linux移植到windows
  6. Android之使用ThumbnailUtils类来获取视频第一帧缩略图
  7. jwt token注销_详解JWT token心得与使用实例
  8. 图模型在信息流推荐系统中的原理和实践
  9. TPC-DS标准规范(2)
  10. 微服务2——服务的注册,调用(Nacos服务注册中心+服务调用+调用负载均衡)sca-comsumersca-provider
  11. VMware虚拟机恢复系统的某个状态的方法
  12. 2.dex反编译工具的安装(jadx、gda、jeb)
  13. 安徽科技学院 信网学院网络文化节 高庆
  14. C语言:初识数组及数组的复制
  15. 未来MCU设计的几个方向
  16. linux中bridge简介
  17. 小屏幕android手机,手机屏越来越大,用户到处找小屏安卓手机,这三款便宜又好用...
  18. 训练数据集的图片尺寸修改集标注标签修改
  19. 2021中国家居建材行业信息化发展论坛圆满落幕
  20. 996 盛行的年代,互联网人如何平衡工作和生活 ?

热门文章

  1. Canvas 画直线
  2. Myeclipse中编辑Jsp时解决光标乱跑的方法
  3. Unity功能点---动画控制CrossFade方法的使用和简单说明
  4. hdu1166 敌兵布阵(模板题 单点修改 + 区间查询)
  5. 【22年新版】软件工程专业的各阶段的学习方法
  6. android怎么开启wifi热点,android 开启wifi热点api
  7. 商场云WiFi靠谱吗
  8. 夜曲歌词 拼音_周杰伦夜曲的歌词
  9. 美元MogaFX指数介绍(二)
  10. 华为网络设备-NAT实验