引言

前文链接:基于FPGA的UDP 通信(一)

本文继续介绍与以太网数据协议相关的内容。

以太网帧协议

IEEE802.3标准规定了,以太网数据传输的格式:

字段解释:

字段名称字段长度/(字节)含义前导码7用于数据帧同步;发送7个字节的 8'h55帧开始符( SFD)1标明下一个字节为目的 MAC 字段;固定为10101011目的 MAC 地址6指明帧的接受者源 MAC 地址6指明帧的发送者长度 / 类型2当这两个字节的值小于 1518 时,那么它就代表其后数据字段的长度;如果这两个字节的值大于 1518则表示该以太网帧中的数据属于哪个上层协议(例如 0x800 ,代表 IP 数据包; 0x806 ,代表 ARP 数据包等。IP数据报46~1500高层的数据,通常为 3 层协议数据单元。对于 TCP/IP是 IP 数据包。帧校验序列(FCS)4对接收网卡提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。

对MAC地址的说明:

将这里的6 字节目的地址按照下面的格式来书写,如:00-01-02-03-04-05。这6个字节在以太网中是按照从左到右(先发该字段的高字节后发字段的低字节)的顺序发送的,同时对每个字节来说,最先发送的是最低位bit0,最后是最高位bit7。

在以太网帧中,目的MAC 地址可以分为三类:单播地址、多播地址和广播地址。单播地址通常与一个具体网卡的 MAC 地址相对应,它要求第一个字节的 bit0 (即最先发出去的位)必须是 0 ;多播地址则要求第一个字节的 bit0 为 1 ,这样,在网络中多播地址不会与任何网卡的 MAC 相同,多播数据可以被很多个网卡同时接收;广播地址的所有 48 位全为 1(即 FF FF FF FF FF FF ),同一局域网中的所有网卡可以接收广播数据包。

帧间距长度为12字节=96bit:

UDP协议

UDP是 User Datagram Protocol 的简称 中文名是用户数据报协议,是 OSI Open System Interconnection ,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务, IETF RFC 768 是 UDP 的正式规范。 UDP 处于 IP 协议的上一层 在IP 报文的协议号是 17 即 0x11 。 UDP 存在 不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 UDP 用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户服务器模式的网络应用都需要使用 UDP 协议。 UDP 协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天 UDP 仍然不失为一项非常实用和可行的网络传输层协议。

与所熟知的TCP(传输控制协议)协议一样,UDP 协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP 和TCP 都属于传输层协议。UDP 协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8 个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

IP数据格式

IP 是TCP/IP 协议族中最核心的协议,所有的TCP、UDP、ICMP、IGMP 数据都以IP 数据报的格式传输。IP 仅提供尽力而为的传输服务,如果发生某种错误,IP 会丢失该数据,然后发送ICMP 消息给信源端。

IP 数据报的格式如下,IP 数据报的长度/类型段的数值为0x0800,数据和填充段包括IP 头部数据和IP 数据两个部分。

IP首部字段定义

IP 报头的最小长度为 20 字节,上图中每个字段的含义如下:

1) 版本(version)

占 4 位,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4(4'b0100),即 IPv4。

2) 首部长度(网际报头长度IHL)占 4 位,可表示的最大十进制数值是 15。这个字段所表示数的单位是 32 位字长(1 个 32 位字长是 4 字节)。因此,当 IP 的首部长度为 1111 时(即十进制的 15),首部长度就达到 60 字节。当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。

数据部分永远在 4 字节的整数倍开始,这样在实现 IP 协议时较为方便。首部长度限制为 60 字节的缺点是,长度有时可能不够用,之所以限制长度为 60 字节,是希望用户尽量减少开销。最常用的首部长度就是 20 字节(即首部长度为 0101),这时不使用任何选项。

3) 区分服务(tos)

也被称为服务类型,占 8 位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998 年 IETF 把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。

4) 总长度(totlen)

首部和数据之和,单位为字节。总长度字段为 16 位,因此数据报的最大长度为 2^16-1=65535 字节。

5) 标识(identification)

用来标识数据报,占 16 位。IP 协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。

6) 标志(flag)

占 3 位。第一位未使用,其值为 0。第二位称为 DF(不分片),表示是否允许分片。取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,设置为 0 时,表示没有更多分片需要发送,或数据报没有分片。

7) 片偏移(offsetfrag)

占 13 位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以 8 个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是 8 字节(64 位)的整数倍。

8) 生存时间(TTL)

表示数据报在网络中的寿命,占 8 位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。

9) 协议

表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。

例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。

10) 首部检验和(checksum)

用于校验数据报的首部,占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。

11) 源地址

表示数据报的源 IP 地址,占 32 位。

12) 目的地址

表示数据报的目的 IP 地址,占 32 位。该字段用于校验发送是否正确。

13) 可选字段

该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。

14) 填充

由于可选字段中的长度不是固定的,使用若干个 0 填充该字段,可以保证整个报头的长度是 32 位的整数倍。

15) 数据部分

表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。

IP首部校验和计算

举例:

UDP数据格式

UDP协议位于 OSI 七层模型中的传输层。数据结构:

UDP 报文中每个字段的含义如下:

源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。

目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。

长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。

校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。16位UDP校验和。UDP计算校验和的方法和计算IP数据报首部校验和的方法相似,但不同的是IP数据报的校验和只检验IP数据报的首部,而UDP校验和包含三个部分:UDP伪首部,UDP首部和UDP的数据部分。伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。在大多数使用场景中接收端并不检测UDP校验和,因此这里不做过多介绍。

总体数据格式:

TCP/UDP区别:

参考说明及致谢

【1】IP数据报格式详解

【2】正点原子FPGA实战篇之以太网

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: