2 网络数据协议讲解TCP、UDP、IP、MAC
应用层相当于电脑的比如浏览器请求、文件传输请求,对于FPGA来讲,就是数据生成部分或者数据请求部分;传输层就是说数据包通过什么协议进行传输,TCP协议传输可靠但速度慢、UDP传输不可靠但速度快(QQ就是UDP传输);网络层就说,数据包要发送给谁,或者要不要接收这个数据包,比如送快递的,需要知道你的手机,这个对应的就是设备的IP地址;数据链路层就是指示你的固定位置,比如你的户口本、者身份证住址、快递的接收地点,这个应该就是相当于MAC地址;物理传输介质就是光纤或者网线,相当于送快递走的公路啦。 所以要发送/接收一个网络数据包需要经过5个步骤,3次封装。因此我们可以得到下图:
由上图可知,我们的网络数据包的接收与发送是双向的,因此对于FPGA来说,既要写接收数据又要写发送数据;而针对PC来说,这个任务操作系统已经将其实现,我们只需要调用相关接口即可。
下面我们采用一个FPGA接收PC发送的网络数据包的例子来进行详细解释网络数据包的各个组成部分以及对应关系。PS:网络数据包最大为2^16字节
由上图可知,MAC数据包由前导码、SFD、DA、SA、数据包类型、数据区域与FCS校验构成。
1、前导码与SFD:由连续的7个字节的55与1个字节的D5构成。因此我们接收到的数据包的开头为pack_head=D5_55_55_55_55_55_55_55(由于数据模块是从低位开始接收的,因此实际上接收到的数据位为 55_55_55_55_55_55_55_D5)
2、DA与SA:由目的MAC地址与源MAC地址构成。因此我们接收到的数据包为pack_das=55545352515A_000000000002(000000000002是FPGA的MAC地址,这个写代码的时候随便写一个就行,但是写好就不能随便改了。55545352515A是PC的地址,cmd-ipconfig查看即可)
3、类型/长度:用来描述属于IP、ARP、SNMP包,也可以用来描述MAC数据包的长度,大于0x0600(2字节)时,描述的是类型而非长度。采用UDP传输时,一般设置为0x0800。因此我们接收到的数据包为pack_type_len=0008。想看都有哪些内容请点击下面的传送连接。
6 --> MAC层协议_老理说的好的博客-CSDN博客_mac层协议以太网的MAC帧格式有好几种,被广泛应用的是DIX Ethernet V2标准,还有一种是IEEE的802.3标准,该标准经过了多年的发展,已经出现了很多种子标准。DIX Ethernet V2 标准与 IEEE 的 802.3 标准只有很小的差别,因此可以将 802.3 局域网简称为“以太网”。严格说来,“以太网”应当是指符合 DIX Ethernet V2 标准的局域网MAC 的全称 medium acess control 即媒体访问控制,以太网的数据链路层。媒体访问控制主要是解决数据流发送规则,谁https://blog.csdn.net/weixin_38387929/article/details/116558181?utm_term=mac%E6%95%B0%E6%8D%AE%E5%8C%85%E4%B8%8A%E5%B1%82%E4%BD%BF%E7%94%A8%E7%9A%84%E5%8D%8F%E8%AE%AE&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-0-116558181-null-null&spm=3001.44304、DATA:这里是网络层IP、ARP数据
5、FCS校验:这个很重要!!!,如果接收方收到的数据校验不正确会把数据抛弃,因此当FPGA给PC发数据时,需要正确的FCS校验码PC才能收到数据。下面是连接,大家自行下载
基于Verilog的FCS校验-嵌入式文档类资源-CSDN下载资源来自github,用于Verilog进行网络通信时的FCS校验码的生成更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_37912811/85749732下面是FCS校验规则:
也就是说,需要FPGA与PC事先约定好一个校验码,针对IPV4的校验码通常采用32位的 04c11db7串进行加密与校验。加密时将所有数据位左移32位然后除以04c11db7,所得数据放到最后4个字节,校验时将所有数据除以04c11db7,如果为0则代码数据传输正确可以接收,不是0则直接抛弃。
由上图可知,MAC子层的DATA域包括,IP首部的20字节与DATA域。
1、版本+首部长度+服务类型
udp传输时设置的值一般为pack_ip_head=0045,即对应的版本为4,首部长度为5,服务类型为0
2、总长度:UDP长度+20字节(长度都是按字节算的) 因此最大值为65535字节,所以这里解释了为什么长度时65536,因为网络协议约最大长度就是16位,即2^16=65536。
3、标识:
比如当我们下载时,一个数据包肯定发送不完,那就需要多次发送,这个标识指示是否是同一段数据,一般设置0001,所以接收到的数据为0100
4、标记、分段漂移、生存时间:本教程内容只实现了数据小于65536字节的传输,因此这里设置的数据为0000,生存时间设置为40。因此接收到的数据为:400000下面是各个指标的解释:
5、协议:该字段指出在IP处理过程完成之后,有哪种上层协议接收导入数据报。这个字段的值对接收方的网络层了解数据属于哪个协议很有帮助。设置为11。
6、首部校验合:这里的校验方法与UDP校验和校验方法相同,而UDP校验和是非必选的,因此这里讲解校验和后,UDP的校验和不再重复讲解。
例1、
7、源地址与目的地址
192.168.1.100=C0_A8_01_64(src);192.168.1.128=C0_A8_01_80(dst)。
因此,FPGA接收到PC发送来的数据为:80_01_A8_C0_64_01_A8_C0
8、DATA数据域,保存传输层数据
2.3.1 UDP子层
1、src_port与dst_port
源端口5678=162E,目的端口1234=04D2;因此FPGA接收到的的数据为都D2_04_2E_16
2、udp长度与udp校验和
UDP长度=8字节的UDP首部+数据位,因此此字段最小为8,UDP校验上面已经讲解过了。
如果还是觉得有问题,可以看下面的链接讲解:
IP 数据包格式_半砖的博客-CSDN博客_ip协议数据包格式IP 数据包是一种可变长分组,它由首部和数据负载两部分组成。首部长度一般为20-60字节(Byte),其中后40字节是可选的,长度不固定,前20字节格式为固定。数据负载部分的长度一般可变,整个 IP 数据包的最大长度为65535字节。版本:【4位】指 IP 协议版本。通信双方使用的版本必须一致,IPv4 值为0100,IPv6 值为0110。首部长度:【4位】表示首部的长度,IP 头的最大长度为60字节,而该字段占4位,最大表示的十进制数为15,所以该字段的值*4才代表首部长度所占的字节数.https://blog.csdn.net/hexf9632/article/details/124846416
2.3.2 TCP子层:本项目FPGA采用UDP传输,因此TCP不做介绍
tcp数据包的介绍_一十六笔画生的博客-CSDN博客_tcp数据包TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。 因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。 TCP报文中数据部分是可选的,即TCP报文可以不包含数据(同理IP包也可以不包含数据)。不含数据的TCP报文通常是一些确认和控制信息类的报文,如TCP建立连接时的三次握.https://blog.csdn.net/weixin_44809632/article/details/106483711至此,本系列教程的第一篇基础知识讲解已经完成。