网卡收发数据的流程图
网卡的作用
网卡接受到的是光信号或者是电信号,然后将其还原成为数字信息; 同样,对于网卡的发送信息而言,网卡将数字信息转换为光信号或者电信号发送出去。
网卡属性
- 带宽
- 队列
- mac 地址
网卡 mac 地址
什么是网卡 mac 地址
网卡生产出来就带有mac地址,mac具有全局唯一性,类似于一个身份证。
网卡mac 地址的作用
用以表示网卡的唯一性。在局域网之中可以作为计算机的定位方式。
如何查看网卡的mac 地址
cat /sys/class/net/网卡名/address
网卡带宽
网卡带宽的含义
网卡每秒接收或发送数据的能力
查看指定网卡的带宽
ethtool 网卡名 | grep Speed
网络带宽 与 网卡带宽的区别
网卡带宽 指的是网卡的能力 网络带宽 指的是网络传输介质的能力。 数据在 网络传输介质 和 网卡 之间相互传输 。
网卡队列
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