以太网基础——ARP协议
以太网摘要
MAC地址(802.3 MAC地址)是网络设备在以太网中的唯一标识符,由48位二进制数据组成,通常表示为00:11:22:33:44:55。它由48位(6字节)的二进制数组成,用于设备标识。MAC地址可以通过硬件地址或IP地址查询获取,网络设备可通过arp请求或arp缓存进行查询。
ARP协议摘要
ARP协议是网络通信中的核心协议,用于将IP地址转换为MAC地址。它通过ARP请求和ARP应答实现IP地址与MAC地址的映射。当主机A请求主机B的MAC地址时,ARP请求被广播发送到网络,主机B响应并返回映射信息。ARP缓存表用于存储这些映射,确保数据包的高效传输。ARP协议在局域网中广泛应用于数据包路由和网络发现。
以太网帧格式摘要
以太网帧是网络通信的基础,由MAC头部、填充字段和FCS(校验字段)组成。MAC头部包含发送方和目的MAC地址,填充字段包含协议地址、硬件地址和数据内容,FCS用于校验帧的完整性。以太网帧的类型分为MAC帧、VLAN标识MAC帧、PTP报文帧和1588v2报文帧,分别用于不同场景的数据传输和网络管理。
1:什么是MAC地址
MAC地址,全称为媒体访问控制地址(MAC Address),其别名包括局域网地址(LAN address)、以太网地址(Ethernet Address)和物理地址(Physical Address)。其主要用于标识网络设备的位置。
在物理层上,网络设备(如计算机、手机、路由器等)的唯一标识符是MAC地址。MAC地址由6个字节(48位)的二进制数组成,通常表示为00:11:22:33:44:55的形式,其中两个字节之间用冒号或短横线分隔。MAC地址是设备厂商预先设置的,且无法被修改,因此可用于区分不同的网络设备。在局域网中,数据包的传输基于MAC地址进行路由。
注:简单来说,IP地址标识网络中的逻辑设备,MAC地址则标识物理设备。在以太网传输中,MAC地址是最重要的寻址标识符,而IP地址则用于更高层的逻辑寻址和路由。掌握二者的区别至关重要。
2:什么是ARP协议
ARP(Address Resolution Protocol,网络通信协议)是一种用于将IP地址映射到MAC地址的网络协议,其主要功能是实现网络中数据包的传输与交换。该协议通过广播机制实现IP地址与MAC地址的对应关系,确保网络上数据的正常传输与交换。
在主机间通信时,主机会发送一个ARP请求包,以请求目标主机的MAC地址。目标主机接收到该请求后,会返回自己的MAC地址,从而实现通信双方的地址对应。需要注意的是,ARP协议仅适用于IPv4网络,而IPv6网络则采用邻居发现协议进行通信,该协议被包含在ICMPv6中。
从技术角度来看,ARP(地址 resolve 协议)是一种用于解决网络通信地址问题的协议。它基于IP地址,确定下一个应接收数据包的主机的MAC地址。如果目标主机不在同一个网络链路上,它会检查下一跳路由器的MAC地址。
3:ARP工作流程
主机A的IP地址为192.168.1.1 ,MAC地址为0A-11-22-33-44-01 ;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A需要与主机B进行通信时,地址解析协议会将主机B的IP地址(192.168.1.2)转换为主机B的MAC地址。以下流程描述了这一过程:
第一步,通过主机A上的路由器内容,确定用于访问主机B的转发IP地址为192.168.1.2。随后,A主机在本地的ARP缓存中进行主机B的MAC地址查询。
在ARP缓存中未能找到主机A的映射后,该主机将向192.168.1.2发送硬件地址请求,从而将ARP请求帧发送到本地网络的所有主机。源主机A的IP地址和MAC地址均包含在该ARP请求中。本地网络中的每一台主机均接收到该请求,并检查其与自身IP地址的匹配情况。若发现请求中的IP地址与自身IP地址不符,则丢弃该ARP请求。
第3步:当主机B识别ARP请求中的IP地址与自身的IP地址对应时,会将主机A的IP地址和MAC地址记录到本地ARP缓存中。第4步:主机B会向主机A发送包含其MAC地址的ARP回复消息。第5步:当主机A接收到来自主机B的ARP回复消息时,会根据主机B的IP地址和MAC地址更新本地的ARP缓存信息。过期后,主机A会重复上述步骤。一旦主机B的MAC地址确定,主机A就能建立IP通信。
下面我们通过图片进一步理解一下:


