基于UDP协议的以太网数据收发控制器
本文是自己学习的思路梳理,参考的是野火的升腾Pro教程,需要的可以去看看。
一、理论学习
TCP/IP 五层模型
两个设备间要完成正确的通信,相互兼容的硬件和软件是必不可少的,这就是我们要说的网络通信协议。为了实现网络通信的标准化,普及网络应用,国际标准化组织(ISO)将整个以太网通信结构制定了OSI(Open System Interconnection)模型,译为开放式系统互联。OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即OSI开放互连系统参考模型。每个层功能不同,网络通信中各司其职,整个模型包括硬件和软件定义。OSI模型只是是理想分层,一般的网络系统只是涉及其中几层。
在一定程度上参考了OSI模型后,产生了TCP/IP 协议。TCP/IP(Transmission ControlProtocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。TCP/IP五层模型,具体见下图。

在TCP/IP五层参考模型中,数据链路层又被分为LLC层(逻辑链路层)和MAC层(媒体介质访问层)。目前,对于普通的接入网络终端的设备,LLC层和MAC层是软、硬件的分界线。如PC的网卡主要负责实现参考模型中的MAC子层和物理层,在PC的软件系统中则有一套庞大程序实现了LLC层及以上的所有网络层次的协议。
以太网
本文的主角以太网是指遵守IEEE 802.3标准组成的局域网,由IEEE 802.3标准规定的主要是位于参考模型的物理层(PHY)和数据链路层中的介质访问控制子层(MAC)。
- 物理层:在物理层,由IEEE 802.3标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,物理层一般是通过一个PHY芯片实现其功能的。物理层中,介绍一下MII/RGMII接口。MII(Media Independent Interface(介质无关接口)或称为媒体独立接口,它是IEEE-802.3定义的以太网行业标准,用以连接以太网MAC层和PHY芯片,后逐步扩展为:MII、RMII、SMII、GMII、RGMII等。
MII:百兆以太网接口,单边沿采样;
RMII:百兆以太网接口,MII的线路简化版,双边沿采样;
GMII:千兆以太网接口,单边沿采样;
RGMII:千兆以太网接口,GMII的线路简化版,双边沿采样。 - MAC子层:MAC子层是属于数据链路层的下半部分,它主要负责与物理层进行数据交接,如是否可以发送数据,发送的数据是否正确,对数据流进行控制等。它自动对来自上层的数据包加上一些控制信号,交给物理层。接收方得到正常数据时,自动去除MAC控制信号,把该数据包交给上层(注意:这里描述的数据流方向是MAC子层——>物理层)。MAC数据包格式如下。

(1)前导字段(7Byte),也称报头,内容为连续7个字节的0x55。
(2)帧起始定界符(SFD,1Byte):用于区分前导段与数据段的,内容为0xD5。
(3)MAC地址(6Byte):MAC地址由48位数字组成,它是网卡的物理地址。
(4)数据包类型(2Byte):本区域可以用来描述本MAC数据包是属于TCP/IP协议层的IP包、ARP包还是SNMP包,也可以用来描述本MAC数据包数据段的长度。如果该值被设置大于0x0600,不用于长度描述,而是用于类型描述功能,表示与以太网帧相关的MAC客户端协议的种类。
(5)数据段(46-1500Byte):数据段是MAC包的核心内容,其长度可以从0~1500字节间变化。由于协议要求MAC数据包长度至少为64字节,当数据段的字节少于46字节时,会自动填上无效数据。
(6)校验和域(4Byte): MAC 数据包的尾部是校验和域,它保存了 CRC 校验序列,用于检错。 - IP协议:MAC数据包位于TCP/IP协议的数据链路层,当MAC数据包经过数据链路层到达网络层时,前导码、帧起始界定符、目的MAC地址、源MAC地址、类型/长度以及校验字节均被去除,只有有效数据传入了网络层(注意:这里描述的数据流方向是物理层——>MAC子层)。网络层互联主要负责主机间或与路由器、交换机间对分组数据的路由选择和传递。要实现这一功能,就需要相关协议。常用的网络层协议就是IP协议。所以传入网络层的数据包并不完全是需要传输的有效数据,他的前面还包含着 20字节的IP协议首部。IP数据包格式如下图。

(1)版本(4bit):该字段定义IP协议版本。
(2)首部长度(4bit):该字段定义数据报协议头长度,表示协议头部具有32位字长的数量。协议头最小值为5,最大值为15。
(3)服务类型(8bit):该字段定义上层协议对处理当前数据报所期望的服务质量。
(4)总长度(16bit):该字段定义整个IP数据报的字节长度,包括协议头部和数据。其最大值为 65535 字节。以太网协议对能够封装在一个帧中的数据有最小值和最大值的限制(46~1500个字节)。
(5)标识(16bit):该字段包含一个整数,用于识别当前数据报。
(6)标记(3bit):该字段由3位字段构成,其中最低位(MF)控制分段,存在下一个分段置为1,否则置0代表该分段是最后一个分段。中间位(DF)指出数据报是否可进行分段,如果为1则机器不能将该数据报进行分段。第三位即最高位保留不使
(7)分段偏移(13bit);生存时间(8bit);
(8)协议(8bit):该字段指出在IP处理过程完成之后,有哪种上层协议接收导入数据报。UDP为'd17。
(9)首部校验和(16bit):该字段帮助确保 IP 协议头的完整性。对IP首部中每个16bit进行二进制反码求和,将计算结果再取反码,若结果为0,通过检验,否则,不通过检验。
(10)源地址(32bit):源主机IP地址。
(11)目的地址(32bit):目标主机IP地址。 - UDP协议:网络层在接收到数据包后,取下数据包的IP首部,将剩余有效数据包发送到传输层。传输层有两种传输协议:基于字节流的TCP协议、基于报文流的UDP协议。两种协议各有优缺点,应用于不同场景。TCP协议是面向连接的流传输协议,可以保证数据传输的完整、有序,是可靠协议,常用在对数据完整性和正确性要求较高的场合,如文件传输。占用资源较UDP多,速度较UDP慢;UDP协议则是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,因为无需连接,传输速度较TCP快,占用资源量较TCP少,适合实时数据的传输,如视频通话。本文采用较为简单的UDP协议。若传输层使用UDP协议,那么传入传输层的数据包为UDP数据包,前8各字节为UDP首部。UDP数据包格式,具体见下图。

(1)源端口号(16Byte):源主机的应用程序使用的端口号。
(2)目的端口号(16Byte):目的主机的应用程序使用的端口号。
(3)UDP长度(16Byte):是指UDP头部和UDP数据的字节长度。因为UDP头部长度是8字节,所以字段的最小值为8。
(4)UDP 校验和(16Byte):该字段提供了与TCP校验字段同样的功能;该字段是可选的。
综上,我们可以知道,如果是接收PC端传入板卡的以太网数据信息(MAC子层——>物理层),首先需要将接收到的RGMII数据转化为GMII数据,然后对MAC数据包、IP数据包、UDP数据包的数据进行处理,并提取出有效数据。若是板卡将数据传回PC端(物理层——>MAC子层),就要将有效数据按照以太网数据包格式进行打包,然后将GMII数据转化为RGMII数据发送。
二、程序设计
要想进行程序设计,首先要做的就是对以太网数据包的信息由具体的了解。

浙公网安备 33010602011771号