1.概述
以太网是一种计算机局域网技术,IEEE组织的IEEE802.3标准指定了以太网的技术标准,它规定了物理层连线、电子信号和介质访问层协议的内容。
以太网是在20世纪70年代研制开发的一种基带局域网技术,使用同轴电缆作为网络媒体,采用载波多路访问和冲突检测机制,数据传输速率高达10MBPS。随着技术的发展,当前以太网已经能够达到100Gbps的超高传输速率了。
以太网传输中,10M,100M和1000M以太网常用于我们日常的学习和生活中,而10G,40G,100G以太网主要用于服务器内部进行高速数据交互或者电信骨干网络。以太网传输在不同的应用方面有不同的通信协议,例如QQ聊天消息收发是基于UDP协议加腾讯自定义上层协议,实时视频数据的传输也多采用UDP协议,而文件传输则使用FTP协议,除了这些协议,还有应用非常广泛的网页传输协议HTTP和可靠数据传输使用的TCP协议。
以太网协议中,最常见的应该就是TCP/IP协议了,在计算机和嵌入式系统中,TCP/IP协议应用非常广泛,因为TCP/IP协议设计之初是因为软件设计的灵活性而准备的,对于硬件描述语言verliog实现较为困难,FPGA发展到现在,却鲜有见成功的商用级RTL的TCP/IP设计,大部分使用verliog实现的以太网传输都是基于较为简单的UDP协议,所以本次基于FPGA实现UDP通信,UDP是一种不可靠传输,他只管数据有没有发送出去,而不管对方是否正确接收到,但在很多场合是可以接受这种潜在的不可靠性的。
2.UDP通信协议简介
UDP(User Datagram Protocol),即用户数据报协议,是一种面向无连接的传输层协议,无连接是指在传输数据时数据的发送端和接收端不建立逻辑连接,由于UDP协议消耗的资源少,通信效率高,所以经常用于音频、视频和普通数据的传输。
与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层,根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议,UDP协议的主要作用是将网络数据流量压缩成数据包的形式,按数据包进行传输。
以太网UDP帧的用户数据是打包在UDP协议中,而UDP协议又是基于IP协议之上的,IP协议优势走MAC层发送的,即从包含关系来说:MAC帧中的数据段为IP数据报文,IP报文中的数据段为UDP报文,UDP报文中的数据段为用户希望传输的数据内容,比如我们要传输的内容为“Hello,welcome to FPGA!”,其报示意图如下图所示:

UDP数据包格式格式如下图所示:

其中前导码为0x55,0x55,0x55,0x55,0x55,0x55,0x55,帧起始界定符SFD为0xd5,以太网帧头的数据帧格式为:

由上图可以,如果想使用FPGA实现UDP通信,需要知道目的MAC地址,MAC地址是由网卡厂家设定的,每个网卡出厂时有一个确定的MAC地址。长度/类型为0x0800表示IP协议,因为UDP协议是在IP协议下的,0x0806表示APR协议。IP首部的报文格式如下:

其中前
20
个字节和紧跟其后的可选字段是
IP
数据报的首部,前
20
个字节是固定的,后面可选字段是可有可无的,首部的每一行以 32
位(
4
个字节)为单位。
版本:
4
位
IP
版本号(
Version
),这个值设置为二进制的
0100
时表示
IPv4
,设置为
0110
时表示
IPv6
, 目前使用比较多的 IP
协议版本号是
4
。
首部长度:
4
位首部长度(
IHL
,
Internet Header Length
),表示
IP
首部一共有多少个
32
位(
4
个字节)。 在没有可选字段时,IP
首部长度为
20
个字节,因此首部长度的值为
5
。
服务类型:
8
位服务类型(
TOS
,
Type of service
),该字段被划分成两个子字段:
3
位优先级字段(现在已经基本忽略掉了)和 4
位
TOS
字段,最后一位固定为
0
。服务类型为
0
时表示一般服务。
总长度:
16
位
IP
数据报总长度(
Total Length
),包括
IP
首部和
IP
数据部分,以字节为单位。我们利用 IP
首部长度和
IP
数据报总长度,就可以知道
IP
数据报中数据内容的起始位置和长度。由于该字段长
16bit
,所以 IP
数据报最长可达
65535
字节。尽管理论上可以传输长达
65535
字节的
IP
数据报,但实际上还要考虑网络的最大承载能力等因素。
标识字段:
16
位标识(
Identification
)字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1
。
标志字段:
3
位标志(
Flags
)字段,第
1
位为保留位;第
2
位表示禁止分片(
1
表示不分片
0
:允许分片);第 3
位标识更多分片(除了数据报的最后一个分片外,其它分片都为
1
)。
片偏移:
13
位片偏移(
Fragment Offset
),在接收方进行数据报重组时用来标识分片的顺序。
生存时间:
8
位生存时间字段,
TTL
(
Time To Live
)域防止丢失的数据包在无休止的传播,一般被设置为 64
或者
128
。
协议:
8
位协议(
Protocol
)类型,表示此数据报所携带上层数据使用的协议类型,
ICMP
为
1
,
TCP
为6,
UDP
为
17
。
首部校验和:
16
位首部校验和(
Header Checksum
),该字段只校验数据报的首部,不包含数据部分;校验 IP
数据报头部是否被破坏、篡改和丢失等。
源
IP
地址:
32
位源
IP
地址(
Source Address
),即发送端的
IP
地址,如
192.168.1.123
。
目的
IP
地址:
32
位目的
IP
地址(
Destination Address
),即接收端的
IP
地址,如
192.168.1.102
。
可选字段:是数据报中的一个可变长度的可选信息,选项字段以
32bit
为界,不足时插入值为
0
的填充字节,保证 IP
首部始终是
32bit
的整数倍。
假设我们的IP首部数据设置如下图所示:
则IP首部校验和的计算方法为:
0x4500+0x0032+0x0000+0x4000+0x4011+0x0000+0xc0a8+0x017b+0xc0a8+0x0166=0x22974,
0x0002+0x2974=0x2976
0xffff-0x2976=0xd689
则首部校验和为0xd689。
之后就是UDP首部和数据部分了,格式如下图所示:
其中UDP校验和可以不用,直接置零就可以。
最后还有一个CRC32检验部分,这个我们放到下一篇去讲。