TCP/IP协议栈设计—TCP设计问题汇总

TCP/IP协议栈设计—TCP设计问题汇总

目录

0W5500实现的TCP传输抓包分析

1,长组合逻辑的时序需求

2,校验和计算的时序需求

3,布局布线的时序需求

4,关于WireShark出现黑色帧

5,关于接收的TCP应答帧,校验和出错

6,关于校验和计算不正确

 

0,W5500实现的TCP传输抓包分析

首先,把前期做好的用W5500模块实现的TCP传输,再次进行测试,获取在这种情况下,TCP的连接过程,然后自己在实现TCP连接时,参考抓取的数据,进行设计。

采用网络调试助手和W5500连接抓取的数据,如下图,对数据细节进行分析。

TCP/IP协议栈设计—TCP设计问题汇总

设计FPGA端为服务器模式。当收到SYN连接请求时,进入TCP连接状态。

 

1,长组合逻辑的时序需求

如下综合后,时序分析报错。超过时序需求。

TCP/IP协议栈设计—TCP设计问题汇总

TCP/IP协议栈设计—TCP设计问题汇总

说这里的时间约束不满足,想办法改进。

如下,将此判断,分成在两个时钟下进行。这样就能大大减小上面这条代码的组合逻辑延迟。

TCP/IP协议栈设计—TCP设计问题汇总

TCP/IP协议栈设计—TCP设计问题汇总

 

2,校验和计算的时序需求

TCP/IP协议栈设计—TCP设计问题汇总

如下,代码定位到TCP校验和计算的地方,先把线网型变量过寄存器试试,如果这样不行,那就只有修改校验和计算方式,用时序需求更少的方式。

TCP/IP协议栈设计—TCP设计问题汇总

寄存器提前缓存后,时序要些了,没有再报时序的错。

TCP/IP协议栈设计—TCP设计问题汇总

 

3,布局布线的时序需求

经实际测试,调整了TCP发送校验和的计算,然后实际接收就通过了。在上面2优化之前,下载程序,接收的校验和就是错的。

关于时序问题的解决思路:1),将校验和计算简化,分为多个时钟来计算。2),试一下tx时钟采用PLL倍频来提供,减小全局都是用rx_clk造成的是时钟偏移。

 

4,关于WireShark出现黑色帧

提示may be caused by "IP checksum offload"时,尝试关闭网卡本身的校验和。

参考博文:https://bbs.****.net/topics/390836261?page=1

https://blog.****.net/ixidof/article/details/6658125

 

TCP/IP协议栈设计—TCP设计问题汇总

 

5,关于接收的TCP应答帧,校验和出错

这个问题很烦,FPGA接收到PC的link请求,然后回复ACK帧,但是在测试中发现,回复的ACK帧始终是TCP校验和出错。尝试了上面的方法,把校验和卸载“关闭”,但仍是没有用。

因为TCP校验和出错,PC端认为接收的ACK帧不可行,因此,link始终是失败的。测试中很灵性的一点是,有时候,那么一两次,居然校验和正确了。对于这个问题,我这两天反复再查看核对,甚至多次手算校验和,仿真等。

经过仔细分析,仿真是对的。因此,校验和出错,80%以上的概率是在计算时序不满足,造成的。因此围绕优化系统时序上做了很多工作。目前,做时序优化的有:1,把线网型变量通过寄存器赋值后,再进行校验和计算。2,将发送时钟由PLL生成标准的125MHz,不在由rx_clk全部提供。若全部采用rx_clk,其扇出太大,并且时钟偏斜(skew)太大。经过上面的两个设计调整,真的有优化效果,综合后的时序约束好了很多。但是没有解决根本问题,TCP校验和照常出错。

最后,关键优化点,还是在checksum的计算上!前面调用function函数,每个时钟要计算两次,函数如下图。此为“边加边循环进位”,一个时钟要进行两次加法,需求的建立时间太长。

TCP/IP协议栈设计—TCP设计问题汇总

采用上面方式,组合时序需求太高。经过从新设计,采用“先加法,再循环进位”的方式。代码设计如下图。采用这样的方式,有效地降低了建立时间需求。并经过实际测试,真正的解决了TCP校验和计算不对的问题。

TCP/IP协议栈设计—TCP设计问题汇总

在这次设计中,这个问题困扰我好几天,尝试了很多方式,现在终于解决,很开心。

 

6,关于校验和计算不正确

真的是玄虚。同样的代码,有时候WireShark抓就是说错的,而且数据中的校验和和“正确的”校验和,永远相差0xC0的值。感觉有BUG。问题如下:

TCP/IP协议栈设计—TCP设计问题汇总

经过仔细分析,发送和接收的端口号不对,可能是PC端的调试助手端口没有完全释放。可能是因为我程序中还没加入FIN结束功能。当遇到这样的情况时,换一个TCP调试助手。

换用后,就能连接成功了。

欢迎交流、源码分享见****资源,笔者扣扣:1021100382