概述
FPGA中的TCP/IP协议
本人功力有限,此篇是学习后的心得体会,仅供学习参考。
大多来自小梅哥的学习资料,非常感谢!
一、协议概述
应用层:消息(data)
传输层:数据段(datagram)/报文段(segment)——协议有UDP,TCP等
网络层:分组,数据包(packet)——协议有IP,ICMP等(ARP)
ARP协议其实在IP协议稍下,是MAC上层
数据链路层:帧(frame)——以太网MAC层(把要传的数据打包传送给接口)
物理层:P-PDU(bit)——网线+网卡(PHY物理层收发器)
物理层是最底层,数据链路层是它的上层协议,同理网络层是数据链路层的上层协议
-
ARP的作用是寻址(已知目标的IP地址求MAC地址)IP的作用是传输数据。
-
UDP与TCP是IP的上层协议:
UDP是OSI模型中一种无连接的传输层协议,提供面向事物的不可靠信息传输服务(即不管两者是否连接上,发送方只管发无法得知是否安全完整送达)。
TCP是OSI模型中一种面向连接的传输协议,可靠但复杂,发送方要确认接收方是否接收到数据。 -
上层协议是充当数据(含上层协议的报头等信息)嵌套在下层协议中,如图
-
以太网不知道对方有没有接收到发出的数据包,它是不可靠的(如果发生错误,重传)。以太网的错误主要是发生碰撞,碰撞指的是两台机器同时监听到网络是空闲的,同时发送数据,碰撞对以太网来说是正常的。
网络通讯时,数据包首先被网卡接收再去处理上层协议,如果接收到的数据包的硬件地址和本机不符,则丢弃。 -
MAC地址:用来寻址具体的计算机。
-
端口号:计算机上不同应用区分的编码,2个字节。(例:QQ收到数据不会收到浏览器上)。每个端口唯一无法复用(无法同时即给QQ又给浏览器,只能一对一)。
二、FPGA中的TCP/IP实现
FPGA中要实现协议的通信,需要FPGA通过接口驱动片外PHY芯片(物理层),让PHY芯片通过网线与外部设备通信。FPGA中设计MAC层的代码以及上层协议的代码来实现协议的工作。
Mii接口的数据传输是4位的,作为100M的以太网MII的时钟是25M。
PHY芯片每个字节先发低位再发高位
Tip:在写代码时,先写MAC层模块,再写MAC层的上层协议模块。如:UDP时,写MAC模块和 UDP/IP模块 共2个模块。
三、MAC:
MAC帧结构:
前导码(7字节)7个55(数据线上交替变化的01)。
帧开始(界定)符(1字节)1个d5 告诉要开始发有用的数据了。
组合:55 55 55 55 55 55 55 d5 phy芯片每个字节先发低位再发高位。
目的mac地址(6字节)48位的接收mac地址。
源mac地址(6字节)48位的发送mac地址。
长度/类型(2字节) 帧的数据字段长度(或类型)小于等于1500表示数据长度,大于1500表示以太网类型,在ARP和UDP协议不同值不同。(ARP—0x0806 UDP/ICMP/PTP—0x0800)
数据段(n字节)有个最小值,必须要保证整个MAC帧的长度在46~1500字节(有最低字节数是为了在接收的时候数据还在传输,不然无法应答)。
帧校验序列(4字节)对接收网卡提供判断是否传输错误,错则丢弃(一般采用CRC32校验)。
CRC校验:
输入的数据经过算法得到一个CRC输出值,与MAC层的输出作对比看是否正确。其输入的形式一般有两种设定(MAC层代码设计CRC使能信号中用到):
1、 除前导码以外的所有数据当输入(把CRC当数据输入)
2、 除前导码和CRC以外的所有数据当输入
Tip:这里的前导码(包含帧开始符)指的是7个55一个d5。
三、ARP:
ARP协议作用:通过IP地址得到mac地址——源主机的应用程序知道目的主机的IP地址和端口号,但是不知道硬件地址(DMAC)时。
ARP协议的工作原理:源主机发出APR请求,询问“IP地址是192.168.1.1的主机硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填写FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的APR请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包(包含自己的硬件地址)给源主机。
Tip:广播:接收方的mac地址全是F,就是全发的意思。一发多。
ARP数据包结构:
硬件类型(2字节)0x0001 以太网类型
上层协议类型(2字节)0x0800 上层协议为 IP 协议
MAC地址长度(1字节)0x6 以太网MAC地址长度为6
IP 地址长度(2字节)0x4 IP 地址长度为4
操作码op(2字节)0x1/0x2 0x1表示ARP请求包,0x2表示应答包
发送方MAC(6字节)源MAC地址
发送方IP (4字节)源IP地址
接收方 MAC(6字节)目的MAC地址
接收方 IP(4字节)目的 IP 地址
填充数据(18字节)物理帧最小长度为64字节,还差18个字节
四、UDP
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。(一个经典的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据)
UDP数据段的长度:包含报头和数据2个部分。使用报头中的校验值来保证数据的安全(核实发送和接收方的计算值是否相符,注:TCP协议必须有校验值),检测到错误不做错误校正,只是把损坏数据扔掉,或给应用程序提供警告。许多链路层协议都提供错误检测(如物理层mac层的CRC)
UDP数据段格式:
报头:(2字节)源端口号,(2字节)目的端口号,(2字节) UDP报文长度,(2字节)UDP校验和。
数据段:n字节。
校验和的处理:由于校验和是在报头,不像MAC层是在最后,导致在发送数据段之前就要计算出校验和,而且在待发送数据输入完成(把数据全输入进来)到数据开始通过UDP包(发送到校验和之前)发送之间,也有一个计算校验和的时间段。所幸,UDP校验和有一些不太严格的地方,可以忽略(2字节的0x0000),在使用verilog实现时,可以将校验和字段忽略。
五、IP
IP的传输是大段字节序(big endian),先传高位再传低位。
ip总长度:数据内容和IP首部(报头)内容。
报头 校验和 不校验数据。
ip数据包格式:
版本+首部长度(1字节) IP协议版本&IP首部长度。版本就是 IPV4 或者 IPV6,一般选择IPV4,即版本值为4。IP首部长度即有多少个 32 位数,当IP首部长度为20时(即无可选字段),该值为 5.(5*4 =20)
服务类型(1字节)指示了报文的优先权等。默认全部置0即可。
总长度(2字节)IP报文长度。IP报文(报头+数据)长度。
分段标识(2字节)是否属于同一数据段。IP报文的分段ID,值一样则属于同段。
段标识和段偏移(2字节)可设为0。
生存周期TTL(1字节)可以经过的最大路由数。生存时间字段设置了数据报可以经过的最多路由器数,表示数据包在网络上生存(传播多少次)多久。
上层协议类型(1字节)指该封包所使用的网络协议类型,如ICMP、DNS等。常用协议号:00—IP、01—ICMP、06—TCP、17—UDP(这里的数字均是十进制数)。
报头校验和(2字节)IP 报头的校验和
源IP地址(4字节)
目的IP地址(4字节)
可选字段(字节可选)没有的时候长度可以为 0
数据段(n字节)承接上层协议,如UDP,TCP,ICMP等
IP首部校验和算法(checksum):
1、把除了数据段以外的所有数据(报头),拼成一段,取2个字节为一组(校验和当0x0000)累加和。
如:版本+首部长度:0x45 服务类型:0x00 总长度:0x0030 分段标识:0x0000 段标识和段偏移:0x0000 生存周期:0x40 上层协议0x11 校验和:0x0000(置0)…所有相加
0x4500 + 0x0030 + 0x0000 + 0x0000+ 0x4011 + 0x0000 + … = 0x20698(假设最后值)
2、最高位溢出变低位
如:0x20698 的最高位为2,则 0x0002 + 0x0698 = 0x069a
3、取反
checksum=~0x069a=0xf965
这部分用Verilog实现很容易。
Tip:TTL 的初始值由源主机设置(通常为 32 或 64),一旦经过一个处理它的路由器,它的值就减去 1。当该字段的值为 0 时,数据报就被丢弃,并发送 ICMP 消息通知源主机。这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面。
最后
以上就是烂漫面包为你收集整理的FPGA实现ARP协议与UDP协议的全部内容,希望文章能够帮你解决FPGA实现ARP协议与UDP协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复