4:ARP帧格式

ARP请求与ARP应答都包含在同一个ARP数据包中,结构示意图如图所示。需要注意的是,ARP包被封装在以太网帧中发送,在图中,我们还列出了以太网帧头部的结构。

4.1:MAC头部
前14个字节是MAC(以太网)头部,其余部分由ARP协议定义。在ARP帧中,前8个字节是通用的,剩余部分用于将IPv4协议映射到48位的以太网地址。
首先让我们看看以太网头部:
第一个字段 是 DST 即目的MAC地址 ;
第二个字段 是 SRC 即源MAC地址 ;
需要注意的是,对于一个 ARP 请求而言,目的地址字段被设置为全1(即以太网地址 ff:ff:ff:ff:ff:ff ),这表示以太网广播地址。这种设置确保在同一个广播域内的所有以太网接口都能接收到该数据包。在ARP表项建立前,源主机只知道目的主机的IP地址,并不知道其MAC地址,所以在数据链路上,源主机只有通过广播的方式将ARP请求数据包发送出去,同一网段上的所有以太网接口都会接收到广播的数据包。
第三个字段 是Length/Type ,此字段占据 2 字节 大小
值在 1 到 1500 之间 :表示帧的长度(即有效负载的字节数)。
值在1519-1535之间 不识别为type
值大于 1536(0x0600) :表示上层协议的 EtherType(如 IPv4、IPv6、ARP 等)。
该字段的响应值必须是0x0806,其中,IPv4的响应字段值为0x0800,IPv6的响应字段值为0x86DD,PTP的响应字段值为0x88F7,长度指示字段的值范围为0x0000至0x05DC。
4.2:固定大小字段
接下来的 4 个字段指定了最后 4 个字段的类型和大小
(1)硬件类型字段2byte:标识源主机使用的网络接口类型 ,对于以太网,该值为 1
(2)协议类型字段2byte:映射的协议地址类型。对于 IPv4 ,协议类型字段的值为0x0800
字段长度为1byte,表示硬件地址的字节数。在以太网中,通常采用MAC地址作为硬件地址表示,其对应的硬件大小字段固定值为6字节。
协议大小字段为1字节,表示协议地址的字节数。在以太网中,当使用IPv4地址进行ARP请求或响应时,协议大小字段的值为4字节。
(5)Op 字段:如果是 ARP 请求,Op = 1 ,ARP 应答 ,Op = 2,RARP 请求 Op = 3,RARP 应答,Op = 4。
4.3:发送方和目的的硬件地址和协议地址
接下来的字段指出了发送方和目的的硬件地址和协议地址。
(1)发送方硬件地址字段**(6byte)** :发送方的以太网 MAC 地址 。
(2)发送方协议地址字段**(4byte)** :发送方的 IP 地址 。
(3)目的硬件地址字段**(6byte)** :目的以太网 MAC 地址 。
(4)目的协议地址字段**(4byte)** :目的IP 地址 。
4.4:填充字段和FCS
填充字段时,在发送ARP请求时,除了目的硬件地址设为0之外,其他字段也需要进行相应的配置。
都需要进行填充。FCS字段作为最后的校验。
5:ARP的4种典型情况总结
发送方为主机,将 IP 数据报发送至本网络内的另一主机,此时通过 ARP 查找目标主机的硬件地址。
发送方是主机端,将IP数据报发送至另一个网络中的主机。通过ARP协议查询本地网络中的路由器硬件地址,其余工作则由该路由器负责处理。
发送方为路由器设备,将 IP 数据报转发至本网络中的一个主机。此时,通过 ARP 查找目标主机的硬件地址。
4、发送方为路由器,将 IP 数据报转发至另一个网络中的目标主机。通过 ARP 查找本网络中的一个路由器的硬件地址,其余工作则由该路由器完成。
6:理解


