一、 wireshark隐性知识点
工作位置
8b472949da410d2bc9fd6b24e2d9b413_webp.png
image.png
image.png
image.png
理解了分层的基本概念,我们再来看看复杂一点的情况。
如果这个写操作比较大,变成 8192 字节,TCP 层又该如何处理?
是否也是简单地加上 TCP 头就交给网络互连层(网络层)呢?答案是否定的。
因为网络对包的大小是有限制的,其最大值称为 MTU,即“最大传输单元”。
大多数网络的 MTU 是1500 字节,但也有些网络启用了巨帧(Jumbo Frame),能达到9000 字节。
一个8192 字节的包进入巨帧网络不会有问题,但到了 1500 字节的网络中就会被丢弃或者切分。
被丢弃意味着传输彻底失败,因为重传的包还会再一次被丢弃,被切分则意味着传输效率降低。
由于这个原因,TCP 不想简单地把 8192 字节的数据一口气传给网络互连层而是根据双方的MTU 决定每次传多少。知道自己的 MTU 容易,但对方的MTU如何获得呢?
在 TCP 连接建立(三次握手)时,双方都会把自己的MSS(Maximum Segment Size) 告诉对方。
MSS 加上TCP 头和IP头的长度,就得到 MTU 了。
为什么wireshark抓包看不到差错检测?
image.png
image.png
image.png
差错校验,被网卡拆掉了,在网卡这步就已经做了。
终端网卡如何进行CRC校验 ?
码串在传输的时候因为不可控的原因,有可能会发生错误,发送端往往会在码串中加入校验码,方便在接收端进行校验,验证码串是否正确。CRC是众多校验码中的一种。
终端网卡在发送数据帧的时候,会在帧后面加CRC校验码。
接收数据的终端,在收到1个或多个字节的preamble(前导码)和1字节(帧起始定界符)后,就能判断出收到了以太网帧,处理方式有两种。
- 如果是以Ethernet II 帧格式,则直接检查最后四个字节,校验错误则丢弃。
- 如果是802.3帧格式,则根据帧头找到CRC校验码,如果为空或者经计算为错则丢弃。
数据传输过程中,最容易出现校验错误的就是数据链路层,所以网卡绝不能省略CRC校验。
了解wireshark工作位置意义
- 解释了为什么wireshark抓包为什么没有差错检测字段
- 解释了为什么wireshark为什么抓不到受损的数据包
- wireshark不是“抓包”,是记录流经的数据包
链路层分片
你会发现wireshark抓到的包并没有在传输层做分片。
image.png
image.png
image.png
image.png
image.png
为什么会这样?
默认分片的活是网卡在干,网卡发出去的包才做了分片
在网卡之外,抓到的包符合我们的预期
# 网卡分片功能的关闭和开启
tso off
tso on
image.png
image.png
image.png
image.png
关闭网卡分片功能后,分片就放在传输层做了,wireshark抓到的包就不会超过1518了。
二、 图解网络Offload
网络应用程序如果要发送很大的数据包,经过内核协议栈的时,大包会被分片成多个不超过MTU长度的包。
这个分片比较费CPU资源。
Offload技术可以把这些分片和合并的工作进行优化处理,也可以直接Offload到网卡上。
image.png
MTU是一个二层的概念,即最大传输单元(Maximum Transmission Unit,MTU),它不包含二层以太网头尾数据。网卡发送数据包的大小都是限制在MTU内的。
image.png
以太网头和尾数据包含:2 bytes 的以太网类型+6 bytes 的DMAC+6 bytes 的SMAC+4 bytes 的FCS
TSO
TSO(TCP Segmentation Offload) 是一种利用网卡对大数据包进行分片,从而减小 CPU 负荷的一种技术。
其作用通过两个图来对比:
TSO off和GSO off 状态数据包的发送过程:
image.png
TSO on状态数据包的发送过程:
image.png
一个大的网络包直到进入网卡内部后才由网卡进行了分片。
GSO
GSO(Generic Segmentation Offload)是延缓分片技术。
它比 TSO 更通用,原因在于它不需要硬件的支持就可以进行分片。
其过程是:首先查询网卡是否支持TSO 功能,如果硬件支持TSO则使用网卡的硬件分片能力执行分片;
如果网卡不支持 TSO 功能,则将分片的执行,延缓到了将数据推送到网卡的前一刻执行。
网卡关闭TSO时,GSO on状态数据包的发送过程:
image.png
一个大的网络包直到进入网卡前的最后一步才进行了分片。
TSO和GSO对应数据发送过程,对应数据接收过程的是LRO和GRO。
LRO
LRO(Large Receive Offload)是将网卡接收到的多个数据包合并成一个大的数据包,然后再传递给网络协议栈处理的技术。这样提系统接收数据包的能力,减轻CPU负载。
LRO off和GRO off 状态数据包的接收过程:
image.png
LRO on状态数据包的接收过程:
image.png
数据一进入网卡立刻进行了合并。
GRO
GRO (Generic Receive Offload)是 LRO 的软件实现,只是GRO 的合并条件更加的严格和灵活。
GRO on状态数据包的接收过程:
image.png
以上的网络offload是网络协议栈配合网卡完成的。
分片功能并不是高层的专属,当底层硬件性能增强以后,也可以将这部分工作转移到链路层,这就是所谓的offload 到链路层。
现在的很多智能网卡上可以直接offload整个网络协议栈,即把网络协议的处理放到了智能网卡上。
三、 tcp_port & tcp_flags_rest
image.png
image.png
image.png
image.png
四、参考
图解网络Offload
https://zhuanlan.zhihu.com/p/487385344
openwrt虚拟网卡关闭tso
http://b.860914.com/1213.html
《wireshark网络分析就这么简单》 视频演示
https://space.bilibili.com/443654017













网友评论