因为没有做过以太网的项目,也没有进行过以太网通信测试,本片博客仅仅是对以太网协议极小一部分的学习了解。如有不当之处,还请指正。
一、以太网
以太网是一种产生较早,使用相当广泛的局域网技术,局域网就是一个区域的网络互联,可以使办公室也可以是学校等等,大小规模不一。
最初是由Xerox(施乐)公司创建(大概是1973年诞生)并由Xerox、 Intel和DEC公司联合开发的基带局域网规范,后来被电气与电子工程师协会( IEEE)所采纳作为802.3的标准。
目前以太网根据速度等级分类大概分为:标准以太网(10Mbit/s),快速以太网(100Mbit/s),千兆以太网(1000Mbit/s),以及更快的万兆以太网(10Gbit/s)。但在平常使用中,快速以太网和千兆以太网已经足够了。
因为以太网通信不是像蓝牙那样无限通信,而是通过连接线进行通信,所以以太网接发双方都会有接口。以太网接口类型有RJ45接口,RJ11接口(电话线接口),SC光纤接口。其中RJ45接口使我们最常用的以太网接口(电脑接口)。
RJ45接口也称为水晶头,由插头和插座组成
可以看到,RJ45接口和HDMI等接口一样,也是采用差分数据传输,这种传输有抗干扰能力强的特性(这在高速数据传输中很重要)。
以太网常用于大型数据传输(如:视频数据),以太网也叫以太网协议,就是一种传输规则,发收双方必须遵守这种规则才能正确地进行数据传输和接收。
以太网通信是以
数据包的形式传输
, 其单包数据量达到几十, 甚至成百上千个字节。
二、网络模型
也有将TCP/IP分为四层的模型
而我们在使用FPGA设计以太网传输时,基本只需要考虑数据发送,即只需要考虑设计物理层,也就是生成比特流。
如果是进行网络系统设计,就需要考虑各种接口(应用层),方便用户等调用。
三、以太网数据包格式
可以看到,我们一帧能发送的真正的数据内容为:18-1472 Byte;然后将用户数据添加UDP首部,形成UDP层;再加上IP首部,形成IP层;最后加上前导码、SFD(帧起始界定符)、以太网帧头、以及FCS(帧检验序列),构成了MAC层(物理层,包括源MAC地址和目的MAC地址),也就是最终需要在通信线路上传输的数据。
在设计物理层时,只需要计算得到各个首部、前导码、起始界定符、以及校验,就可以得到物理层,然后进行传输。
以太网帧格式
摘自《开拓者FPGA开发指南》
前导码
( Preamble) : MAC物理层使用7个字节同步码( 0和1交替( 55-55-55-55-55-55-55))实现数据的同步。
帧起始界定符
(
SFD
, Start Frame Delimiter):使用1个字节的SFD(固定值为0xd5)来表示一帧的开始,后面紧跟着传输的就是以太网的帧头。
目的MAC地址
: 即接收端物理MAC地址,占用6个字节。 MAC地址从应用上可分为单播地址、组播地址和广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。
源MAC地址
:即发送端物理MAC地址,占用6个字节。
长度/类型
: 上图中的长度/类型具有两个意义,当这两个字节的值小于1536(十六进制 为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议( 网际协议) 、 0x0806代表ARP协议(地址解析协议)等。
数据
:以太网中的数据段长度最小46个字节, 最大1500个字节。最大值1500称为以太网的最大传输单元(
MTU
, Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素, 因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置, 通常以太网的有效数据字段小于1500个字节。
帧检验序列
(
FCS
, Frame Check Sequence) : 为了确保数据的正确传输, 在数据的尾部
加入了4个字节的循环冗余校验码( CRC校验) 来检测数据是否传输错误。 CRC数据校验从以太
网帧头开始即不包含前导码和帧起始界定符。 通用的CRC标准有CRC-8、 CRC-16、 CRC-32、 CRCCCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。
帧间隙
( IFG,Interpacket Gap) :就是以太网相邻两帧之间的时间间隔,帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间, IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。
三、TCP/IP协议簇
TCP( 传输控制协议) /IP(网际协议)协议簇,虽然看上去TCP/IP协议簇只有两个协议,其实TCP/IP协议簇包含了上百种协议,最常用的有TCP、IP、UDP等。其中TCP协议和UDP协议应用最广泛。
1、IP协议
IP协议是TCP/IP协议簇中的核心协议,所有的TCP、 UDP及ICMP数据都以IP数据报格式传输。
从以太网数据包格式中可以看出,IP数据报 包括IP首部和数据段。
IP数据报内容
版本
:4位版本号,IPv4(0100),IPv6(0110),目前在以太网使用IPv4多,但是在计算机系统中,IPv6也已经流行起来,因为IPv4仅用32个bit来表示地址,IPv4 地址的总数为 4294967296,到现在,已经快用光了;而IPv6使用128bit来表示地址,理论来说根本用不完。
首部长度
:4位,表示IP首部一共有多少个32位(4Byte),假设无可选字段(一般来说没有),IP首部有20个Byte,则首部长度为5;最大为15,即60个Byte。
服务类型
:8位,普通服务的话,设置为0。可以参考:
IP首部中的服务类型(TOS)
总长度
:16位,包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以计算出IP数据报中数据内容的起始位置和长度。
标识
:16位,通常每发一份报文,就加1。
标志
:3位,用来表示分片还是不分片,第一位(最高位)保留,第二位(1-不分片,0-允许分片),第三位为1即表示后面“还有分片”的数据报。为0表示这已是若干数据报片中的最后一个。
叶偏移
:13位,在接收方进行数据报重组时用来标识分片的顺序。
生存时间
:8位,防止丢失的数据包在无休止的传播,一般被设置为64或者128。IPv6 地址有两个生存期:首选生存期和有效生存期,而首选的生存期总是小于等于有效的生存期。具体可以参考官方文档。
协议
:8位,表示此数据报所携带上层数据使用的协议类型,TCP为6, UDP为17。可以参考:
IP协议号 IP首部中有8位协议号,用于指明IP的上层协议
首部校验和
:这部分需要自己计算,用来校验IP数据报头部是否被破坏、篡改和丢失等,不校验数据。
源MAC地址,目的MAC地址
:就是发送和接收IP地址。
可选字段
:是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍。
首部校验和计算
1、将16位校验和字段置为0,将IP首部分为多个16位的单元;
2、对各个单元采用反码加法运算
3、假如得到的结果有溢出,则将结果再次分为两个16位相加,直到不出现进位
如下例:
2、UDP协议
在以太网数据包中,我们可以看到,TCP协议(IP层)比UDP层复杂,更为可靠,但是UDP运用场景也非常多。
那为什么不所有传输都用更可靠的TCP协议呢,这就像卖手机,不可能都上最好的配置,毕竟有人不需要这么好的配置,我只需要打电话,一个骁龙835就够了,如果你叫我多花2000块,买一个865,那我没必要。所以这就是需求不同,所以UDP也常用。
TCP与UDP的区别
:TCP为可靠传输协议,而UDP为不可靠传输协议;TCP协议可以保证数据的完整和有序,而UDP不能保证;UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;
应用场景
:
TCP适用于
对数据
完整性要求很高
的场合,比如文件传输;而
UDP
适用于对数据
完整性要求不高
的场合,比如说视频直播,毕竟直播的时候少传输几个像素点,影响也不大,而且视频直播要求数据传输很快。而文件数据要是少一个byte或者更多,可能会造成很大的问题。
UDP格式数据
其中的UDP校验和和TCP协议的校验和计算方式一样,
但是需要计算三个部分:UDP伪首部、UDP首部、UDP数据部分。
伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。在大多数使用场景中接收端并不检测UDP校验和。