本章为系列指南的第六章,这一章我们暂时离开Keil,离开STM32,离开C语言,这一章我们要去了解一些以太网相关的知识,特别是学习使用大名鼎鼎的调试以太网通信程序的利器:WireShark。 帧结构我们从小就听说过计算机中全都是二进制的0和1,这个道理几乎连考不上三本的文科生都懂,但是很难有直观的感受,甚至连由16个bit,也就是16个二进制的0/1构成的十六进制0/F,再由两个十六进制的0/F形成的0x00/0xFF这种Byte(字节),都很难直观感受到,毕竟计算机世界太丰富了,各类色彩,图片,网站,视频,游戏充斥着我们的日常,所谓「乱花渐欲迷人眼,浅草才能没马蹄」,形形色色的计算机资源就是「乱花」,其背后单调的Byte才是「浅草」,我们在网络通信时只需要Byte的颗粒度,至于细化到bit的精度,只有在研究纯电子电路时才会涉及到。如果说如何传输bit是PHY层负责的问题,那么如何构造和解析Byte就是MAC层要肩负的责任了。 由Byte组成的一个个网络帧,势必要按照一定的格式进行排列,就像如果要你自己自己编排一个串口通信的协议,你也一定会考虑包头、包尾、校验位这些。 Ethernet V2协议在链路层规定了一个基本的帧结构,如下: 目标MAC | 源MAC | 类型 | 数据 | 循环冗余校验FCS | 6字节 | 6字节 | 2字节 | 46-1500字节 | 4字节 |
因此,最小的帧长度是6 + 6 + 2 + 46 + 4 = 64个Byte,最大长度是6 + 6 + 2 + 1500 + 4 = 1518个Byte。 上表最后4个Byte形成了一组循环冗余的CRC校验数据,很遗憾的是我们能通过软件手段监听出来的帧结构都不会含有这段数据,因为网卡在接受到报文后就会立即对数据进行校验,凡是不满足校验规则的数据包会直接丢弃,不会触发操作系统的以太网事件。因此你能监听到的报文都是符合规则的,网卡交给上层软件应用时也会自动将校验数据剥离。此外,具体的循环冗余CRC校验的算法是什么大家也不用管了,在使用STM32调用发包指令时,MAC层会帮我们计算好的。
|