FPGA - 以太网UDP通信(三)

一,引言

前文链接:FPGA - 以太网UDP通信(一)

                  FPGA - 以太网UDP通信(二)

在以上文章中介绍了以太网简介,以太网UDP通信硬件结构,以及PHY芯片RGMII接口-GMII接口转换逻辑,以及数据链路层(MAC层)接受发送逻辑。接下来介绍UDP通信IP层与UDP层

二,以太网UDP通信结构框图

在   FPGA - 以太网UDP通信(二)中画出了以太网UDP通信简易结构框图,在mac_layer中使用双fifo来处理跨时钟域处理,并且在mac层的MAC帧格式中:(类型/长度   2byte  小于1536表示长度,大于1536表示类型 arp:16'h0806 , ip: 16'h0800 )所以在设计中预留arp接口。

结构框图如下:

三,IP层数据帧

IP数据报格式如下图所示,IP 数据报文由首部(称为报头)数据两部分组成。首部的前一部分是固定长度,共 20 字节(如图所示前五行为IP首部),是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

IP 协议首部详解

---------------------------------------------------IP首部 20byte---------------------------------------------------

版本 + 首部长度  1byte

  • 版本:占4位,指的是IP协议的版本,通信双方的版本必须一致,当前主流版本是4,即IPv4,也有IPv6
  • 首部长度:占4位,最大数值为15,表示的是IP首部的长度,单位是“32位字”(4个字节),也就是IP首部最大长度为60字节

        版本ipv4 : 4'h4 ,首部长度 : 4'h5

服务类型   1byte
        一般为8'h0

总长度     2byte
        (ip首部长度 + ip数据包长度)占16位,最大数值为65535,表示的是IP数据报总长度(IP首部+IP数据) (在前边介绍数据链路层的时候,也提到过一个长度。对于数据链路层的长度,称之为MTU,一般为1500字节。而IP数据报的最大长度有65535个字节,比MTU要大。如果真正传输的时候,如果出现这种情况,数据链路层会对IP数据报进行分片,也就是将一个较长的IP数据报拆分成多个数据帧来进行传输)

标识       2byte
        复位给0,发完一包数据自加1

标记 + 分段偏移 2byte

  • 标记:3bit。最高位保留为0;中间位是否开启分段,0不开启,1开启;最低位表示是否存在下一个分段,0表示为最后一个分段,1表示还存在下一个分段。一般默认为3’b010
    分段偏移:表示第0段,第1段.....
  • 片偏移:前边有提到,如果IP数据报的长度过长,会进行IP报文的分片,把一个IP报文拆分成多个数据帧进行数据链路层的传输。因此,如果拆分的话,就需要使用片偏移来记录当前的数据帧,保存的第几个偏移的IP数据

生存时间(TTL)  1byte
        表明IP数据报文在网络中的寿命,每经过一个设备(不管是路由器还是计算机),TTL减一,当TTL=0时,网络设备必须丢弃该报文(它解决的就是,当网络报文找不到终点的时候,避免网络报文在网络中无限的传输,以消耗带宽)
win系统默认为8‘h80

协议  1byte

        表明IP数据所携带的具体数据是什么协议的(如TCP、UDP等)
udp : 8'd17   ,tcp : 8'd6  , icmp : 8'd1

首部校验和  2byte

        校验IP首部是否有出错(接收方接收到IP首部之后也会进行校验,如果有错,则直接丢弃)

源ip地址 4byte

        发送IP数据报的网络设备的IP地址

目的ip地址 4byte

        IP数据报要到达的目的网络设备的IP地址        

---------------------------------------------------------------------------------------------------------------------------

IP 首部校验和算法

        首部检验和字段是根据IP首部计算的检验和码,不对首部后面的数据进行计算 。其计算方法为:

        1. 将校验和字段置为0, 然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用 0 比特填充到 16 比特的倍数;
        2. 对各个单元采用反码加法运算(即高位溢出位会加到低位 通常的补码运算是直接丢掉溢出的高位)将得到的和的反码填入校验和字段;

 四,UDP层数据帧

UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。

UDP报文没有可靠性保证顺序保证流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。 UDP在IP报文中的位置如下图所示:

UDP的报文格式

UDP首部有8个字节,由4个字段构成,每个字段都是两个字节。

------------------------------------------------------------UDP首部---------------------------------------------------------

源端口      : 源端口号,需要对方回信时选用,不需要时全部置0。

目的端口  :目的端口号,在终点交付报文的时候需要用到。

长度         :UDP的数据报的长度(包括首部和数据)其最小值为8字节(只有首部),最大值为65535字节。

校验和      :检测UDP数据报在传输中是否有错,有错则丢弃。
该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0。

---------------------------------------------------------------------------------------------------------------------------------

五,总结

至此,我们已经了解了IP协议首部的具体内容,IP数据包就是紧跟在IP协议首部后面的 。 然后, IP的数据部分也还并不是单纯的用户数据, 我们在网络应用时 ,还需要将我们的用户数据 进一步打包到比IP协议更上一 层的协议中, 再通过 IP 协议发送。以及,也已经了解了UDP协议首部的具体内容,在发送时一层一层完成组包,在接收时一层一层完成解包,就可实现简单的UDP网络通信。

  • 22
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值