SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3

最近系统升级之后遇到了一个奇怪的问题,有时候做ajax提交的时候loading框一直显示着,不会消失,手工把框关了,再提交一次就正常了。在ie11下用开发人员工具调试,发现出这种现象的时候http请求很快就中止了,控制台会出现“SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3”。

开发和测试的时候都没遇到过这种现象,所以怀疑和升级环境里用的双机有关(开发测试用的都是单机,出问题的环境是双机,用LVS作的负载均衡)。于是就在升级环境做了一些测试发现不用LVS确实不会出问题,用了LVS哪怕双机只起一台都会出问题。于是请同事看了下vip没发现啥问题(因为好几个系统vip都是用的这个LVS,我这个系统也没有啥特殊配置);不知道怎么处理于是就用firfox再测测,发现用它正常。这下更迷惑了,到底是LVS的问题还是IE的问题?

一时无法确定,一度怀疑jquery form提交的问题,经测试排除。后来又找同事看LVS,写脚本定时看活动连接,发现出异常的时候从LVS看不到活动连接,于是怀疑请求就没有发给LVS,然后就在pc上抓包,发现出异常的时候有时候抓不到请求,可是有时候又能抓到,分析抓包的数据,排除了一些干扰(包重组、顺序不一致等),又复习了下tcp协议连接建立和关闭的过程(什么syn、ack、fin),发现是LVS把连接关了,又找同事来看,发现与LVS的一个参数tcptimeout有关。

这个参数是设置tcp连接的空闲时间的,超过这个时间的空闲连接会被关闭,设置的是30秒。由于http1.1默认使用的是tcp长连接,所以ie在下一次请求的时候会试图重用上一次的连接,由此当到30秒LVS将连接关闭而IE还不知道的时候,他去重用连接进行请求就会出错。而firfox为什么没有出错呢?抓包发现firfox会每隔10秒发送一个tcp keep alive的包(在win8.1下是这样;后来我在xp虚拟机上测试的fiefox不会发这个包,导致和ie一样会出异常)。

由于这个LVS是好多系统在用,我们也不能随便改参数,因此我们就在页面上用js每隔10秒发个请求,使LVS知道连接还在使用,不去把它关闭(这个解决办法在ie11+win8.1上完全ok,但是在xp虚拟机+ie8的环境下有时候还出异常,但是抓包看连接很正常,不知为何)。

另外查了一下,ie默认的连接空闲时间是60秒,超过60秒就会主动把连接关闭。所以如果把LVS的参数改的很小,或者改大超过60秒,应该都能解决这个问题。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。