部分域名无法正常弹出portal问题解析
来源:互联网 发布:徙知徐州文言文翻译 编辑:程序博客网 时间:2024/04/29 10:26
1. 问题现象
前几天线上设备出现奇怪的现象,部分终端使用UC浏览器访问部分网站无法弹出portal或弹出portal比较慢,但是其他大部分终端访问却可以正常弹出portal,真是莫名其妙,到底是怎么回事?
2. 现象分析
刚开始本地尝试复现,但是一直没有出来,线上又不好分析,一度陷入了死局。
后来想起之前有遇到过浏览器云端加速导致访问异常的情况,所以就怀疑是浏览器云端加速导致的,所以立即进行测试
a. 使用UC浏览器,开启云端加速,果然portal无法弹出或弹出很慢,关闭后正常。通过抓包发现开启时,打开网站时,浏览器会主动向某些地址发送请求,端口是8081(我们是监控80端口进行弹portal的,8081请求,如果访问的域名或IP不在白名单中直接丢弃)。
b. 开启云端加速,将浏览器主动请求的地址加入白名单中,弹出portal正常。
这应该就确定跟云端加速时,主动访问其他域名非80端口时,报文被丢弃了,所以就让测试去搜集不同浏览器云端加速的域名了。
难道真的是这个原因吗?,如果你也这么想,那我们都是too young了!
另外一个同事,一直觉得不是这么简单,所以他后来又进行了深度的测试,详细分析了portal弹出失败时的报文,果然发现真的不是那么简单!
通过分析报文发现有两种情况:1)将云端加速访问的域名加入白名单后,访问时直接可以上网,不会弹portal2)关闭云端加速时,访问某个网站时,死活不弹portal
3. 解决方案
看到这里,你应该也会纳闷,怎么回事?
第一种情况:
之前我们测试只是加了一个IP,可能这个IP就只是用来探测连接的,真正数据通信使用的是另外的IP,所以加入后可以正常弹portal(这个需要具体分析下,Mark)。当把域名加进去后,域名对应的所有IP都正常访问,当你访问某个域名时,浏览器先向云服务器请求,云服务器再向这个域名请求,然后将返回的数据,返回给浏览器。因为云服务器都放行了,这时云服务器就像代理一样,你虽然没有认证过,但是数据都是走云服务器代理出去的,所以你就可以直接上网了。
针对这种情况该怎么做呢,这个暂时还没有方案,待详细分析下浏览器云端加速原理再说吧!
第二种情况:
通过仔细分析报文,终于发现原来是请求报文分片了,并且第一片数据是在ACK报文中的!代码中没有针对ACK携带数据进行处理,因为一般都是PUSH中才会携带数据。真是涨了见识,不过也暴露了自己对网络协议这块的生疏。
这种情况就比较好解决了,只需要添加针对ACK报文的处理了,但是总不能所有的ACK都处理吧!如果ACK没有携带数据,根本就没必要处理。那怎么判断ACK中有没有数据呢?
其实很简单,暴力点,就判断ip头总长度是不是大于40,如果是,就判断ACK携带有数据,如果不是,那肯定没有携带数据。修改后,测试,完美解决,搞定!
if (1==tcph->psh|| (1==tcph->ack && iph->tot_len > 40)) //判断IP头大于40,就断定ACK中携带有数据{ int ret = -1; struct httphdr* http=NULL; DCINFO("Reply ack.\n"); dc_reply_ack(skb,iph,tcph); http = kmalloc(sizeof(struct httphdr),GFP_ATOMIC); if(!http) { DCERR("Malloc failed."); return NF_ACCEPT; } ...}
至于第一种情况,后面详细分析下,再好好谈论下方案!
这种情况下不解决,会严重影响使用云端加速浏览器的用户体验!
- 部分域名无法正常弹出portal问题解析
- 无法解析域名的问题
- ubuntu无法正常解析php5 的问题
- 如何解决Linux无法解析域名问题
- 解决域名无法解析的网址问题
- 做Qinq后,portal上网出现故障,可以认证,可以上qq,但是无法打开一般网页(少量网页可以打开),但是ping网址的话完全没有问题,DNS解析也正常,同时PPPOE上网正常,无任何故障。
- 使用腾讯企业邮箱,部分邮箱无法正常接收邮件问题
- 无法解析域名
- Ubuntu 无法解析域名
- 新网好象挂了,中国20%的域名将无法正常解析
- 关于PHP mail函数无法正常解析HTML邮件问题
- IIS无法正常运行解析.net4.0的错误问题
- 嵌入式linux系统下无法解析域名问题
- 嵌入式linux系统下无法解析域名问题
- Perl 检测域名是否正常解析
- dns正常解析无法上网
- Linux服务器无法解析域名
- 解决树莓派连载路由器上后无法解析域名导致无法上网的问题
- Java基础第一阶段——04_Java语言基础_for语句&函数&数组
- 是不是100次面试就会有100次总结
- 高价收购一个CSDN账号
- delphi中输入框不能输入初数字意外的字符串的函数(IsNumeric)
- Git--branch分支的使用
- 部分域名无法正常弹出portal问题解析
- redis
- html5-03 CSS样式
- Windows下python Scrapy框架的安装
- 改进itoi函数
- 智慧北京:懒加载的ViewPager的实现
- Hibernate之SchemaExport
- 最短路径(1)--poj2387(Dij模板题)
- html-04 标签选择器