FPGA 以太网概念简单学习

1 MAC和PHY

从硬件的角度来说,以太网接口电路主要由 MAC Media Access Control )控制器和物理层接口 PHY(Physical Layer PHY )两大部分构成。 MAC 指媒体访问控制子层协议,它和 PHY 接口既可以整合到单 颗芯片内,也可以独立分开,对于本次学习来说,MAC 控制器由 FPGA 实现, PHY 芯片指开发板板载的以太网芯片。
PHY芯片在发送数据时,接收MAC传输的无帧结构的原始数据(包括地址、数据和CRC),执行并串转换、编码及模数转换,将数据转换为模拟信号发送。接收过程则相反。PHY还负责物理连接的管理和状态显示,如通过LED指示灯反映连接状况和运行状态。在建立连接时,PHY会自动探测对端设备并启动自协商(Auto Negotiation),通过发送握手信号与对方协商一致,决定最优的连接参数,如速率、双工模式和流控设置等。

MDIO接口

MDIO(Management Data Input/Output)接口是根据IEEE 802.3标准定义的一种简单双线串行接口,主要用于以太网MAC(Media Access Control)控制器与物理层(PHY, Physical Layer)器件之间的管理通信。这种接口允许MAC控制器或者上层管理系统读取和修改PHY芯片内部的寄存器设置,以便控制和监测PHY的工作状态。

MDIO接口包含了两条信号线:

  1. MDIO: 这是一条双向数据线,用于在管理器件和PHY之间交换控制和状态信息。在不同的时间段内,这条线既可以用作数据输入也可以用作数据输出。

  2. 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的工作流程:

  1. ARP请求: 当主机A需要向主机B发送数据,并且只知道主机B的IP地址时,主机A会通过广播的方式发送一个ARP请求到整个局域网中。这个请求中包含了目标主机B的IP地址,并询问:“具有这个IP地址的设备,请告诉我你的MAC地址。”

  2. ARP响应: 主机B收到ARP请求后,发现请求的目标IP地址与自己的IP地址匹配,便会回复一个ARP应答给主机A。ARP应答中包含了主机B的MAC地址。

  3. 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。

RGMII接口

以太网通信依赖物理层PHY芯片,其与MAC间常用接口包括MII、RMII、GMII、RGMII。其中:

  1. MII:支持10Mbps和100Mbps,数据位宽4位,100Mbps时钟频率25MHz。
  2. RMII:MII简化版,数据位宽2位,100Mbps时钟频率50MHz。
  3. GMII:兼容MII,支持10Mbps、100Mbps和1000Mbps,数据位宽8位,1000Mbps时钟125MHz。
  4. 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协议

IP 协议是 TCP/IP 协议簇中的核心协议,也是 TCP/IP 协议的载体, IP 协议规定了数据传输时的基本单元和格式。IP 协议位于以太网 MAC 帧格式的数据段,IP 协议内容由IP 首部和数据字段成。所有的 TCP、UDP 及 ICMP 数据都以 IP 数据报格式传输,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字节)的整数倍,满足某些底层网络设备对传输单位对齐的要求。

UDP

UDP主要特性和工作方式的简单介绍:

无连接

  • 在使用UDP发送数据前,不需要建立正式的连接。发送方可以直接向接收方发送数据报文,无需经过握手、确认等过程,这使得UDP具有较低的开销和较高的响应速度。

不可靠性

  • UDP不保证数据报文的可靠传输。它不会对数据进行校验、重传、拥塞控制等操作,一旦将数据报文发送出去,就无法确保其一定能到达目的地,也无法确保到达的顺序与发送顺序一致。如果数据在传输过程中丢失、被错误地修改或重复,UDP不会试图纠正这些问题。

面向数据报

  • UDP以独立的数据报(Datagram)为单位进行数据传输。每个数据报包含完整的源和目的端口号以及用户数据,可以独立地在网络中路由。这意味着每个UDP报文都是单独处理、独立送达的,应用程序需要自行处理数据的完整性、顺序性和重传问题。

最小化服务

  • UDP提供了最基础的服务,仅包括数据报的封装、传输和解封装。它不提供流量控制、拥塞控制、数据排序、超时重传等复杂功能,这些任务通常由使用UDP的应用层协议自行实现,或者在某些情况下,由应用程序直接处理。

头部结构简单

  • UDP头部相对较小,只有8字节,包含源端口、目的端口、长度和校验和四个字段。这种简洁设计有助于减少处理开销,提高传输效率。

适用场景

  • 由于其简单、快速的特点,UDP常用于对实时性要求高、容错能力强或数据传输效率优先于数据完整性的应用,如在线视频会议、实时音视频流、在线游戏、DNS查询、物联网(IoT)消息传递等。在这些应用中,偶尔丢失个别数据包通常不会严重影响用户体验,而保持低延迟和高吞吐量更为关键。
以太网 UDP 传输单包数据的格式:

从底层到高层的包含关系描述如下:

  • MAC(以太网)帧:作为最底层的传输单元,MAC帧承载着整个数据包。其中,数据字段包含了向上一层封装的内容。
  • IP数据报:位于MAC帧的数据字段内,是IP层的传输单元。IP数据报包含源IP地址、目的IP地址以及报文头中的其他控制信息,其有效载荷部分则是更高层的UDP报文。
  • UDP报文:作为IP数据报的有效载荷,UDP报文包含源端口号、目的端口号、长度以及校验和等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校验和,尤其是在对实时性要求较高而对数据完整性和可靠性要求相对较低的情况下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/582081.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…

刷代码随想录有感(49):找树左下角的值

