Linux 网卡

968 阅读6分钟

网卡收发数据的流程图

Linux 网卡接收数据包流程.png

数据包从网卡发出.png

网卡的作用

网卡接受到的是光信号或者是电信号,然后将其还原成为数字信息; 同样,对于网卡的发送信息而言,网卡将数字信息转换为光信号或者电信号发送出去。

网卡属性

  • 带宽
  • 队列
  • mac 地址

网卡 mac 地址

什么是网卡 mac 地址

网卡生产出来就带有mac地址,mac具有全局唯一性,类似于一个身份证。

网卡mac 地址的作用

用以表示网卡的唯一性。在局域网之中可以作为计算机的定位方式。

如何查看网卡的mac 地址

cat /sys/class/net/网卡名/address

网卡带宽

网卡带宽的含义

网卡每秒接收或发送数据的能力

查看指定网卡的带宽

ethtool 网卡名 | grep Speed

网络带宽 与 网卡带宽的区别

网卡带宽 指的是网卡的能力 网络带宽 指的是网络传输介质的能力。 数据在 网络传输介质 和 网卡 之间相互传输 。

网络网卡数据传输.png

网卡队列

ring buffer

ring buffer 是什么

内核分配给网卡的 内存缓冲区。一个 ring buffer 就相当于一个队列,先进先出。ring buffer 是环形内存缓冲区。

注意:一个网卡有 接收队列 和 发送队列 两种类型的队列。接收队列用来存储外界发向本机的数据包,发送队列用来存储 本机 向外界 发送的数据包。

ring buffer 之中的元素是什么

指向一个sk_buffer 的指针。 sk_buffer 是内核之中定义的一个数据结构。

ring buffer (接收队列)入队

网卡DMA 会将 网卡 接收到的数据包 写入到 一个或多个 sk_buffer之中,sk_buffer对应的指针存储在 RingBuffer之中。

ring buffer(接收队列) 出队

网卡的DMA 执行完成后,触发一个硬中断,硬中断所对应的软中断会调用网卡驱动,将RingBuffer之中的数据交给上层网络栈。

ring buffer 的大小

ring buffer 是网卡层面的参数。 linux上有操作网卡的工具 ethtool, 所以使用这个命令可以来显示和修改 ring buffer的值。 输出显示

   root@iZ8vbgnpry7oc41pxbc5dyZ:~# ethtool -g eth0
   Ring parameters for eth0:
   Pre-set maximums:
   RX:             4096
   RX Mini:        0
   RX Jumbo:       0
   TX:             4096
   Current hardware settings:    // 当前硬件设置
   RX:             4096     // ring buffer的大小,接收队列
   RX Mini:        0
   RX Jumbo:       0
   TX:             4096     //  ring buffer的大小 发送队列   单位是字节。

ring buffer 溢出处理策略

网卡的接收队列 满了的话,网卡会丢弃接收到的数据包。 网卡的发送队列 满了的话,应该会阻塞,等到发送队列有空闲的空间,继续写入(自己的猜测)。

网卡多队列 (RSS)

网卡多队列的定义

网卡多队列是指 网卡的 发送队列 和 接收队列 不止一个。 注意:网卡多队列 是 网卡自身的属性,是硬件属性

网卡多队列的实质

为网卡的每一个队列分配一个硬中断号。将不同的硬中断号分配到不同的cpu。 在 /proc/interrupts 文件之中可以查看每个队列所对应的硬中断号。

网卡多队列的产生原因

cpu的发展,单网卡对应多核cpu 而演化的结构,为了提高cpu的利用率。 同一时刻 一个cpu 只能拉取一个 队列之中的数据,如果发送速率 大于 接收速率, 只有一个队列的话,数据会丢失,而目前服务器上 cpu 是多核的。

如何查看网卡是否支持 RSS

ethtool -l 网卡名 输出信息解释

Channel parameters for eth0:
Pre-set maximums:
RX:		0
TX:		0
Other:		0
Combined:	1 //所能开启的队列数上限制,如果大于1 表示网卡支持多队列
Current hardware settings:
RX:		0
TX:		0
Other:		0
Combined:	1  // 当前开启的队列数

如何查看 网卡是否已经开启RSS

ethtool -l 网卡名 输出信息解释

Channel parameters for eth0:
Pre-set maximums:
RX:		0
TX:		0
Other:		0
Combined:	1 //所能开启的队列数上限制,如果大于1 表示网卡支持多队列
Current hardware settings:
RX:		0
TX:		0
Other:		0
Combined:	1  // 当前开启的队列数,如果大于1,表示开启了网卡多队列

网卡 DMA

网卡 DMA 的作用

DMA 是网卡的一部分。老旧的网卡是没有DMA 这个组件的。

接收数据时: DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO(先入先出)原则。sk_buffer 的指针 存储在 ring buffer 之中。

发送数据时: DMA 将 ring buffer 之中的数据 写入到网卡。

网卡驱动程序

网卡驱动程序的作用

自己的理解: 接收数据时 读取 接收队列的数据之中的数据,提交到内核的网络栈。 发送数据时 将内核的网络数据包 写入到 发送队列的缓冲区之中。

Linux 上网卡的操作工具

ethtool ifconfig

网卡 在Linux 上对应的文件 或 目录

/sys/class/net/网卡名

网卡操作

1:查看网卡信息

ifconfig 网卡名

1 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
2     inet 172.16.217.151  netmask 255.255.240.0  broadcast 172.16.223.255
3     inet6 fe80::216:3eff:fe10:b4f3  prefixlen 64  scopeid 0x20<link>
4     ether 00:16:3e:10:b4:f3  txqueuelen 1000  (Ethernet)
5     RX packets 4258  bytes 3401248 (3.4 MB)
6     RX errors 0  dropped 0  overruns 0  frame 0
7     TX packets 2782  bytes 560853 (560.8 KB)
8     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0 表示网卡的名词, 第一行: UP 表示网卡启用, BROADCAST表示网卡支持广播 MULTICAST表示网卡支持多播 mtu 表示mac层的最大数据传输长度,不包含mac头部。

第二行: inet后面跟随的是的网卡配置的ip地址 netmask 表示子网掩码的值 broadcast 表示广播地址

网卡监控

查看网卡的监控信息

ethtool -S 网卡名

网卡监控数据来源

/sys/class/net/网卡名/statistics 目录 注意:目录下的一些文件之中指标的含义,会由具体的网卡驱动来决定指标增长的方式,所以不同的驱动可能划分的标准不同。

ring bufffer 监控

如何查看 ring buffer 出现溢出了

执行 ifconfig 网卡名 查看输出信息的 overruns,表示因为 环形队列满 而被丢弃的包的数目。RX 表示接收 TX 表示发送。

网卡数据量监控

1:网卡接收到的数据包 /sys/class/net/网卡名/statistics/rx_packets/rx_packets 2:网卡接收到的数据量 /sys/class/net/网卡名/statistics/rx_bytes 3:网卡发送的数据包 /sys/class/net/网卡名/statistics/rx_packets/tx_packets 4:网卡发送的数据量 /sys/class/net/网卡名/statistics/tx_bytes