网络

作者: 王二姐李三娘 | 来源:发表于2016-09-28 00:12 被阅读0次

    跨网

    描述:比如联通网络用户访问移动网络的服务器,就等于跨网了。
    影响:跨网最明显的影响就是访问变慢

    跨网结算

    跨网访问,运营商涉及到流量结算的问题。比如联通用户的请求转发给了移动,相当于联通委托移动的服务器去干费力的事情,所以两方会有结算的问题。

    域名劫持

    描述:运营商通过技术手段将外部域名强行指向了运营商的IP
    原因:

    • 保证用户访问流量在本网内消化:为了保证访问质量,同时减少跨网结算,运营商在网内搭建了内容缓存服务器,通过把域名强行指向内容缓存服务器的IP,实现了把本地本网流量完全留在了本地。
    • 推送广告:替换网页内部的广告域名为自己的广告。除了域名劫持,推送广告的更高级方式是通过TCP链路劫持,在http报文中嵌入广告js达到目的。

    影响:

    • 运营商对缓存服务器的运维不稳定,导致用户经常访问异常
    • 运营商仅对http80端口做了缓存,其他端口请求或https会请求失败

    解析转发

    描述:运营商本身不进行域名递归解析,而是转发到其他运营商的递归DNS上的行为
    原因:一些小运营商为了节省资源
    影响:跨网访问。用户流量被导向了错误的IDC(可以理解为数据中心,服务器)。比如,qq针对北京移动和深圳电信有不同的分发服务器,但解析转发可能导致北京移动用户访问的是深圳电信服务器,也就是跨网访问,导致访问变慢。

    LocalDNS递归出口NAT

    描述:DNS服务器本身本身存在多出口,且配置了目标路由NAT,结果导致LocalDNS最终进行递归解析的时候出口IP有概率出错,不为本网IP地址。比如,DNS出口有移动、联通、电信,对电信用户请求来说,路由转发本来应该用电信IP的,但是出错了变成联通IP转发,导致解析结果使得用户被导向了错误的联通IDC,发生跨网。
    影响:跨网访问

    IP直连

    描述:直接ip请求
    作用:为了前面提到的可能出现的域名劫持、跨网访问等问题

    离线包

    背景:H5页面打开速度慢
    思路:H5资源预先打包本地,WebView访问本地资源
    内容:页面不常变化,主要是静态资源
    方案:拦截网络请求,加载本地文件
    拦截的方式有两种:

    • NSURLCache缓存层拦截,优点是速度快,因为webview优先访问缓存层
    • NSURLProtocol网络层拦截

    NSURLProtocol

    苹果提供的系统API,可以改变URL加载行为的全部细节
    子类化NSURLProtocol
    +canInitWithRequest: 方法如果返回YES,该请求就会被其控制;返回NO则直接跳入下一个Protocol,继续走原来的请求路径
    参考

    H5页面为什么走代理服务器

    原因:主要是为了方便调试
    描述:开发期间H5只会部署到测试环境,客户端调试的时候,打开H5代理开关,访问的时候走代理服务器(测试服务器)。如果不走代理,可以通过修改客户端的host达到目的,但明显不方便测试。

    免流

    接管NSURLProtocol,拦截当前的url请求,然后新建请求,免流用户的请求的是运营商的免流服务器,从而实现免流逻辑。

    QMFreeFlowManager

    - (void)showChinaUnicomWebView:(NSString*)url;联通订购流量包页面,url带上参数是否为联通用户

    - (void)backGroudCheck 设置后台任务,间隔24小时拉取一次订购关系;10分钟上报流量消耗;

    - (void)requestFreeFlowProtocol 请求免流协议,拉取订购关系

    - (void)onNotifyNetStateChange:(NSNotification*)notification 网络状态变化后的回调,在这里需要重新请求免流协议

    ChinaUnicomFreeFlowProtocol 免流协议,回调事件比较复杂待研究

    免流协议:

    • (void)requestFreeFlowProtocol;
    • (void)requestWangsuFreeFlowProtocol;
      免流IP: freeFlowIP
      免流端口: freeFlowPort

    切换免流服务器: switchFreeFlowServer

    记录免流数量: FreeFlowCount

    • (void)storeFreeFlowCountToFileIsAsyn:(BOOL)isAsyn;

    isForbiddenFreeFlow表示protocol请求是否允许免流
    如果forbidden为NO,真正cgi请求asi层实现的时候,判断如果是免流用户,会添加proxy,请求免流服务器,真正实现免流逻辑。

    联通专属逻辑

    ChinaUnicomFreeFlowManager
    -(void)startChinaUnicomFreeFlowProtocolWithPhoneNumber:(NSString *)phoneNumber 拉取用户免流订购关系,回调中会有重试逻辑
    -(void)onlyStartGetPhoneNumberProtocol 只拉取号码
    -(void)startGetPhoneNumberProtocol 拉取号码,成功后继续拉取免流信息
    -(void)reachabilityChanged:(NSNotification *)notification
    -(void)netChange 网络状态变化后,检测到网络恢复且在蜂窝网络情况下回重新请求免流协议,且只请求一次

    网宿专有逻辑

    WangsuFreeFlowManager
    网速是否漫游: isWangsuFreeFlowRoam

    大致流程

    1.app启动准备数据,QMFreeFlowManager开始initAction

    • 从userdefault中获取上次免流量的状态、手机号码;
    • 检查号码过期时间(30天);
    • 获取免流IP,先从userdefault中读取(为什么要有这一步?),再另开线程根据域名解析出ipstartGetHostIp(根据域名进行解析,两次解析不成功使用默认IP),最后把IP写入userdefault;
    • 拉取订购关系。联通启动ChinaUnicomFreeFlowProtocol,带上phoneNumber和UDID字段的值;服务器下发pw、状态码、phoneNumberURL、phoneIP等,并把pw、免流状态、号码、免流cell信息写入userdefault;网络回调事件中,如果没有号码或号码不对,蜂窝网络情况下会请求获取号码,会有重试机制;获取到号码后继续拉取订购关系。
    • 设置后台任务,间隔24小时重新拉取一次订购关系;间隔10分钟上报流量消耗;
    • 写联通免流量的数据到文件中
    • 启动上报上次的流量数据
    • 检测到网络断开又恢复后,尝试重新拉取订购信息,仅拉取一次

    获取号码的协议NetGetNumberProtocol

    2.cgi免流量

    • ProtocolBase getProcessedUrl 添加vkey、pno、sig、pw等参数
    • QQMusicNetBase forbiddenFreeFlow
    • ASIHTTPRequest ifUseFreeFlow setProxyHost setProxyPort
    • 请求联通免流服务器,代理转发请求至后台server

    3.webview免流量

    • NSURLProtocol拦截请求
    • 给url添加参数,实例化新的ASIHTTPRequest并组装头部,设置proxy
    • 请求免流代理服务器

    相关文章

      网友评论

          本文标题:网络

          本文链接:https://www.haomeiwen.com/subject/saztyttx.html