Linux TCP收包内容总结-----学习笔记 ,如果有理解不正确的,欢迎各位拍砖, :)
总揽:数据包在从进入网卡一直到用户程序能读取所经历的几个层级以及各层使用到的工具命令和参数,如下表格:
接收的网络数据依次经1:网卡硬件-->2 内核缓存队列-->3协议层--->4用户recv使用的buff. 也就是说网卡收到数据包后要几经辗转才能被用户程序读取,而在”辗转”的过程中也是会有将数据包丢弃操作的.下面细说.
一:在网卡硬件层丢包
查看网卡硬件层是否有数据包丢弃:
1,ifconfig如果看到overruns 数值不为0,
2或ethtool –S ethX|egrep “discard|error|drop”, (将ethX换成你实际网卡)看到的统计计数不为0, 如果这值一直在增长,则可能在网卡硬件或驱动层面丢包了,原因可能为:
- Ring buffer (网卡硬件上的缓存) 过小, 队列满了后,内核还没有来得仍取走数据, 新到网卡的数据包被丢弃.此时需要修改ring buffer.后面会详细提到.
- 网卡硬件有问题,需要联系硬件厂商(更换或升级硬件固件)
- 网卡驱动有问题,更新驱动
- 操作系统超级繁忙. 需要分析系统性能.
针对第一种情况,可以修改ring buffer,首先需要网卡硬件以及驱动的支持, 有些较老的网卡及驱动是不支持修改此值的.其次,修改此值的时候可能会造成丢包甚至网络中断,所以最好是在非业务运行时段进行.最后,修改完此值后,下次重启主机不会生效,需要将期加入开机启动,或者加入网卡配置文件启动参数中去.<