Linux内核二常用的网络丢包错包debug工具介绍

Posted highman110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核二常用的网络丢包错包debug工具介绍相关的知识,希望对你有一定的参考价值。

👉个人主页:highman110

👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 

目录

ifconfig

Ifconfig输出各字段简述

txqueuelen

RX和TX的errors指哪些错误

dropped与overruns的区别

常用ifconfig配置命令

显示网卡信息

启动关闭指定网卡

配置和删除ip地址

修改MAC地址

启用和关闭ARP协议

设置最大传输单元

设置网卡的promiscuous模式

设置网卡的多播模式

配置和删除IPv6地址

配置txqqueuelen

ethtool

netstat


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工具介绍的主要内容,如果未能解决你的问题,请参考以下文章

linux 下使用 tc 模拟网络延迟和丢包

linux 下使用 tc 模拟网络延迟和丢包

linux 下使用 tc 模拟网络延迟和丢包

性能工具之网络 Benchmark iperf3 快速入门

linux查看网络丢包情况 mtr网络连通性判断工具

mtr网络监测工具