标签:-o 死循环 网络连接 play rda httpd 策略 important tls
http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87%E4%B8%8AHttp-2-0/
问题:App上的菊花一直在转消失不掉。
原因:okhttp3.4.1在http2.0下使用了被关闭的连接,导致出现无限循环。在http code!=200时,重连,没有结束死循环导致的。
解决:在http code!=200时流为关闭的情况下,连接意外中断触发了这个死循环,避免文件的简单有效的途径是http code不论多少,直接关闭。
https://mp.weixin.qq.com/s/N16jX2zRT3mlaJF4ixDhMg
HTTP/2与HTTP/1.X的区别
Android客户端基于HTTP/2协议之上的优化
兼容HttpDns方案
客户端统一接口和图片的HTTP/2网络请求适配了自研HttpDns服务,避免了运营商LocalDNS解析劫持,提高了用户解析成功率,同时也加快了服务器解析切换的生效时间,减少了故障影响范围。
Android原生网络接口HttpUrlConnection不支持HTTP/2协议,客户端网络模块可以继承Square公司开源的网络组件OkHttp,OkHttp组建原生支持HTTP/2协议,然而在兼容HttpDns服务时,需要解决如下几个问题:
(1)URL中host替换为HttpDns的IP后HTTP/2协议转换:authority字段修正
HTTP/2协议RFC文档中采用:authority字段代替HTTP/1.X Header中Host字段,Okhttp未在V3.6.0版本之前做两个字段之间的转换,导致nginx服务器取不到正确的authority字段,无法实现请求转发。
网络模块接入HttpDns将请求URL中的Host字段替换为HttpDns下的IP,然后在Header中增加Host字段,这样可以保证后台nginx服务器能正确转发请求。
(2)URL中host替换为HttpDns的IP后SSL/TLS握手初期SNI字段修正
SNI(Server Name Indication)是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。工作原理就是在连接到服务器建立SSL/TLS连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的证书。
由于SNI的传递过程是基于传输层(TCP)层,所以如果基于HTTP协议层的Header字段带Host是不能生效的,这里对Okhttp的Sni传递流程做了改造,将Sni参数从应用层透传到传输层,从而解决了Sni从现有URL中解析出来为服务端无法识别的问题。
(3)HTTP/2长连接简历握手过程中网络域名校验问题修正
域名校验是Https握手过程中验证证书有效性的重要环节,目的是为了验证服务端下证书颁发机构的合法性,如果简单忽略掉域名校验,将会给中间人可乘之机。
Okhttp的握手过程Host是从URL中解析出的,如果URL中的Host被HostDns的IP地址替换,Https握手校验过程将会失败,这里也是通过对OKhttp传输层握手过程进行改造,透传了正确的Host字段,适配了HttpDns IP直连这种场景。
客户端HTTP/2长连接管理优化
问题:应用长期在后台后切换到前台或者手机长时间休眠后唤醒应用有加载超时的现象。
分析:客户端需要保持定期的网络长连接链路,而Android系统版本迭代过程中随着系统对耗电量及流量的管理越发严格,会在休眠或者Idle过程中在系统级关闭网络连接,未能及时通知应用层连接已经断开,导致网络请求超时,超时请求等待时间过长,用户体验极差。
改善:为了改善长连接丢失后的请求超时情况,客户端针对Okhttp新增Ping帧心跳机制,流程如下:
(1)客户端基于HTTP/2协议进行网络通信,HTTP/2从底层实现了多路复用,多个请求共享一条链路进行请求,当客户端处于空闲状态时,链路依然保持存活。
(2)实现固定时间间隔发送Ping帧给服务端,如果服务端能在规定时间内返回结果,则继续下一轮心跳。
(3)一共心跳n(n为服务端发送心跳次数)次之后,如果仍然处于idle状态,则主动发送Goaway帧给服务端释放连接,然后释放本地连接。
(4)如果在n次心跳周期内检测到某次心跳超时,则直接释放本地连接,下次请求时重新发起请求。
标签:-o 死循环 网络连接 play rda httpd 策略 important tls
原文地址:https://www.cnblogs.com/zhangmiao14/p/9308858.html