Linux内核二常用的网络丢包错包debug工具介绍
Posted highman110
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核二常用的网络丢包错包debug工具介绍相关的知识,希望对你有一定的参考价值。
👉个人主页:highman110
👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容
目录
ifconfig
关于此工具找到一篇雄文:note/ifconfig.md at master · vikyd/note · GitHub
Ifconfig输出各字段简述
以下图的Ubuntu系统为例:
字段:eth0
含义:网卡名,网卡驱动里定义的名称,这个没什么好说的。
字段:flags
示例:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>
含义:表示当前网卡的状态(此列表并非可操作的命令)
详细:
UP:表示网卡已启动(interface is up),无 UP 则表示网卡未启动(ifconfig -a 显示未启动网卡)
BROADCAST:网卡的广播地址有效(broadcast address valid. Volatile)
RUNNING:网卡已连接到路由器等设备(interface RFC2863 OPER_UP. Volatile)
与UP的区别:UP 表示网卡本身启动了,RUNNING 表示是否连接到了路由器等设备。
MULTICAST:可以发送组播包(或说多播)(Supports multicast)
关于4613的这个数字怎么来的,请查看雄文原文,这里不多提了。
字段:mtu
示例:mtu 1500
全称:Linux 文档中称为:Maximum Transfer Unit维基百科中称为:Maximum Transmission Unit
含义:最大传输单元;指链路层(第 2 层)的 frame 的 payload(负载)的最大大小;Linux 中 MTU 对发送和接收都起作用。
单位:Byte
详细:为什么mtu通常是1500?请查看原文。
字段:inet
示例:inet 10.10.10.11 netmask 255.255.240.0 broadcast 10.10.10.255 中的 10.10.10.11
全称:Internet
含义:TCP/IP 的 IPv4 地址(IPv6 的字段为inet6)
理解:互联网基于TCP/IP 协议族(protocol family),所以通常inet指IP地址
类型:除了inet,还可能会有:inet6、ax25、ddp、ipx、netrom 等类型
字段:netmask
示例:netmask 255.255.240.0
全称:IP network mask
中文:子网掩码
字段:broadcast
示例:broadcast 10.10.10.255
全称:IP broadcast address
中文:广播地址
字段:inet6
示例:inet6 fe80::215:5dff:fef6:a8e7
全称:类似前面 inet
含义:TCP/IP 的 IPv6 地址
字段:prefixlen
示例:prefixlen 64
全称:prefix length
含义:表示此地址的前64位是网络前缀,作用类似于IPv4的子网掩码
字段:scopeid
示例:scopeid 0x20<link>
全称:scope id
含义:0x20<link> 表示 IPv6 的 Link-Local类型地址
字段:ether
示例:ether 42:01:0a:aa:00:03
全称:Ethernet
中文:以太网
含义:表示网卡的 MAC 地址
理解:对应第 2 层链路层的Ethernet协议
字段:txqueuelen
示例:txqueuelen 1000
全称:transmit queue length
理解:发送数据时qdisc(Queuing Disciplines)队列的大小
单位:sk_buff(socket buffer)
详细:txqueuelen 是一个比较长的话题,见后面txqueuelen小节
字段:RX 与 TX
示例:
RX packets 69426519 bytes 20960261647 (19.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73886979 bytes 15013465511 (13.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这两个大字段数据主要 来源于 /proc/net/dev(查看:cat /proc/net/dev)
参考:Linux输出 /proc/net/dev的源码
字段:RX
示例:
RX packets 69426519 bytes 20960261647 (19.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
全称:Received
含义:网卡接收数据的统计
字段:
packets 69426519:成功接收到的数据包数量
单位:sk_buff(与第 2 层链路层的frame的数量相等)
注意:这不是第3层网络层的单位packet
bytes 20960261647 (19.5 GiB):数据 + 各层header的字节数量
换算:CentOS 貌似常按 1024 换算成 GiB,Ubuntu 貌似常按 1000 换算成 GB,参考 man 7 units
errors:出错的包数量
单位:sk_buff
注意:此数值不等于后面 dropped、overruns、frame字段的总和,原因见后面 RX的errors指哪些错误小节
dropped:Linux 内核对应的sk_buff满了导致的丢包
单位:sk_buff
可能原因之一:Linux系统内存不足,导致从网卡拷贝数据到系统内存时丢包
overruns:Linux 内核对应的Ring Buffer满了导致的丢包
单位:sk_buff
可能原因之一:CPU 很忙无法及时处理网卡申请的中断
对应 Linux Kernel 的 rx_fifo_errors
注意:详细见后面dropped与overruns的区别小节
frame:指第2层链路层的frame的bit数不能被8整除,不符合帧的定义的错误
单位:sk_buff
可能原因之一:网卡、交换机等硬件故障导致
详细:见后面RX和TX小节
字段:TX
示例:
TX packets 73886979 bytes 15013465511 (13.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
全称:Transmitted
含义:网卡发送数据的统计
字段:
与 RX 同名的字段:略过
errors:与前面 RX 的 errors 包含的错误类型有些不一样
carrier:硬件调制信号(modulation of signal)导致的出错包数量
collisions:冲突的包数量
txqueuelen
txqueuelen
是发送数据时qdisc的允许队列大小,txqueuelen 的单位是 sk_buff(socket buffer),发送数据时,应用层的数据经过内核协议栈的层层封装后,先到达qdisc,之后才到达Ring Buffer(就是下图中的Driver queue),Ring Buffer是一个简单的FIFO(先进先出)队列,但太简单,所以出现了qdisc 提供灵活的流量控制功能。
RX和TX的errors指哪些错误
RX错误类型包括:
rx_frame_errors(对应ifconfig 的frame,表示非对齐的帧,这种错误一般出现在物理层)
rx_crc_errors(不对应ifconfig 的任何字段,表示帧校验错误,这种错误一般出现在物理层)
rx_length_errors(不对应ifconfig的任何字段)
rx_fifo_errors(对应ifconfig的overruns)
这些错误类型可能因不同网卡而不同
错误类型 不一定 包括:
rx_dropped(对应ifconfig的dropped)
TX错误类型包括:
tx_window_errors(不对应 ifconfig 的任何字段)
tx_aborted_errors(不对应 ifconfig 的任何字段)
tx_carrier_errors(对应 ifconfig 的 carrier)
tx_fifo_errors(对应 ifconfig 的 overruns)
这些错误类型可能因不同网卡而不同
错误类型不包括:
tx_dropped(对应 ifconfig 的 dropped)
dropped与overruns的区别
dropped与overruns是指两种不同的丢包情况。
要了解两者的区别,需首先了解Linux内核中的 网络数据流转机制。
以接收数据为例:
1)网卡驱动在内存中分配一片缓冲区用来接收数据包,叫做sk_buff
2)将上述缓冲区的地址和大小(即接收描述符),加入到rx ring buffer。描述符中的缓冲区地址是 DMA 使用的物理地址
3)驱动通知网卡有一个新的描述符
4)网卡从rx ring buffer中取出描述符,从而获知缓冲区的地址和大小
5)网卡收到新的数据包;
6)网卡将新数据包通过 DMA 直接写到sk_buff中
注意,上述流程有几个可能容易模糊的概念:
网卡驱动:这是跑在 Linux 中的程序,而非跑在网卡硬件中
sk_buff:存在于 Linux 内存中,可以在不同的网络协议层之间传递(在 Linux 源码中的定义见 skbuff.h),sk_buff 是真正存放网络数据的位置。
rx ring buffer:是一个 FIFO(先进先出)队列,队列的内容并不是真正的网络数据,而是一些指向 sk_buff 的描述符。
再次看下这个图可能会更清晰:
了解上述流程后,可以开始说两者的区别了:
dropped:sk_buff 满了,新的数据写不进 sk_buff 导致的丢包
可能原因之一:Linux系统分配的内存不足,导致从网卡拷贝数据到系统内存时丢包。
overruns:ring buffer 队列满了,队列暂无可用的描述符,导致的丢包。在 ifconfig 源码实际就是 rx_fifo_errors(recv'r fifo overrun)
可能原因之一:CPU 很忙无法及时处理网卡申请的中断
总之,大概可理解为,一个是指针满了(overruns),一个是内存满了(dropped)
ring buffer满了不代表buffer满了,可能是因为每个指针指向的buffer数据都很小,当有一段相对小帧数据过来,需要的消耗的指针数量大于ring buffer的当前容量;sk_buff 满了也不代表 ring buffer满了,可能是因为每个指针指向的buffer数据较大,大到当前的socket buffer装不下此数据。
常用ifconfig配置命令
显示网卡信息
(1) 显示激活的网卡信息
ifconfig
(2) 显示所有的网卡信息
ifconfig -a
(3) 显示简要的网卡信息
ifconfig -s
启动关闭指定网卡
(1) 关闭网卡
ifconfig eth0 down
(2) 启动网卡
ifconfig eth0 up
配置和删除ip地址
(1) 配置ip
// 配置ip地址
ifconfig eth0 192.168.1.100
// 配置ip地址和子网掩码
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
// 配置ip地址、子网掩码和广播地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
(2) 单网卡添加多个IP地址
ifconfig eth0:0 192.168.1.100 netmask 255.255.255.0 up
ifconfig eth0:1 192.168.2.100 netmask 255.255.255.0 up
(3) 删除IP地址
ifconfig eth0 del 192.168.1.100
修改MAC地址
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE
启用和关闭ARP协议
(1) 启用arp
ifconfig eth0 arp
(2) 禁用arp
ifconfig eth0 -arp
设置最大传输单元
ifconfig eth0 mtu 1500
设置网卡的promiscuous模式
(1) 启用
ifconfig eth0 promisc ,指网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。
(2) 禁用
ifconfig eth0 -promisc
设置网卡的多播模式
(1) 启用
ifconfig eth0 allmulti
(2) 禁用
ifconfig eth0 -allmulti
配置和删除IPv6地址
(1) 添加
ifconfig eth0 add 3ffe:3240:800:1005::2/64
(2) 删除
ifconfig eth0 del 3ffe:3240:800:1005::2/64
配置txqqueuelen
ifconfig eth0 txqqueuelen 1500
ethtool
ethtool查询或控制网络驱动程序和硬件设置。利用ethtool可以根据需要更改以太网卡的参数,包括自动协商、速度、双工和局域网唤醒等参数。
命令格式:ethtool [<options>] [<devname>]
Option说明:
-a, --show-pause
查看网卡中接收模块RX、发送模块TX 和 Autonegotiate模块的pause帧流控状态:启动on或停用off。
-A, --pause <devname> [autoneg on|off] [rx on|off] [tx on|off]
修改网卡中接收模块RX、发送模块TX和Autonegotiate 模块的pause帧流控状态:启动on或停用off。
-c, --show-coalesce
查询指定网络设备的合并信息。
-C, --coalesce
更改指定网络设备的合并设置。
-g, --show-ring
显示指定以太网卡的rx/tx环参数信息。就是上篇文章提到的ring buffer。
-G, --set-ring
更改指定以太网卡的rx/tx环设置。
-i, --driver
显示网卡驱动的信息,如驱动的名称、版本等。
-d, --register-dump <devname> [raw on|off] [hex on|off] [file name]
显示register dump信息,部分网卡驱动不支持该选项。
-e, --eeprom-dump <devname> [raw on|off] [offset N] [length N]
显示EEPROM dump信息,部分网卡驱动不支持该选项。
-E, --change-eeprom
修改网卡 EEPROM byte。
-k, --show-features, --show-offload <devname>
显示网卡 Offload 参数的状态:on或off,包括 rx-checksumming、tx-checksumming等。就是网卡来做一些事情,给CPU减负。
-K, --features, --offload <devname> <feature> on|off ...
修改网卡 Offload 参数的状态。
-p, --identify <devname> [N]
用于区别不同 ethX 对应网卡的物理位置,常用的方法是使网卡 port 上的 led 不断的闪;N 指示了网卡闪的持续时间,以秒为单位。
-P, --show-permaddr
向指定的网络设备查询永久硬件地址。
-r, --negotiate <devname>
如果auto-negotiation 模块状态为on,则restarts auto-negotiation。
-S, --statistics
显示 NIC- and driver-specific 的统计参数,如网卡接收/发送的字节数、接收/发送的广播包个数等。
-t, --test
让网卡执行自我检测,有两种模式:offline or online。
-s, --change
修改网卡的部分配置,包括网卡速度、单工/全双工模式、MAC地址等。
-h, --help
显示帮助信息。
--version
显示版本信息。
参考文章:(24条消息) Linux 命令(194)—— ethtool 命令_ethtool命令详解_恋喵大鲤鱼的博客-CSDN博客
netstat
该命令经常用于查看网络连接状态
下面是它的一些参数:
-a:显示所有选项
-t:仅显示tcp相关选项
-u:仅显示udp相关选项
-n:不显示别名
-l:仅列出处于监听状态下的服务
-p:显示建立相关链接的程序名
-r:显示路由信息、路由表
-e:显示扩展信息,如uid
-s:按各个协议进行统计
-c:每隔一段事件执行netstat
以上是关于Linux内核二常用的网络丢包错包debug工具介绍的主要内容,如果未能解决你的问题,请参考以下文章