流程如下,collecter抓取网卡lo和wlan0数据,其中lo口无数据,wlan0是笔记本上网网口,然后按自定义协议把数据包通过lo口发给后端dispatch进行分发!

这种模式下,抓包程序每经过一段时间,lo口就会开始抓到超出上层应用协议的数据包(上层应用最大支持长度0xffff),导致collecter和dispatch间断链重连。如果停掉collecter向后转发,则collecter抓取的数据包长度正常,用tcpdump验证,抓取wlan0口数据包平均包长在500B左右,lo口无数据;

启动向后转发,collecter只抓lo口,同时配置collecter读取一个只有数据包的pcap文件作为初始输入,原始数据包如下:

tcpdump从lo口抓包, 发现通过lo口转发到后端的数据,会被collecter捕获然后再又通过lo口发出,形成环路,如下所示:

1. 第一个带数据的是第11个数据包,前面的一些包是鉴权和协商!蓝色部分前8字节是协议部分!可以看到这时捕获正常(数据66B + 8B协议头 = 74B)。

2. 第11个数据包发出后就被捕获,看下面第13个数据包的承载部分,collecter接收到这个数据后,会额外打上协议头再转发(新的长度 = 第11个包长度 + 8B协议头  = 148),从这看出数据开始形成环路:

查看lo口MTU和tcp协商的MSS如下:

可以看到lo口MTU过大,由于lo环路,会导致tcp承载数据越来越大。对上层协议来说,由于协议缓冲区最大长度为65535,当捕获的数据包中应用协议长度大于(65535 - 8)时,就会产生错误,导致断链!

解决方法:

1. 调整部署,捕获数据的网口应该专用于数据接入,数据发送使用其它网口!

2. 调小lo口MTU,这样只能避免断链问题,错误会越积越多!

待验证:

有同事测试发现,大流量下lo口(mtu默认为65536)数据转发,cpu利用率很低(2.4G服务器8核24线程,  无法跑满单核CPU, 占比3%左右),导致发送线程睡眠,阻塞报文,程序性能很低。后调整MTU至1500后cpu利用率提升,程序性能提高三倍!

最新文章

  1. mysql 找回密码方法
  2. Neo4j批量插入(Batch Insertion)
  3. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
  4. javascript、jQuery函数定义和调用方法
  5. background属性
  6. 服务器端与客户端TCP连接入门(二)
  7. 匈牙利算法 codevs 2776 寻找代表元
  8. android 开发 实现自动安装
  9. Nginx下防御HTTP GET FLOOD(CC)攻击
  10. Activity 模版样式简介
  11. 内置的材质包含文件 .cginc
  12. 淘宝PK京东:哥刷的不是广告,刷的是存在
  13. 记一次Monolog的BufferHandler使用
  14. mysql系列五、mysql中having的用法
  15. uva-10954-贪心
  16. Linux-socket的close和shutdown区别及应用场景
  17. FileReader类和FileWriter类的基本用法示例
  18. VS中自动选择x86或x64的dll
  19. spring mvc MultipartFile 上传文件 当文件较小时(10k) ,无法上传成功 。
  20. 170629、springboot编程之Druid数据源和监控配置二

热门文章

  1. redux详解
  2. Django Reverse for 'artic_post' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
  3. wgan pytorch,pyvision, py-faster-rcnn等的安装使用
  4. udp重发java实现
  5. lintcode_111_爬楼梯
  6. Linux - 用户环境变量的查看与设置
  7. myeclipse从SVN上拉项目,各种报错,jar包没有引入
  8. 【Python 2 到 3 系列】 print 是函数
  9. 45.VUE学习之--组件之父组件使用scope定义子组件模板样式结构实例讲解
  10. cf978E Bus Video System