TCP性能测试与问题分析(进阶)

TCP性能测试与问题分析(进阶)

 

当TCP的传输速度提高和测试方法增加后,出现了许多tcp问题,设计中对遇到的比较有针对性地问题记录如下,并给出实际地解决方案和过程。

目录

问题1TCP&UDP助手和快速TCP发送的性能分析(初步)

问题2:特殊情况下的TCP检验和出错

问题3TCP测试助手性能受限问题

问题4TCP接收测试死机,无ACK回应问题

问题5:快速发送模式时,FPGA回传PSH数据出错。

 

 

问题1:TCP&UDP助手和快速TCP发送的性能分析(初步)

描述:TCP助手在接收数据时,处于延迟ACK模式,只有接收到2帧TCP数据时,才立即回复ACK。否则,在接收单帧数据时,必须等200mS才回复ACK。

因此,要测试TCP速度,必须在FPGA程序中实现累计Seq发送机制,即连续发送2帧TCP数据,再判断ACK接收情况。

为此,再次重新设计了TCP接收状态机,并加入超时重传和ACK错误重传。加入超时重传4次,执行RST复位等,完善的功能。

测试结果如下,当启动回传测试命令后,分析发送速度如下。虽然很慢,但算是突破性的一步。

继续分析后面的接收数据,得到如下结果。

见图中分析,结果很不错。此数据保存为:TCP快速测试-问题1的分析对应结果.pcapng

 

问题2:特殊情况下的TCP检验和出错

描述:发送测试中,当TCP校验和出错时,引发重传,但是TCP校验和就是错的,导致一直重传。并最终引起FPGA发送重置帧,而断开连接。

现象如下,不止一次出现,多次测试,都是因为这个问题而导致RST。不然,可预计,发送测试可继续顺利进行下去。

如下图所示,考虑到手动用计算器算校验和,实在是太麻烦,前面饱受手算的摧残。然后再网上找了很久,找到了如下右边的计算工具。实际测试了,可以用,虽然比较难用,注意事项已在图中说明。下载链接:https://download.csdn.net/download/feillow/914693

通过如上图,一步步细心整理,得到计算结果:FFF6!果真是我程序中设计的TCP校验和有误!

真是尴尬。很多问题这是不测试不知道,一测试(使用)吓一跳。这个问题,我大概猜到原因:应该是循环加的时候,在特殊情况下出错了!

为了全面验证计算校验和的细节,再次进行了手算,过程如下。找到问题所在!因此,在FPGA程序中,要考虑两次进位的情况!

因此,对程序中,所有计算校验和的地方如下,都进行了2次循环进位加,以确保不会出错。

 

问题3:TCP测试助手性能受限问题

从问题1,已经详细分析了TCP&UDP助手的性能,实在太差。最佳解决方案是,自己编写一个客户端,实现自定义的、灵活的TCP接收器。但还有一个方法,就是网上寻找,希望能找到一个合适的、功能强大的TCP测试工具。

经过大量寻找,在CSDN资源上挺多,但是层次不齐。

方案1:继续寻找,一直找到一个合适的。

方案2:寻求同学帮助,让其帮忙写一个针对我的设计,开发的上位机。

 

问题4:TCP接收测试死机,无ACK回应问题

如下图,在连续发送很多次TCP数据后,会出现FPGA无ACK响应的问题。

经过分析,此种情况下,FPGA端已经“死机”,程序已经跑飞。真的惨。

这个问题就很难了,因为在前面几百次的传输中都是正常的,直到某个时候,FPGA就跑飞了,很难定位到问题。因此,也不好确定具体要优化FPGA内部哪里的程序。

方案1:将发送时钟统一成上升沿发送。--已实现,但仍会出现跑飞。

方案2:将关键TCP控制状态机,改成三段式。--待改进中。

测试中,若采用慢速的向FPGA发送,则不会出现上述错误。所以问题,很可能在于FPGA跑飞了。

 

问题5:快速发送模式时,FPGA回传PSH数据出错。

截图如下,本来是正常传输状态,应该继续发送数据,但是FPGA端出错,发送PSH被“截断”,导致序号、长度等全部出错。从而导致传输中断。

优化发送状态机,分析整个发送流程,一定要把这个问题找出来!

PS:利用其它TCP助手测试,对比结果,排除是否是测试助手的问题。

使用心得TCP助手测试,结果如下。也出现了同样的问题,因此,可以排除,不是助手的问题,问题就出在FPGA程序上。我的天呐!

再换了一个客户端,测试也是一样的问题。所以,问题确定在FPGA端!

因此,现在的问题重心,在于梳理状态机,试试改成三段式状态机。

 

可能原因:

1,可能tcp_rx_done与tcp_req_tx_data1冲突,所以先执行tcp_rx_done,而忽略tcp_req_tx_data1执行了。

实际情况是,执行了PSH,但是没有尾部数据!

2,推测出了可能问题地方:tcp_rx_done与tcp_req_tx_data1相争夺,导致后续控制不对。采用三段式状态机便可解决这个问题。对TCP_TX采用。

3,就是tcp_rx_done来的时候,tx状态还没到d0,导致没有正确接收到tcp_rx_done。所以,把每个标志都改成回环确认形式。

就是要解决:能同时执行发送和接收,并使它们不冲突。

后续工作尚多,还需不断地进行验证和测试。

 

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章