WiFi连不上,啥情况?
iOS升级9.3.1后,你的WiFi就是连不上
啥原因呢,网管说没问题,设备没问题,一脸懵逼的你不知道咋回事……
情况是这样的,在连接时,需要登录验证,这时候会弹出一个Portal页面,iOS9.3.1 系统就会无法弹出或者弹出慢及WiFi闪断等情况,最终就是连不上WiFi~~~呵呵呵。
专家解释如下说:通过地抓包分析,发现升级后的iOS连接WiFi可能会出现Portal页面无法弹出,这就连不上了;除此之外,如果iOS系统安装了Wi-Fi伴侣类似的APP,也会受到影响,导致Wi-Fi无法连接。
情况了解了,该怎么解决呢?
一、白名单
第一种,添加嗅探报文白名单,放行iOS嗅探请求,保证Wi-Fi正常连接,解决上述问题,但是Portal页面无法自动打开;
二、报文仿冒
对iOS嗅探报文进行仿冒,当第一次嗅探请求时,设备直接仿冒评估服务器回复请求,保证Wi-Fi正常连接,解决上述问题,但是同样Portal页面不会自动打开;
三、嗅探报文后仿冒
第三种,与第二种类似,对后续的iOS嗅探报文进行仿冒,当重定向页面打开后,再对其进行仿冒回复,使得Portal页面可以自动打开,且Wi-Fi能够正常连接。,但是这种方案无法解决上述第一种锁屏再打开连接网络的问题。
(说明:第三种方案无法解决锁屏再打开连接WiFi的问题,因为出现这种问题时,IOS 9.3.1版本的终端无法自动打开Portal页面,Wi-Fi自动断开,无法再次发送嗅探请求)
目前,这这种情况下,设备端可提供三种种解决方案。从上述三中解决方案来看,建议选择第一或第二种方案进行合理规避。
本文主要是针对iOS 9.3.1 更新后WiFi无法连接的情况进行分析说明和提供解决办法,下面是主要介绍。(感兴趣请自助阅读)
问题分析
在提供公共Wi-Fi时,需要经过认证。举个例子,某A想上免费的WiFi,首先他选取某个SSID,这时候想要正常访问Internet,就需要打开任意网页,这时候系统跳出来一个登陆界面,用户使用账号或其他方式认证登录后就能自由访问网络,否则无法上网( ᖛ ̫ ᖛ )。我们把这一应用场景称为Captive Portal。
一、iOS HotSpot Detect 功能
iOS系统对于Captive Portal提供了一种Wi-Fi热点探测机制,在接入无线网络后,会自动检测网络是否允许通过。若网络不通,则自动弹出一个网页,尝试让用户登录。这种功能就是CNA,即Captive NetworkAssistant。其原理如下(9.3.1版本):
1)iOS终端接入无线网络时,终端会向苹果服务器主动发送一个网络嗅探请求,地址为http://captive.apple.com/hotspot-detect.html,该请求按HTTP 1.0协议发送,且User-Agent关键字为CaptiveNetworkSupport;
2)如果地址可达,则苹果服务器会返回一个成功页面,地址为http://www.apple.com/library/test/success.html,
iOS终端收到此页面后,会显示Wi-Fi标志,表示网络可达。
3)如果地址不可达,如IOS终端接入具有Portal机制的无线网络,设备会对第一次的探测请求回复重定向,收到回复发现不是服务器的成功页面,此时IOS系统会判断该网络是Captive网络,从而打开内部浏览器,再触发一次地址为http://captive.apple.com/hotspot-detect.html的嗅探请求,该请求按HTTP 1.1协议发送,且User-Agent关键字为Mozilla。设备对于这次请求同样进行重定向处理。
4)iOS终端收到重定向请求后,访问重定向地址,打开Portal页面,用户在打开的portal页面上认证登录后,设备放行,IOS终端Wi-Fi标志显示;若此时用户关闭该Portal页面或跳转到其他应用,则WI-FI断开,无Wi-Fi标志显示。
注:IOS9.3.1版本嗅探的请求地址固定为http://captive.apple.com/hotspot-detect.html,早期版本(IOS8.2版本为例)嗅探的域名有www.appleiphonecell.com,www.ibook.info,www.itools.info,www.airport.us等,但嗅探报文的机制与User-Agent关键字一致。
二、 无其他应用影响时无法弹出Portal页面问题
本地测试IOS 9.3.1版本终端连接WI-FI网络时发现,有时在连接Captive网络时,有几率出现IOS终端无法自动弹出Portal页面(或者出现弹窗动作,但页面一闪而过),且Wi-Fi无法再连接的情况,特别是在用户锁屏再打开进行Wi-Fi进行自动连接时,该问题有较大概率出现。出现问题时,抓包如下图所示:
按抓包情况所示,IOS终端正常发送了两次嗅探报文,也设备也正常进行了重定向回复,但是第一次嗅探与第二次嗅探间隔时间近30秒。
结合终端操作发现,若用户原来已连接过一个Captive无线网络,当用户锁屏后,Wi-Fi经过一定时间断开,在用户再次打开手机屏幕时(屏幕点亮即可),iOS会自动搜索已连接过的WI-FI网络,并触发一次嗅探操作,如图中第一次嗅探请求;
但是若此时用户打开浏览器,或进入设置页面进行Wi-Fi热点选择的操作,IOS系统是不会自动触发页面弹出,经过一段时间(图中30秒后),若用户打开浏览器或进入Wi-Fi设置页面,IOS终端才会触发第二次嗅探操作,并尝试打开Portal页面,如图第二次嗅探示,但是在IOS9.3.1版本中,一旦出现这种类型的操作,Portal页面无法正常打开,通常会出现Portal页一闪就关闭的现象。由于Portal页面无法打开,用户也无法认证,Wi-Fi就会自动断开,导致连接Wi-Fi失败。而在iOS 8.2版本中,进行同样操作,Portal页面能够正常开,用户认证成功后,Wi-Fi标志能够显示。
iOS9.3.1版本除了锁屏打开存在上述问题外,用户在IOS设置页面打开Wi-Fi功能,手动选择Wi-Fi后,若在IOS触发第二次嗅探前切换到桌面或进入其他应用,当等待一段时间再进入Wi-Fi设置或浏览器,也会出现Portal页面无法弹出的问题。
三、存在Wi-Fi伴侣等APP时Wi-Fi连接问题
HotSpot Helper指某些IOS的应用可以通过对应的Helper接口注册成为HotSpot助手从而参与Wi-Fi网络的接入处理
例如Wi-Fi伴侣,通过IOS的API注册成为HotSpot Helper,当用户手工点击接入一个Wi-Fi后,如果是一个Captive网络,则IOS会向它发送一个消息,告知此网络需要认证。Wi-Fi伴侣收到此消息后,会执行一些认证相关的操作,若认证通过,则说明此网络的认证服务由此APP提供。
iOS状态机如上图所示,具体可以参考:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/Hotspot_Network_Subsystem_Guide/Contents/AuthStateMachine.html#//apple_ref/doc/uid/TP40016639-CH2-SW1
参照IOS HotSpot状态机,终端连接网络后有以下流程:
1.终端连接Wi-Fi网络;
2.IOS系统判定是否是Captive网络(通过第一个嗅探报文判定是否是需要认证的网络),进入评估状态;
3.评估并选择“best”HotSpot助手,若助手存在则进行认证流程处理,超时时间45秒,进入认证状态;
4.若HotSpot助手存在,则会判定是否需要用户输入处理;
5.认证处理结束,进入已认证状态,显示Wi-Fi标志;
从上述流程可知,若IOS系统存在如Wi-Fi伴侣等HotSpot助手,则在判定为Captive网络后,若Wi-Fi助手被评估为“best”HotSpot Helper,则由其负责后续的认证流程处理,在45秒内不会再发送第二次嗅探报文,也就不会自动打开portal认证页面。
因此,在这种情况下,若Wi-Fi助手认证失败,则IOS无法连接Wi-Fi,45秒超时后才有可能重新触发第二次嗅探请求,导致IOS系统Wi-Fi连接失败或Portal页面推出慢的问题。
目前,这这种情况下,设备端可提供三种种解决方案。
1)添加嗅探报文对应的域名为白名单,放行IOS嗅探请求,保证Wi-Fi正常连接,解决上述问题,但是Portal页面无法自动打开;针对不同的IOS版本,添加的白名单如下:
captive.apple.com ;
www.appleiphonecell.com;
www.ibook.info;
www.itools.info;
www.airport.us;
www.thinkdifferent.us
2)对IOS嗅探报文进行仿冒,当第一次嗅探请求时,设备直接仿冒评估服务器回复请求,保证Wi-Fi正常连接,解决上述问题,但是同样Portal页面不会自动打开;目前可以在设备侧通过在webserver下配置captive-bypassenable命令实现,具体流程图如下:
3)与第二种类似,对后续的IOS嗅探报文进行仿冒,当重定向页面打开后,再对其进行仿冒回复,使得Portal页面可以自动打开,且Wi-Fi能够正常连接,但是这种方案无法解决上述第一种锁屏再打开连接网络的问题(出现这种问题时,IOS 9.3.1版本的终端 无法自动打开Portal页面,Wi-Fi自动断开,无法再次发送嗅探请求)。这种方式可以在设备测通过webserver下配置captive-bypass optimizeenable命令实现,具体流程图如下:
fuck\fuck\(\)\[\]\\\/\fuck”\\$1″fuck\/script>’)} fuck