网络

跨网

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

跨网结算

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

域名劫持

描述:运营商通过技术手段将外部域名强行指向了运营商的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
  • 请求免流代理服务器
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 1. 基础知识 1.1 3种常见的计算机体系结构划分 OSI分层(7层):物理层、数据链路层、网络层、传输层、会话...
    Mr希灵阅读 19,877评论 6 120
  • 一、背景如何度量和模拟“弱网络”对移动APP的开发有着重大的意义,比如:节约测试成本、易于问题重现、加快产品上线等...
    贝勒老爷阅读 2,036评论 0 17
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,734评论 0 10
  • 前段时间很流行时间管理,有很多时间管理的好方法,但时间管理的前提,是精力管理。因为只有当一个人精力充沛的时候,他才...
    chloemin阅读 179评论 0 1
  • 最近在看《大秦帝国——崛起》,很多地方不满意。比如,为什么秦国就这么强盛?也许是我没有看过第一部的原因,但我认为即...
    Edward76Lee阅读 510评论 0 0