HTTP 什么时候重新建立TCP连接

xiaocao000 发布于 2013/11/04 17:09
阅读 1K+
收藏 1

客户部署的线上AEMS系统发生一个诡异的问题.

 说下环境, 客户的系统部署于客户内网环境, 在外网网关做了端口映射, 客户使用的是贵州电信的网络; 公司使用的是浙江联通的网络. 

问题的现象: 客户处可以正常访问系统加载数据, 但在公司通过外网访问, 可以访问系统, 其他页面都可以正常加载数据, 但企业信息配置的因子配置界面, 却无法加载因子数据, 导致在公司这边没法正常查看以及配置企业因子数据.

该页面有发出三个Ajax请求到AEMS系统,  但只有第一个GET请求正常响应返回 200 OK, 后两个AJAX请求很诡异的没被响应, 通过Chrome调试, 发现其请求的type是"Pending", Status Text 是 "failed", 诡异就诡异在, 后两个AJAX请求,服务器端应用系统根本就没有收到(通过服务器端AEMS应用在Controller层的打印日志, 以及通过远程Debug都可以证明这一点).

一开始怀疑是AJAX发送GET请求的URL过长, 察看了下字符数, 有175个字符, 不放心, 就将请求类型改为POST测试, 可是问题依旧, 看来不是这个原因.


 

再仔细想想, 该问题, 同样的代码同样的逻辑, 在公司开发环境都是正常的, 在客户现场的环境, 也是正常的. 但惟独通过公司的网络访问客户现场的系统, 会出现Ajax请求失败, 数据无法加载. 那会不会是公司与客户环境之间的网络有问题呢? 

 

网上查下资料, 在linux下使用tcpdump可以抓到http协议包,可以使用工具wireshark分析查看tcpdump抓到的http包。(wireshark软件在 http://sourceforge.net/projects/wireshark/ 下载)。


①tcpdump 抓取HTTP包
# tcpdump -s 0 tcp port 80 -w /root/tcpdump.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C576 packets captured
576 packets received by filter
0 packets dropped by kernel

② 使用wireshark分析
使用wireshark的File--->Open菜单打开该文件,即可直观地看到通信包细节。



 

其中 124.160.225.218 是浙江联通的网关. 这个抓包结果显示是浙江联通网关主动对AEMS应用服务器发送TCP RST/ACK包关闭TCP连接所致. 

那么, 为何联通网关会主动发送RST/ACK关闭TCP连接呢, 我这要如何处理, 才能让浏览器正常完成HTTP AJAX请求获取数据呢.? 


加载中
0
好威支有希
好威支有希
不带任何参数的请求会出现什么情况?
0
好威支有希
好威支有希

是不是post的数据有什么敏感词?比如用不带https的google搜索【学习】【胡萝卜】等词会被电信重置连接!不过如果服务器在国内,不应该出现这样的问题啊!
ps: lz的问题描述详细到位,让别人有回答的欲望,赞一个

0
小熊猫大暴走
小熊猫大暴走

引用来自“極客”的答案

是不是post的数据有什么敏感词?比如用不带https的google搜索【学习】【胡萝卜】等词会被电信重置连接!不过如果服务器在国内,不应该出现这样的问题啊!
ps: lz的问题描述详细到位,让别人有回答的欲望,赞一个

嗯,楼主提问问题,图文并茂,讲述仔细,条理清楚,值得大家学习.
0
星爷
星爷
http://stackoverflow.com/questions/3262473/check-pending-ajax-requests-or-http-get-post-request
0
昏鸦
昏鸦
这个要看你设置的参数了,还有事http1.0 还是http1.1 的协议了
0
xiaocao000
xiaocao000

引用来自“極客”的答案

是不是post的数据有什么敏感词?比如用不带https的google搜索【学习】【胡萝卜】等词会被电信重置连接!不过如果服务器在国内,不应该出现这样的问题啊!
ps: lz的问题描述详细到位,让别人有回答的欲望,赞一个

很感谢你的热心回答 . 因为这个问题纠结了几天了, 查了很多相关资料, 虽说大概定位到是什么原因, 可还是没有解决办法. 敏感词什么应该是没有的, post的参数也只有企业编号, 不过因为是JSON对象, 带有引号以及大括号这类字符, 已经被编码了. 不带参数的时候, 是可以得到AJAX返回的, 但是当然是没有数据的.
0
xiaocao000
xiaocao000

引用来自“huaye2007”的答案

http://stackoverflow.com/questions/3262473/check-pending-ajax-requests-or-http-get-post-request
很感谢你的帮助 . 我也尝试了使用setTimeout来延迟发送AJAX请求, 以免前一个请求对后两个请求有影响, 可是貌似问题依旧. 问题主要是, 后两个AJAX请求花在等待的时长超过120ms, 我想这才是联通网关主动发出RST/ACK断开TCP连接的主要原因呢.
返回顶部
顶部