ecn导致的数据包重传

By | 2017/07/27

首先说下环境,应用是基于tcp的socket自定义协议传输数据,原来平台部署在windows 2003上,一直也算正常,只不过3个月左右的一次socket出问题,所有的通信都会被拒绝。原因未知,猜测系统问题。

后来系统升级,直接换成了windows 2012,这下好了,2周左右一次的业务故障。不过这个故障的根本原因还是在于用应用程序没有处理好,子系统往主系统传数据的时候,主系统有基于数据库的唯一索引。问题就在主程序上,按说数据批量上传,要么全部通过,要么全部拒绝,要么返回哪些没处理成功。但只是简单的返回一个处理结果,子系统无法判断那些处理失败了。而子系统也有问题,失败的可以跳过就别传了啊,子系统还傻傻的重复传。结果就是主系统数据混乱,子系统数据被卡住。

开始基本上一月一次,也可以忍受,不过最近3天一次实在受不了。但改程序的可能性微乎其微,而且要命的是两套系统的日志死活无法输出,这样也分析不了出现问题的原因。

唯一的办法就是数据库抓包了,之前用cmd开了一个抓包窗口,抓了大半个月都没问题,刚关了就又出现了……哭……

再次用wireshark抓包,目测有很多黑色背景错误,主要有三种,一种是ack回复没收到,一个是丢包,另外的一种就是数据重传了。

网络是千兆直连的,不应该出现丢包的情况,但是系统为啥要重传数据包呢,这个不是我可以分析的。不过突然想到了应用出现问题的原因,因为网络是没问题的,所以不会存在丢包,那么主系统一定会收到两个同样的数据包,而系统对两个数据包都进行了处理,这就导致了异常,从而把系统挂住了。

唉,又是一个坑,很奇怪的是重传的ecn信息是不一样,暂时没有深入了解ecn,直接关闭试试,命令如下:netsh int tcp set global ecncapability=disabled

再继续抓包,已经没有了数据重传的现象,说明问题解决。接下来就看应用问题是否还好再出现了,如果不出现真的是命好啊,哈哈。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据