千兆UDP学习调试记录(三)
注:本文详细分析了基于FPGA实现UDP传输的Verilog代码,尽量理清了各个模块的所有逻辑,并以自己的理解实现出来。
20181008 周一
△整体代码如下,很简洁,模块也很清晰。
△ipsend模块梳理。GMII UDP数据包发送模块。
分析了代码,发现有很多知识需要补充……
1)以太网帧格式,有四重,常用的是DIX Ethernet II标准,IEEE 的 802.3 标准。
IEEE802.3帧格式如下,或见书P58页。
但程序中使用的是DIX以太网联盟推出的Ethernet II标准,如下。
数据链路层位于TCP/IP协议第二层,第一层是物理层,通常由物理芯片实现。TCP/IP,UDP/IP协议第三层为网络层(IP层)。
类型:该字段在网络协议栈分解中及其重要,上层协议众多,在处理数据的时候,必须要一个字段标识我这个交付给谁。如,该字段为0x0800时,表示将有效载荷交付给IP协议,为0x0806交付给ARP。
结构如下图,能很好的了解其关系。
可参见博文:https://blog.csdn.net/li1914309758/article/details/70050022
和博文 https://blog.csdn.net/hhpingyear/article/details/80216680
及博文 https://blog.csdn.net/a1414345/article/details/72781130
小结:原来MAC层是这样设计的,光是看书,完全没理解到这么“有趣”的设计方式,真的要,实践出真知啊。
所以在本程序中,前导码(8字节)+MAC(14字节)+数据()+FCS(4字节CRC)。而这个“数据”就包含下一层的“IP数据报”了。
2)IP帧介绍。
到这里,内容就比较明显了,最大的是以太网帧->包含IP帧->再包含UDP帧。上一节分析了MAC帧,这节分析IP帧。
在程序中,使用的是最普遍(简单)方式,因此,没有“扩展”,能不用的就没有使用。报文格式如下,程序中,只用固定的20字节。
更多内容,参见一篇非常好的文章:http://www.cnblogs.com/kzloser/articles/2582349.html
接下来,程序IP首部设定,详细分析见下图中的注释。
注:FPGA程序中,[15:0]= 16'h4000,其中的“4”是在高位的,就是按“顺序”定义的。
注:为简化了程序,设计中直接将UDP的头部“跟”在了IP头部之后,但一定要区分开。对于IP头部,总共只有20字节!
3)UDP帧协议补充,如下图。
4)到此,分析完了ipsend模块所需的关于网络协议的相关知识,下面讲给出该模块的状态示意及其处理图。
梳理出下面的流程图,花了好久时间,使用Visio绘制,算作是一次学习画流程图。画的过程中,体会到流程图对写程序很重要,它能帮助理清程序思路,是一种很有效的方式。不过,我的流程图还画得很丑,还待多加练习。
希望上述流程图能提供一个清晰的以太网出传输组帧发送过程,并有一定的参考价值。
到此,介绍完IP_Send模块了(其实准确地说,应该是以太网帧发送模块)。
小结:
1、看似简单的一个以太网发送模块,但要搞清楚其中的每一行代码,必须要学习相关的通信协议,而这些协议内容很多,特别推荐《TCPIP详解卷一:协议》一书,学习后,受益匪浅。
2、在前面看书了解到相关协议的时候,并不觉得有什么特别,或难的地方,但到真正用于实践的时候,才明白,所有的细节,都要完全理解到才行。而且有些细节虽看似很小,但程序实现出来却要很大的功夫。所以,结合实践很重要。
3、虽然只是实现最简单的UDP,但其也包含了整个以太网传输细节,在程序设计中,必须要考虑到所有细节,才能完好的实现相应功能。
有兴趣的朋友,欢迎留言,交流,本人扣扣1021100382 ~