千兆UDP学习调试记录(三)

注:本文详细分析了基于FPGA实现UDP传输的Verilog代码,尽量理清了各个模块的所有逻辑,并以自己的理解实现出来。

20181008 周一

△整体代码如下,很简洁,模块也很清晰。

千兆UDP学习调试记录(三)

△ipsend模块梳理。GMII UDP数据包发送模块。

分析了代码,发现有很多知识需要补充……

1)以太网帧格式,有四重,常用的是DIX Ethernet II标准,IEEE 802.3 标准。

IEEE802.3帧格式如下,或见书P58页。

千兆UDP学习调试记录(三)

但程序中使用的是DIX以太网联盟推出的Ethernet II标准,如下。

千兆UDP学习调试记录(三)

千兆UDP学习调试记录(三)

数据链路层位于TCP/IP协议第二层,第一层是物理层,通常由物理芯片实现。TCP/IP,UDP/IP协议第三层为网络层(IP层)。

类型:该字段在网络协议栈分解中及其重要,上层协议众多,在处理数据的时候,必须要一个字段标识我这个交付给谁。如,该字段为0x0800时,表示将有效载荷交付给IP协议,为0x0806交付给ARP。

结构如下图,能很好的了解其关系。

千兆UDP学习调试记录(三)

可参见博文: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字节。

千兆UDP学习调试记录(三)

千兆UDP学习调试记录(三)

千兆UDP学习调试记录(三)

更多内容,参见一篇非常好的文章http://www.cnblogs.com/kzloser/articles/2582349.html

接下来,程序IP首部设定,详细分析见下图中的注释。

千兆UDP学习调试记录(三)

注:FPGA程序中,[15:0]= 16'h4000,其中的“4”是在高位的,就是按“顺序”定义的。

注:为简化了程序,设计中直接将UDP的头部在了IP头部之后,但一定要区分开。对于IP头部,总共只有20字节!

3)UDP帧协议补充,如下图。

千兆UDP学习调试记录(三)

4)到此,分析完了ipsend模块所需的关于网络协议的相关知识,下面讲给出该模块的状态示意及其处理图。

梳理出下面的流程图,花了好久时间,使用Visio绘制,算作是一次学习画流程图。画的过程中,体会到流程图对写程序很重要,它能帮助理清程序思路,是一种很有效的方式。不过,我的流程图还画得很丑,还待多加练习。

希望上述流程图能提供一个清晰的以太网出传输组帧发送过程,并有一定的参考价值。

千兆UDP学习调试记录(三)

到此,介绍完IP_Send模块了(其实准确地说,应该是以太网帧发送模块)。

小结:

1、看似简单的一个以太网发送模块,但要搞清楚其中的每一行代码,必须要学习相关的通信协议,而这些协议内容很多,特别推荐《TCPIP详解卷一:协议》一书,学习后,受益匪浅。

2、在前面看书了解到相关协议的时候,并不觉得有什么特别,或难的地方,但到真正用于实践的时候,才明白,所有的细节,都要完全理解到才行。而且有些细节虽看似很小,但程序实现出来却要很大的功夫。所以,结合实践很重要。

3、虽然只是实现最简单的UDP,但其也包含了整个以太网传输细节,在程序设计中,必须要考虑到所有细节,才能完好的实现相应功能。

 

有兴趣的朋友,欢迎留言,交流,本人扣扣1021100382 ~

 

相关文章: