前言
这里讨论的以太网的数据帧格式为Ethernet ||
一、以太网的帧头
严格来说红色圈起来的才是以太网的帧头,后面的FCS不是帧头
二、以太网数据帧最短帧长
以太网数据帧最短帧长涉及到CSMA/CD机制
最短帧64字节的由来(即帧中的数据不得少于46个字节——即是MTU不得少于46个字节)
以太网的最小帧长是通过争用期计算出来的。一个站点开始发送数据后,最多经过时间 2τ(两倍的端-端时延)就可知道是否发生了碰撞 即一端发送一个帧。
2τ(两倍的端-端时延)的解释:在无限接近另一端的位置发生了碰撞,然后碰撞信息再从碰撞位置传递回来,刚好就是一个往返以太网的端到端往返时延2τ称为争用期,或碰撞窗口 ,如果经过争用期还没有检测到碰撞,就可以肯定这次发送不会发生碰撞。
为什么最短帧的大小取决于争用期时长?
因为如果最短帧的传输时间小于争用期(比如30μs),那么就会导致发送完这个帧之后,在不知道帧有没有传送成功的情况下(至少需要51.2μs来确定)又发送了下一个帧。反之,如果最短帧的传输时间大于争用期,由于碰撞信息一定可以在帧发送完之前传到,就可以保证只有在上一个帧没有发生碰撞,正确传输的情况下才会发送下一个帧。
对于最大长度为2500米的10Mbps 网络和四个中继器(来自802.3规范),在最坏的情况下,往返时间(包括通过四个中继器的传播时间)被确定为接近50微秒。因此,允许的最短帧必须至少花费这么长的时间来传输。在10Mbps时,一个比特需要100纳秒,所以500比特是保证工作的最小帧。为了增加一些安全边际,这个数字被四舍五入到512位或64字节,相应的,以太网的争用期长度也被确定为51.2 μs 据此规定以太网帧长≥ 64 字节,长度小于64字节的帧为无效帧
三、以太网数据帧最长帧长
6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的 FCS = 1518
四、抓包为什么只能抓到1514,而不是1518?
注意上图:前同步码和帧开始定界符是在物理层,而不是在MAC层
当以太网封装IP数据包的最大长度是1500字节(即MTU),长度为:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的 FCS。
按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是 1526字节呢?
原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如 果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交 “设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是 6+6+2+1500=1514。
以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是 6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以 满足数据字段到46字节。
总结:
如果MTU是最小的46,则抓包长度是6+6+2+46=60,即最小抓包长度是60
如果MTU是最大的1500,则抓包长度是6+6+2+1500=1514,即最小抓包长度是60