帧
Basic里说过的,以太网(Ethernet
)是连接层协议,传输单位是帧,所以下面是帧的格式
帧的格式
帧的格式,信息以帧(frame
)为单位传输,帧像信封一样将数据(payload
)包裹起来,并注明源目地址,连接层实现了局域网通信
帧是一段有限的0/1序列。它可以分为头部、数据(Payload
)和尾部三部分
Preamble | SFD | DST | SRC | Type | Payload (Data) | Pad | FCS | Extension
帧是按照上面的顺序进行发送和接收的,中间Payload
部分是我们要传输的数据,头部和尾部虽然不是我们想要传输的,但是它们确实我们完成数据传输所必须的
帧头
Preamble
Preamble
翻译为序言,Preamble
大小为7个Bytes
,每个Bytes
都是十六进制的0xAA(二进制10101010),通常,我们都会预定好以一定的频率发送0/1序列(比如每秒10bit),
Preamble
的作用是什么呢? 由于不同网卡的频率信号可能不同,所以序言的作用就是在通信前,调整彼此的信号频率为一致,就像特种部队执行任务前对表一样,网卡会在接收序言的过程中不断微调自己的接收频率,直到自己收到10101010
,说明此时频率信号达到一致,然后开始进行通信
SFD
频率信号调整好了后,我们等待帧的起始信号(SFD
, start frame delimiter
), SFD
是固定的值0xAB
,也就是10101011
这个二进制序列,这个0xAB就好像“小喇叭开始广播啦”一样,提醒我们好节目就要上演了。帧的格式是固定的,每个部分有固定的字节数。所以一旦设备识别出起始信号后,就能分辨出数据的各个部分。
DST、SRC
DST
和SRC
其实从字面就能看出来,分别是源地址和目标地址,DST
和SRC
都是6个字节,SRC
会记录本地网卡Mac地址,而DST
这里会记录网关Mac地址
Type
Type
是头部的最后一个字段,它是用来标明Payload也就是我们传输的数据的类型,由于数据部分通常包含更高层的协议,所以类型实际上是更高层协议的种类,例如,0x0800(IPv4),0x0806(ARP),如果接收设备能理解该类型的网络协议,可以进一步解读数据部分内容。
数据
Payload
正如我刚才提到的,数据一般包含有符合更高层协议的数据,比如IP包。连接层协议本身并不在乎数据是什么,它只负责传输。
PAD
注意,数据尾部可能填充有一串0(PAD区域),原因是数据需要超过一定的最小长度(46~1500 octets)。
帧尾
FCS
跟随在数据之后的是校验序列(FCS
,Frame Check Sequence
),FCS
的作用是为了校验数据的传输是否发生错误,在物理层,我们是通过物理信号来表示0/1序列,高低电压,高低频率等,但这些信号可能会在传输的过程中出现问题,以致于接收到的二进制序列和发出的不一样。如何来发现我们的数据是正确的呢?
- 一个方法,是将数据发送两遍,然后对比一下是否一样。理论上,两次犯相同错误的几率很低。如果两次的数据不一样,那就是在传输过程中出错了。但发送两遍的方法降低了网络的效率。而且逐一对比序列的每个字节的话,也需要耗费不少时间。
但是以太网采用了更加聪明的方法,帧的FCS
就是通过CRC(Cyclic Redundancy Check)
算法,在发送方基于这个算法生成一个校验码,接收方接收到数据后,同样根据CRC
算法,比对生成的校验码是否与FCS
一致,以此来判断传输过程中是否出现错误。(PS: 32‑bit位 CRC)