ARP协议的核心功能体现在对ARP缓存表的管理上。当发送数据包时,系统首先通过缓存表查找目标MAC地址。为了确保缓存表中各项信息的准确性和完整性,ARP系统持续处理相关请求和应答包。从本质上讲,ARP协议主要负责缓存表的建立、维护、更新以及查询等基本操作。
7:以太网帧(MAC帧)格式说明

可以看出以太网帧的类型为0x0800 ,即IP报文的类型为0x0800;
进一步详细说明:
MAC帧:
1:无VLAN标识MAC帧

Ethernet 类型以太网帧最小长度为64字节(6+6+2+46+4),最大长度为1518字节 (6+6+1500+4)
(1)目标mac地址:目的mac地址,IPv4为6字节,该字段确定帧的接收者
(2)源mac地址:源mac地址,IPv4为6字节,该字段标识帧的发送者
(3)类型:协议类型,用来标识数据字段内的高层协议,常用类型如下:
0x0800:IP报文
0x0806:ARP报文
0x8100:携带VLAN标识的MAC帧,用于区分MAC帧是否携带VLAN标识
(4)数据:数据字段,最小长度必须为46字节
(5)FCS:crc校验,用来检查帧内的数据错误,不能纠错。
2:VLAN标识MAC帧

4字节的VLAN TAG包含以下参数:
- TPID(Tag Protocol Identifier):固定值为0x8100的2字节标签协议标识符,表示该标签属于VLAN。
- TCI(Tag Control Information):包含以下子字段的2字节标签控制信息:
- PCP(Priority Code Point):3位优先级代码点,表示帧的优先级,取值范围为0~7,值越大优先级越高。
- DEI(Drop Eligible Indicator):1位丢弃合格指示器,0表示VLAN正确,1表示VLAN错误,表示该帧是否可以被丢弃。
- VLAN ID:12位VLAN标识符,表示该帧所属的VLAN。
当主机通过ARP响应包获取目标MAC地址后,主机将目标MAC地址直接写入以太网帧的首部字段。通过遵循如图所示的格式构建以太网包,即可实现发送。
3:1588v2(PTP)报文
IEEE 1588v2协议报文封装格式如下所示:
- PTP over Ethernet
- PTP over UDP over IPv4
- PTP over UDP over IPv6
- PTP over MPLS
PTP报文能够基于多种协议进行封装,以以太网作为具体实例,来探讨PTP报文的特性。
以太封装的PTP (Precision Timing Protocol)报文,其帧头中以太类型值=0x88F7 。

图: 以太封装PTP报文 PTP over Ethernet
1588-v2由报头(Header)、主体(Body)和后缀(Suffix)构成,其中后缀的长度可能为0。

PTP报文头部结构:

如上表中所示34个byte;
介绍 PTP 报文报头中一些位域表示的意思:
(1)messageType,【报文类型】( 0.5 个 octet = 4 bits),不同的值代表不同的PTP报文

标志TransportSpecific的值为:0表示PTP消息采用1588协议;1表示PTP消息采用802.1as协议。
PTP版本
(3)PTP版本,【PTP版本
PTP域序列号
域编号,【PTP域序号
标志域
标志域
标志域字段,其中,2个octets相当于16 bits)。例如,二步标志域(twoStepFlag)为1时,表示处于二步模式,即在同步报文后紧跟有后续报文;

修正域

(7)sourcePortIdentity,【源端口号】,( 10 个 octets = 80 bits ),发送端口的相关属性
序列号
序列号
序列号
控制域
控制域
controlField,【控制域

对数报文时间间隔
对数报文时间间隔
logMessageInterval,记录的是【对数报文时间间隔

