TCP传输异常

  1. 系统说明

一个局域网中有一个ARM(firefly-rk3399)和一个PC,ARM是ubuntu系统,PC是windows系统,ARM和PC通过交换机相连。

PC上运行一个服务端程序,ARM上运行一个客户端程序。ARM通过TCP连接PC并发送数据。ARM发送的数据是周期性的,每隔8秒左右会发送一堆2~3M的数据。

  1. 问题描述

PC端收不到ARM发送的数据了,但ARM应用层显示自己还在正常发送数据。

PC会持续15分钟接收不到数据,而在此期间,ARM没有显示任何异常。15分钟后,ARM端提示TCP状态改变,ARM放弃了该TCP连接,重新建立一个新的TCP连接,PC能接收到该新连接的数据。

PC接收不到数据时,ARM和PC的网络都是正常的,ARM和PC能互相ping通。

更换不同的PC,ARM,交换机,问题都会存在。

对于同一套系统,该问题出现的频率基本均匀,有时平均1小时出现一次,有时半小时一次,有时半天才一次。

把PC端的程序换成网口助手,仍然有这样的问题。

  1. 网口抓包

在ARM端和PC端进行抓包,ARM端使用tcpdump,PC使用wareshark,多次抓包查看数据,情况都是一致的的。抓包情况如下,图中ip为41的是ARM,ip为2的是PC:

异常刚出现时:

ARM会收到PC发来的一个DUP ACK,然后ARM立刻应答了一个Fast Retransmission,该快速重传帧在上图中被wireshark识别为 out-of-order。(我逐字节对比过out-of-order帧和Fast Retransmission帧,二者完全一样。)

然后PC就一直发DUP ACK,ARM也会应答 Fast Retransmission,如下图:

持续一段时间后,ARM不再发送Fast Retransmission,转而发送 TCP Retransmission,但PC没有任何响应,如下图:

最后,ARM放弃该连接,重新建立了一个TCP连接,即上图中的SYN。

 

但并不是每次DUP ACK都会造成这种异常,如下图:

出现DUP ACK后,通讯能恢复正常。

 

PC端的抓包结果和ARM端的抓包结果一致,即ARM发送出的数据包,PC都能收到。

将ARM端程序改为以下简单的发送程序,server端使用网口助手,仍然有相同的问题:

抓包结果如下,ARM的ip为15,PC的ip为65:

最后的FIN是PC端关闭程序了。

 

疑惑:

为何PC不能正确处理Fast Retransmission?

为何最后的TCP Retransmission都没有响应?

如果说是网络的问题,那为何PC端的wireshark能抓取到所有数据包?

同样的程序,在ubuntu PC上运行就没有问题.

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值