Wireshark数据包分析实战:网卡卸载


Wireshark数据包分析实战:网卡卸载文章插图
阅读本文约需要10分钟 , 您可以先关注我们 , 避免下次无法找到 。
Wireshark数据包分析实战:网卡卸载文章插图
01 引言上周在公司内部做TCP/IP协议知识培训 , 讲到以太网数据的长度必须在46-1500字节时 , 突然有位同事打断成哥 , 说这个长度限制应该已经过时了 。
他说前两天捕获数据包进行分析时看到Wireshark软件上显示的"Length"长度能达到9000多字节 。
为了有图有真相 , 他立刻把截图发了过来 。 就是下图 。
Wireshark数据包分析实战:网卡卸载文章插图
他有理有据的继续说 , 你看这个以太网数据包长度能达到9000多字节 , 那就说明MTU、MSS等限制也就自然没用了 。
当时培训教室的气氛一度尴尬 , 鸦雀无声 , 都在等我能够做个解释 , 给予圆场 。
成哥分析过的数据包 , 比他写过的代码还长 , 这个情况我很早之前就遇到过 。 正好借TCP/IP协议培训 , 把网卡的知识给普及一下 。
这里把结论抛出来 , 之后我们再详细分析 。
这位同事之所以看到以太网数据包能够达到9000多字节 , 是由于他的网络环境和数据包捕获位置所致 。
在他的网络环境中 , 服务器具有网卡卸载能力 , 同时数据包默认捕获位置是在网卡卸载之前 , 这样他就能看到长度超过1514字节的数据包 。
这和成哥讲授的TCP/IP协议理论没有冲突 , 只是服务器中处理IP数据包的部件发生了变化 。
下面我们详细分析 。
02 网卡卸载技术(1)网卡卸载技术
在普通的计算机中 , 比如型号和年代较老的服务器中 , IP数据包的封装、卸载及检查校验和等过程都是CPU负责运算和处理的 。 这种处理方式会占用一定的CPU资源 。 当数据流量大或网络质量不佳时 , 都会加重CPU的负担 。 据测算 , 传统的千兆网卡最高会消耗CPU约70%的处理能力 。
为了缓解CPU的压力 , 可以把IP数据包的处理工作交给有计算能力的网卡 , 让网卡IP数据包的封装、卸载、校验及分割等工作 。 这种技术就叫做网卡卸载技术 。
(2)分段卸载
在传统情况下 , 当上层应用一次传输的IP数据超过1500字节时 , CPU就会对数据进行分割 , 确保每片交给网卡的数据都不超过1500字节 。 这就是分段卸载的概念 。
如果网卡具有处理分段卸载的能力 , CPU就可以将上层应用的原始数据包直接发给网卡 , 交由网卡进行分段卸载 。 这种网卡分段卸载的功能就做TCP分段卸载 。
(3)TCP分段卸载
TCP分段卸载最大的特点就是将整个TCP/IP协议的处理能力转移到网卡硬件上 , 这样就可以把CPU的计算资源还给操作系统 。也就是说可以将IP层和传输层的处理任务下放到具备卸载能力的网卡上 , 利用网卡的TCP卸载引擎处理数据组装和传输任务 。
03 数据包的捕获位置说完了网卡卸载技术 , 我们来说一说数据包的捕获位置 。 说完大家就能完全明白这位同事的疑惑所在了 。
我们这里分两种情况进行详细说明 。
(1)不具备卸载功能的网卡
下图展示了在网卡不具备卸载功能的网络环境中TCP/IP协议处理IP数据流的过程 。
Wireshark数据包分析实战:网卡卸载文章插图
A.我们假设上层应用一次发送的数据是6600字节 。 在此种环境中 , TCP/IP是操作系统的一部分 , CPU会执行分段卸载功能 , 对6600字节的数据进行分割 , 确保每片交给网卡的数据都不超过1500字节 。
之所以需要分成五个部分 , 同时以太网的最大传输单元(MTU)为1500字节 。 如果减去20字节的IP头部和20字节的TCP头部 , TCP段中的数据还剩下1460字节(这就是TCP最大段大小(MSS)) 。 所以会将原始的IP数据分成五个部分 。
B.TCP层会分别对每个部分添加IP头部 , 然后把数据包下发 。
C.五个报文经过IP层后 , 都添加上IP层头部 。 然后把数据包下发 。
D.网络驱动程序将每个IP数据包封装在以太网帧中 , 并将以太网帧发送到网卡 。
数据包捕获位置是在网卡和网络驱动程序之间 , 即我们通过tcpdump或者wireshark等软件捕获到的都是以太网帧 。
(2)具备卸载功能的网卡
下图展示了在网卡具备卸载功能的网络环境中TCP/IP协议处理IP数据流的过程 。
Wireshark数据包分析实战:网卡卸载文章插图
A.我们同样假设上层应用一次发送的数据是6600字节 。 在此种环境中 , 操作系统不分割上层应用的数据 , 而是将用于应用数据直接添加TCP头部、IP头部 , 然后把数据包下发 。