PTP报文类型:
Sync 报文:
此报文包含 Master 时钟发送的时间信息。当 Master 采用 Two_step 模式时钟时,其发送的 Sync 报文的时间戳将被设置为 0,实际的时间戳将由与该 Sync 报文相关的 Follow_up 报文发送。
| Offset | Octets | Name |
|---|---|---|
| 0 | 34 | PTP Header |
| 34 | 10 | Origin Timestamp |
Delay_Req 报文:
Delay_Req报文的格式结构与Sync报文完全一致,Delay_Req报文由时钟发出,与Master的One_Step和Two_Step模式相似。Slave支持One_Way和Two_way两种模式(单向和双向通信),在One_Way模式下,Slave无需发送Delay_Req报文。
| Offset | Octets | Name |
|---|---|---|
| 0 | 34 | PTP Header |
| 34 | 10 | Origin Timestamp |
Pdelay_Req Message 报文
该报文仅在 P2P TC 时钟模式下才产生,由 P2P 时钟作为“延迟请求者”发出。
| Offset | Octets | Name |
|---|---|---|
| 0 | 34 | PTP Header |
| 34 | 10 | Origin Timestamp |
| 44 | 10 | Reserved |
Pdelay_Resp Message 报文:
该报文仅在P2P时钟模式下产生,由P2P时钟作为延迟响应者发送。如果P2P时钟模式为Two_Step,Pdelay_Resp Message报文的时间戳将被设置为0,实际的时间戳则由该报文相关联的Pdelay_Resq_Follow_Up报文发送。
| 偏移 | 字节数 | 名称 | 描述 |
|---|---|---|---|
| 0 | 34 | PTP Header | |
| 34 | 10 | receiveReceipt Timestamp | 在 One_Step 模式下的数值为 0;在 Two_Step 模式下为响应 Pdelay_Req 报文的接收时间戳,精度为 ns 以上的精确时间戳 |
| 44 | 10 | requestingPortIdentity | 响应 Pdelay_Req 报文的发送设备端口 ID |
|---|
Follow_Up 报文:
只有在主时钟处于Two_Step模式时,才会发送Follow_UP报文,其内容格式与Sync和Delay_Req报文保持一致。
| Offset | Octets | Name |
|---|---|---|
| 0 | 34 | PTP Header |
| 34 | 10 | preciseOrigin Timestamp |
Delay_Resp 报文
当 Master 收到 Slave 发出的 Delay_Req 报文时,会响应 Delay_Resq 报文。
| 偏移 | 字节数 | 名称 | 描述 |
|---|---|---|---|
| 0 | 34 | PTP Header | |
| 34 | 10 | receive Timestamp | 响应 Delay_Req 报文的接收时间戳,精度为 ns 级 |
| 44 | 10 | requestingPortIdentity | 响应 Delay_Req 报文的发送设备端口 ID。 |
Pdelay_Resp_Follow_Up 报文
只有在 P2P 时钟模式是 Two_Step 时才会产生 Pdelay_Resp_Follow_Up 报文。
| 偏移 | 字节数 | 名称 | 描述 |
|---|---|---|---|
| 0 | 34 | PTP Header | |
| 34 | 10 | responseOrigin Timestamp | 在 Two_Step 模式下响应 Pdelay_Resq 报文的发送时间戳,精度为 ns 级以上 |
| 44 | 10 | requestingPortIdentity | 响应 Pdelay_Resq 报文的发送设备端口 ID。 |
Announce 报文
该报文用来描述时间源能力。
| 偏移 | 字节数 | 名称 | 描述 |
|---|---|---|---|
| 0 | 34 | PTP Header | PTP 报文头 |
| 34 | 10 | Origin Timestamp | 数值为 0 或精度为 ±1 ns 的时间戳 |
| 44 | 2 | CurrentUtcOffset | UTC 与 TAI 时间标尺间的闰秒时间差 |
| 46 | 1 | Reserved | - |
|---|---|---|---|
| 47 | 1 | GrandmasterPriority1 | 用户定义的 grandmaster 优先级 |
| 48 | 4 | GrandmasterClockQuality | grandmaster 的时间质量级别 |
| 52 | 1 | GrandmasterPriority2 |
| 53 | 8 | GrandmasterIdentity | grandmaster 的时钟设备 ID |
|---|---|---|---|
| 61 | 2 | StepRemoved | grandmaster 与 Slave 设备间的时钟路径跳数 |
时间源头类型:通过GPS卫星传递的时钟时间;PTP时钟;NTP时钟;人工调整校准时钟。
参考文献:
出乎意料的是,这篇文章的性能远超其他同类文章,这主要得益于其简洁的设计和高效的代码实现。
PTP报文规范_PTP报文格式-博客
