1 MAC和PHY
2 MDIO接口
MDIO(Management Data Input/Output)接口是根据IEEE 802.3标准定义的一种简单双线串行接口,主要用于以太网MAC(Media Access Control)控制器与物理层(PHY, Physical Layer)器件之间的管理通信。这种接口允许MAC控制器或者上层管理系统读取和修改PHY芯片内部的寄存器设置,以便控制和监测PHY的工作状态。
MDIO接口包含了两条信号线:
-
MDIO: 这是一条双向数据线,用于在管理器件和PHY之间交换控制和状态信息。在不同的时间段内,这条线既可以用作数据输入也可以用作数据输出。
-
MDC (Management Data Clock): 这是MDIO接口的时钟信号线,由管理器件提供,用来同步MDIO上的数据传输。
通过MDIO接口,可以实现以下功能:
- 配置PHY芯片的各种参数,比如速度选择、双工模式、自动协商、节能模式等。
- 查询PHY芯片的状态,如链路状态(Link Up/Down)、接收信号强度、错误统计等。
- 控制物理层的特性,例如启动和停止物理层的自动协商过程。
MDIO协议基于特定的时序进行操作,允许MAC控制器按照一定的命令格式读取或写入PHY的多个寄存器,从而实现了对以太网物理层设备的灵活配置和实时监控。
3 以太网帧格式
典型的以太网帧格式主要包括以下几个主要部分:
前导码(Preamble):
- 一组连续的7个字节(56比特)的
10101010…101010
序列,用于接收设备同步时钟和确定帧的开始。
帧起始定界符(SFD, Start-of-Frame Delimiter):
- 第8个字节,值为
10101011
,标志着帧正文的开始。
以太网帧头(Ethernet Header):
- 源MAC地址(Source MAC Address):6个字节,表示发送方的物理地址。
- 目标MAC地址(Destination MAC Address):6个字节,表示接收方的物理地址。
- 类型/长度字段(Type/Length Field):2个字节,指明上层协议类型(如IPv4、IPv6、ARP等)或在某些类型的帧中表示帧的数据部分的长度。
数据负载(Payload):
- 可变长度,最小46字节,最大取决于以太网类型。通常承载的是上层协议数据单元(如IP数据包)。
帧校验序列(FCS, Frame Check Sequence):
- 4个字节(32位),采用循环冗余校验(CRC)算法计算得出,用于检测帧在传输过程中是否出错。
4 ARP
在以太网中,每个设备都有一个唯一的MAC地址,这是其硬件标识符,用于在物理层上识别设备。而IP地址则是网络层为了寻址和路由数据包所使用的逻辑地址。当一台主机想要与同一网络内的另一台主机通信时,即使它知道目标主机的IP地址,也需要知道目标主机的MAC地址以便封装数据包到以太网帧中进行传输。
以下是ARP的工作流程:
-
ARP请求: 当主机A需要向主机B发送数据,并且只知道主机B的IP地址时,主机A会通过广播的方式发送一个ARP请求到整个局域网中。这个请求中包含了目标主机B的IP地址,并询问:“具有这个IP地址的设备,请告诉我你的MAC地址。”
-
ARP响应: 主机B收到ARP请求后,发现请求的目标IP地址与自己的IP地址匹配,便会回复一个ARP应答给主机A。ARP应答中包含了主机B的MAC地址。
-
ARP缓存: 主机A收到ARP应答后,会将主机B的IP地址与其对应的MAC地址存储在本地的ARP缓存中,这样下次再需要发送数据给主机B时,就可以直接从缓存中查找MAC地址,无需再次发起ARP请求。
帧格式:
ARP 数据报文格式:
硬件类型(Hardware Type,2字节)
- 表示物理层地址类型,例如对于以太网,其值通常为0x0001。
协议类型(Protocol Type,2字节)
- 表示要映射的网络层协议地址类型,对于IPv4,其值为0x0800。
硬件地址长度(Hardware Address Length,1字节)
- 指定硬件地址(MAC地址)的字节数,对于以太网,该值为6。
协议地址长度(Protocol Address Length,1字节)
- 指定协议地址(IP地址)的字节数,对于IPv4,该值为4。
操作代码(Operation Code,2字节)
- 定义了ARP请求(0x0001)或ARP应答(0x0002)的操作类型。
发送者硬件地址(Sender Hardware Address,6字节)
- 发送ARP数据报文的设备的MAC地址。
发送者协议地址(Sender Protocol Address,4字节)
- 发送ARP数据报文的设备的IP地址。
目标硬件地址(Target Hardware Address,6字节)
- 在 ARP 请求时由于不知道接收端 MAC 地址,因此该字段为广播地址,即48’hff_ff_ff_ff_ff_ff;
- 在ARP应答中填充请求者期望的目标MAC地址。
目标协议地址(Target Protocol Address,4字节)
- 在ARP请求中填充需要解析的远程IP地址;
- 在ARP应答中填充请求者的IP地址。
28字节的 ARP 数据位于以太网帧格式的数据段。由于以太网数据段最少为 46个字节, 而 ARP 数据包总长度为 28 个字节,因此在 ARP 数据段后面需要填充 18 个字节的数据,以满足以太网传 输格式的要求。这个填充的过程称为 Padding(填充),填充的数据可以为任意值,但一般为 0。
5 RGMII接口
以太网通信依赖物理层PHY芯片,其与MAC间常用接口包括MII、RMII、GMII、RGMII。其中:
- MII:支持10Mbps和100Mbps,数据位宽4位,100Mbps时钟频率25MHz。
- RMII:MII简化版,数据位宽2位,100Mbps时钟频率50MHz。
- GMII:兼容MII,支持10Mbps、100Mbps和1000Mbps,数据位宽8位,1000Mbps时钟125MHz。
- RGMII:GMII简化版,数据位宽4位,1000Mbps时钟125MHz,双沿采样;10M/100M采用单沿采样。适用于多速率通信,引脚数少,但布线需等长处理,时序要求严苛。
下图是 MAC 侧与 PHY 侧接口的连接
接口信号:
ETH_RXC(接收数据参考时钟):
- 在不同速率下,其时钟频率分别为:
- 1000Mbps:125MHz,采用上下沿同时采样。
- 100Mbps:25MHz。
- 10Mbps:2.5MHz。
- ETH_RXC信号由PHY侧提供。
ETH_RXCTL(ETH_RX_DV):
- 接收数据控制信号。
ETH_RXD:
- 四位并行的接收数据线。
ETH_TXC(发送参考时钟):
- 同样在不同速率下,其时钟频率分别为:
- 1000Mbps:125MHz,采用上下沿同时采样。
- 100Mbps:25MHz。
- 10Mbps:2.5MHz。
- ETH_TXC信号由MAC侧提供。
ETH_TXCTL(ETH_TXEN):
- 发送数据控制信号。
ETH_TXD:
- 四位并行的发送数据线。
ETH_RESET_N:
- 芯片复位信号,低电平有效。
ETH_MDC:
- 数据管理时钟,为ETH_MDIO信号提供同步时钟。
ETH_MDIO:
- 数据输入/输出管理双向信号,用于传递管理信息。
1000Mbps速率工作模式:
ETH_TXC和ETH_RXC时钟频率均为125MHz,采用DDR(Double Data Rate)方式传输数据。
- 每个时钟周期内发送/接收8位数据信号:上升沿发送/接收低4位数据,下降沿发送/接收高4位数据。
ETH_TXCTL和ETH_RXCTL控制信号同样采用DDR方式传输。
- 上升沿发送/接收数据使能(TX_EN/RX_DV)信号,下降沿发送/接收使能信号与错误信号的异或值(TX_ERR xor TX_EN、RX_ERR xor RX_DV)。
- 数据有效且正确的条件:RX_DV为高电平(数据有效),RX_ERR为低电平(无错误),此时ETH_RXCTL和ETH_TXCTL上下沿同时为高电平。
6 IP协议
首部(Header):
首部是IP数据报的控制区域,包含了一系列固定和可选字段,用于指导数据报在网络中的传输。
固定部分(Fixed Part)
-
版本(Version):占4位,指示正在使用的IP协议版本。最常见的版本是IPv4(值为4),目前广泛使用的也是IPv4;IPv6版本的值为6。
-
首部长度(Header Length, IHL):占4位,表示IP数据报首部的长度,以32位(4字节)为单位。最小值为5,即20字节(不包含任何可选项)。如果存在可选项字段,则首部长度相应增加。
-
区分服务(Differentiated Services Code Point, DSCP):占6位,用于指定数据报的优先级和QoS(Quality of Service)处理需求。它允许网络设备对不同类型的流量进行差异化服务。
-
总长度(Total Length):占16位,表示整个IP数据报(包括首部和数据部分)的字节数。最大值通常为65,535字节(对于IPv4),但实际有效载荷受到路径上最低MTU(Maximum Transmission Unit)的限制,通常以以太网的MTU(1500字节)为参考。
-
标识(Identification):占16位,是一个唯一标识符,用于标识属于同一个原始数据报的所有分片。当数据报因过大需要分片时,所有分片的标识字段设置为相同的值。
-
标志(Flags):占3位,其中:
- 第一位(Reserved,保留位)通常置为0;
- 第二位(Don't Fragment, DF):如果置为1,表示数据报不能被分片;
- 第三位(More Fragments, MF):如果置为1,表示当前分片不是最后一个分片。
-
片偏移(Fragment Offset):占13位,仅在数据报分片时有意义,指出该分片相对于原始数据报起始处的偏移量,以8字节为单位。
-
生存时间(Time to Live, TTL):占8位,初始值由发送方设定,每经过一个路由器减1。当TTL值为0时,数据报将被丢弃,防止数据报在网络中无限循环。
-
协议(Protocol):占8位,标识IP数据报携带的数据部分应交给哪个上层协议进行进一步处理,例如TCP(值为6)、UDP(值为17)等。
-
首部检验和(Header Checksum):占16位,用于检测IP数据报首部在传输过程中是否发生错误。接收方通过计算校验和来验证首部的完整性。
-
源地址(Source Address):占32位(IPv4)或128位(IPv6),标识发送方的IP地址。
-
目的地址(Destination Address):占32位(IPv4)或128位(IPv6),标识接收方的IP地址。
可选部分(Optional Fields)
紧跟在固定部分之后,可包含一系列可变长度的选项,如记录路由选项(Record Route)、时间戳选项(Timestamp)等。这些选项根据需要添加,使得IP数据报具有一定的灵活性。可选部分的存在会增加首部长度。
数据区(Payload):
紧随首部之后的是数据区,包含了由上层协议(如TCP、UDP等)提供的实际用户数据或上层协议控制信息。数据区的长度取决于IP数据报的总长度减去首部长度。
填充(Padding):
如果需要,会在数据区后附加一些全0的字节(填充),以确保整个IP数据报的长度是32位(4字节)的整数倍,满足某些底层网络设备对传输单位对齐的要求。
7 UDP
UDP主要特性和工作方式的简单介绍:
无连接:
- 在使用UDP发送数据前,不需要建立正式的连接。发送方可以直接向接收方发送数据报文,无需经过握手、确认等过程,这使得UDP具有较低的开销和较高的响应速度。
不可靠性:
- UDP不保证数据报文的可靠传输。它不会对数据进行校验、重传、拥塞控制等操作,一旦将数据报文发送出去,就无法确保其一定能到达目的地,也无法确保到达的顺序与发送顺序一致。如果数据在传输过程中丢失、被错误地修改或重复,UDP不会试图纠正这些问题。
面向数据报:
- UDP以独立的数据报(Datagram)为单位进行数据传输。每个数据报包含完整的源和目的端口号以及用户数据,可以独立地在网络中路由。这意味着每个UDP报文都是单独处理、独立送达的,应用程序需要自行处理数据的完整性、顺序性和重传问题。
最小化服务:
- UDP提供了最基础的服务,仅包括数据报的封装、传输和解封装。它不提供流量控制、拥塞控制、数据排序、超时重传等复杂功能,这些任务通常由使用UDP的应用层协议自行实现,或者在某些情况下,由应用程序直接处理。
头部结构简单:
- UDP头部相对较小,只有8字节,包含源端口、目的端口、长度和校验和四个字段。这种简洁设计有助于减少处理开销,提高传输效率。
适用场景:
- 由于其简单、快速的特点,UDP常用于对实时性要求高、容错能力强或数据传输效率优先于数据完整性的应用,如在线视频会议、实时音视频流、在线游戏、DNS查询、物联网(IoT)消息传递等。在这些应用中,偶尔丢失个别数据包通常不会严重影响用户体验,而保持低延迟和高吞吐量更为关键。
从底层到高层的包含关系描述如下:
- MAC(以太网)帧:作为最底层的传输单元,MAC帧承载着整个数据包。其中,数据字段包含了向上一层封装的内容。
- IP数据报:位于MAC帧的数据字段内,是IP层的传输单元。IP数据报包含源IP地址、目的IP地址以及报文头中的其他控制信息,其有效载荷部分则是更高层的UDP报文。
- UDP报文:作为IP数据报的有效载荷,UDP报文包含源端口号、目的端口号、长度以及校验和等UDP头部信息,以及真正的用户数据。UDP报文提供了无连接、不可靠的数据传输服务。
- 用户数据:最终要传输的实际信息,被封装在UDP报文的数据部分。这些数据可以是文本、图片、音频、视频等各种形式,具体取决于上层应用程序的需求。
UDP首部共计8个字节(64位),与IP数据报首部一样,遵循以32位(4字节)为单位的排列规则。其具体字段如下:
源端口号(Source Port):占用16位,用于标识发送端(源主机)正在使用的特定服务端口。端口号的取值范围从0到65535(含)。每个端口号代表一种特定的服务或应用程序,例如HTTP通常使用80端口,DNS通常使用53端口。源端口号的存在使得接收端可以根据该值识别并定向到相应的服务进程进行数据处理。
目的端口号(Destination Port):同样占用16位,用于指定接收端(目的主机)的目标服务端口。与源端口号类似,目的端口号用于在目的主机上区分不同的服务或应用程序,确保数据包能被正确地递送到预期的服务进程中。
UDP长度(Length):占据16位,表示整个UDP数据报(包括UDP首部和数据部分)的总长度,以字节(byte)为单位。该字段的值范围为最小值8(仅包含UDP首部,无数据)到最大值65535字节。由于UDP数据报作为IP数据报的数据部分,因此UDP长度需与IP数据报的总长度字段相协调,确保IP层能够正确处理封装后的数据报。
UDP校验和(Checksum):占用16位,用于检测UDP数据报在传输过程中是否出现错误。在许多实际应用场景中,接收端可能选择不严格检查UDP校验和,尤其是在对实时性要求较高而对数据完整性和可靠性要求相对较低的情况下。