外网访问系统无法加载数据问题

客户部署的线上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连接所致. 好吧, 遇到GFW了.

网上查阅相关资料, 找到这么一篇: 几种TCP连接中出现RST的情况

http://www.360doc.com/content/13/0702/10/1073512_297069771.shtml

分析上面的TCPDUMP抓包结果, 问题的原因估计就是单次的TCP连接请求达到100毫秒, 联通网关认为TCP连接已经超时, 主动发送TCP RST/ACK 指令关闭了到AEMS服务器的TCP连接, 导致后续响应无法进行.

那解决的思路, 无非就是尝试下缩短单次的TCP请求时间. 在AEMS应用这边, 可以考虑网页压缩(图片/JS等), 分多次请求, 减少单次请求的数据量等. 

 ====================================================

附几篇对解决该问题有帮助的大神的链接:

TCP连接:SYN ACK RST UTG PSH FIN 

http://blog.163.com/sgoingfuture1211@126/blog/static/167746049201071633524363/

从TCP协议的原理来谈谈rst复位攻击 

几种TCP连接中出现RST的情况

http://www.360doc.com/content/13/0702/10/1073512_297069771.shtml

相关推荐