题干&#xff1a; 用层序遍历方便些&#xff0c;因为只需要把res不断替换成每一层第一个节点值即可&#xff0c;代码如下&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*>que;if(root ! NULL)que.push(root);int res …

逆向案例三十——webpack登录某游戏

网址&#xff1a;aHR0cHM6Ly93d3cuZ205OS5jb20v 步骤&#xff1a; 进行抓包分析&#xff0c;找到登录接口&#xff0c;发现密码有加密 跟栈分析&#xff0c;从第三个栈进入&#xff0c;打上断点&#xff0c;再次点击登录 明显找到password,它由o赋值&#xff0c;o由a.encode(…

【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排

题目讲解 面试题 01.02. 判定是否互为字符重排 算法讲解 直观的想法&#xff1a;我们找到一个字符串的全排列&#xff0c;然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列&#xff0c;所以我们知道两个字符串对应的字符出现的个数相同&#xff0c;那么…

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景&#xff1a; 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候&#xff0c;这种时候怎么在config.json文件中尝试配置呢&#x…

高并发内存池: 介绍

一.功能介绍 功能: 用于实现高效的多线程内存管理(替代系统的内存分配相关的函数(malloc, free)) 性能的提升: 池化技术, 锁竞争的减小处理内存碎片: 内碎片, 外碎片 池化技术: 概念:预先向系统申请过量的资源, 自己管理.->提高性能(每次申请资源都有较大的开销, 提前申…

数字文旅重塑旅游发展新生态:以数字化转型为契机,推动旅游产业的创新发展,提升旅游服务的智能化、网络化和个性化水平

目录 一、引言 二、数字化转型推动旅游产业创新发展 1、数字化转型提升旅游产业效率 2、数字化转型拓展旅游产业边界 3、数字化转型促进旅游产业可持续发展 三、提升旅游服务智能化、网络化和个性化水平 1、智能化提升旅游服务体验 2、网络化拓宽旅游服务渠道 3、个性…

OpenHarmony实战开发-多层级手势事件

多层级手势事件指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。在该场景下&#xff0c;手势或者事件的响应受到多个因素的影响&#xff0c;相互之间发生传递和竞争&#xff0c;容易出现预期外的响应。 本章主要介绍了多层级手势事件的默认响应顺序&#xff0c;以及…

【大学生电子竞赛题目分析】——2023年H题《信号分离装置》

今年的大赛已临近落幕&#xff0c;笔者打算陆续对几个熟悉领域的题目作一番分析与讨论&#xff0c;今天首先分析H题。 网上有一些关于H题的分析&#xff0c;许多都是针对盲信号分析的。然而本题具有明确的信号频率范围&#xff0c;明确的信号可能频率&#xff0c;明确的信号波…

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈&#xff1a; NextJs&#xff08;前端框架&#xff09;React&#xff08;前端框架&#xff09;TailwindCSS &#xff08;CSS样式&#xff09;echart echart gl &#xff08;地图生成&#xff09;shadui&#xff08;UI组件…

HTML5本地存储账号密码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML5本地存储账号密码</title> </head…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

Android 学习 鸿蒙HarmonyOS 4.0 第二天(项目结构认识)

项目结构认识 和 了解&#xff1a; 工程目录下的结构如下&#xff1a; 首先能看到有两个.开头的文件&#xff0c;分别是.hvigor 和 .idea。这两个文件夹都是与构建有关系的&#xff0c; 如果你开发过安卓app&#xff0c;构建完会生成一个apk安装包&#xff0c;鸿蒙则是生成hap…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

急急急!微信朋友圈删除了怎么恢复?

微信朋友圈是我们与朋友分享生活点滴的重要平台&#xff0c;但有时候微信出现异常&#xff0c;导致我们编辑好的朋友圈被删除了&#xff0c;这时候该怎么办呢&#xff1f; 幸运的是&#xff0c;微信提供了一种简单的方式来恢复已删除的朋友圈内容。微信朋友圈删除了怎么恢复&a…

react 学习笔记二:ref、状态、继承

基础知识 1、ref 创建变量时&#xff0c;需要运用到username React.createRef()&#xff0c;并将其绑定到对应的节点。在使用时需要获取当前的节点&#xff1b; 注意&#xff1a;vue直接使用里面的值&#xff0c;不需要再用this。 2、状态 组件描述某种显示情况的数据&#…

tkinter中是否有必要使用类

1. 问题背景 在使用tkinter编写事件驱动程序时&#xff0c;Fredrik Lundh的教程中提到&#xff0c;创建一个类&#xff08;App&#xff09;作为框架&#xff0c;并以类的实例运行程序&#xff0c;这样会更好&#xff0c;而不是直接启动程序。 以下是问题&#xff1a; 在tkin…

【Go语言快速上手(五)】文件操作协程操作

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. GO语言的文件操…

武汉星起航:挂牌上海股权中心,开启资本新篇章助力跨境电商飞跃

2023年10月30日&#xff0c;武汉星起航电子商务有限公司在上海股权托管交易中心成功挂牌展示&#xff0c;标志着这家在跨境电商领域拥有卓越声誉的企业正式迈入了资本市场的大门。对于武汉星起航来说&#xff0c;这不仅是其发展历程中的一个重要里程碑&#xff0c;更是对其业务…

Python学习笔记------异常

当检测到错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现一些错误提示&#xff0c;就是所谓异常&#xff08;bug&#xff09; 1、异常的捕获方法 任何程序运行过程中都可能出现异常&#xff0c;我们可以在力所能及的范围内&#xff0c;对可能出现的bug提…
最新文章