网络
原理
移动互联网的一个很大问题在于无线网络跟以前的有线网络不一样,无论是网络的组织形态、架构、通讯机制,跟有线网络都有很大差异.
首先,手机要通过无线网络协议,从基站获得无线链路分配,才能跟网络进行通讯。
无线网络基站、基站控制器这方面,会给手机进行信号的分配,已完成手机连接和交互。
获得无线链路后,会进行网络附着、加密、鉴权,核心网络会检查你是不是可以连接在这个网络上,是否开通套餐,是不是漫游等。核心网络有SGSN和GGSN,在这一步完成无线网络协议和有线以太网的协议转换。
再下一步,核心网络会给你进行APN选择、IP分配、启动计费。
再往下面,才是传统网络的步骤:DNS查询、响应,建立TCP链接,HTTP GET,RTTP RESPONSE 200 OK,HTTP RESPONSE DATA,LAST HTTP RESPONSE DATA,开始UI展现。
这几个问题的重点在于其中的几个连接点:
- 无线链路分配。这是一个物理实连接。
- IP层链接。这是一个逻辑虚连接。
- TCP层链接。这是一个逻辑虚连接。
- HTTP层链接。这是一个逻辑虚连接。
- 用户在线。这是一个逻辑虚连接。
在2G Edge网络下,差不多是1秒钟不传数据,就释放物理连接,回收给其他人备用。3G网络会延长几秒钟。
所以无线网络总体上有以下特点
- 秒级状态管理,秒级状态转换。这两个操作都在几百ms到几秒之间进行
- 对于维持连接来说时间太短,对于从无连接到有连接的转换来说时间又太长。
- 高延迟、高丢包.•2G网络上无线部分数据传输的延迟有几百ms,4G网络上无线部分传输延迟减少到几十ms,核心网状态转换、协议转换30~100ms,IP骨干网上的延迟又跟物理距离以及运营商互联互通质量有关,跨运营商50-400ms,同运营商5-80ms,这个还要取决于网络拥塞的情况.无线网络误码率比有线高两个数量级,在不同时间段的波动也非常巨大
- 网络接入环境复杂,可能通过2g 3g 4g wifi。
- 在中国,基础的移动网络环境并不好,而且我们有很多用户的访问是发生在地铁、公交车这样的移动环境下,移动基站的频繁切换进一步增加了网络的不稳定
工具
花瓶
利用Charles可以设置带宽、延迟等参数,模拟弱网络环境.不多解释
fiddle
我们可以通过fiddler来模拟限速,因为fiddler本来就是个代理,它提供了客户端请求前和服务器响应前的回调接口,我们可以在这些接口里 面自定义一些逻辑。Fiddler的模拟限速正是在客户端请求前来自定义限速的逻辑,此逻辑是通过延迟发送数据或接收的数据的时间来限制网络的下载速度和 上传速度,从而达到限速的效果。
监控
目前线上有针对某业务请求的网络监控
优化点
httpdns
- 防止域名劫持
- 更精准的调度.对域名解析而言,尤其是CDN域名,解析得到的IP应该更靠近客户端的地区和运营商,这样才能有更快的网络访问速度。然而,由于运营商策略的多样性,其推送的Local DNS可能和客户端不在同一个地区,这时得到的解析结果可能不是最优的。HttpDNS能够得到客户端的出口网关IP,从而能够更准确地判断客户端的地区和运营商,得到更精准的解析结果。
- 更小的解析延迟和波动.在2G/3G这种移动网络下,DNS解析的延迟和波动都比较大。就单次解析请求而言,HttpDNS不会比传统的DNS更快,但通过HttpDNS客户端SDK的配合,总体而言,能够显著降低解析延迟和波动。HttpDNS客户端SDK有几个特性:预解析、多域名解析、TTL缓存和异步请求
- .额外的域名相关信息.传统DNS的解析结果只有ip,HttpDNS的解析结果采用JSON格式,除了ip外,还支持其它域名相关的信息,比如端口、spdy协议等
- 终端测速
超时机制
连接超时时长过短,在低速网络上可能总是无法成功连接; 连接超时过长,又有可能导致用户长时间等待,用户体验差,有时候尽快失败重新发起一次连接会很快,这也是移动网络带宽不稳定情况下的一个常见情况.
应该做到的是根据用户是在2G/3G/4G/Wi-Fi的网络环境来设置不同的 超时参数,以及网络服务的并发数量。
2G/3G/4G网络环境对并发TCP连接的数量是有限制的,因此网络服务重要参数能够根据网络质量状况来动态设定对 性能和体验都非常重要。
最好可以测算到用户当前的网络RTT,根据RTT值来设置参数,那会更加准确。
缓冲
缓存获取到的数据,在一定的有效时间内再次请求可以直接从缓存读取数据
分为离线缓冲 和 在线缓冲。
协议优化
spdy & http2.0
减少发送内容
- 启动gzip
- 图片适配 根据原始图片 和 控件大小 网络情况,结合cdn特性,得到合适大小 质量 格式的图片
- 包头精简。目前蘑菇街app接口重发的数据很多
请求合并
即将多个请求合并为一个进行请求
- 比较常见的就是网页中的 CSS Image Sprites。
- 首屏数据合并请求为一个.
大文件下载
支持断点续传,并缓存 Http Resonse 的 ETag 标识,下次请求时带上,从而确定是否数据改变过,未改变则直接返回 304。
减少重定向
预取
- 预连接(连接池),建立长链接放入连接池,以后每次用直接取出使用。
- 预取数据、
- 预埋数据到本地。如可以在用户访问H5之前,将页面静态资源(HTML/JS/CSS/IMG...)打包预加载到客户端;用户访问H5时,将网络IO拦截并替换为本地文件IO;从而实现H5加载性能的大幅度提升
分优先级、延迟部分请求、依赖机制
- 将不重要的请求延迟,这样既可以削峰减少并发、又可以和后面类似的请求做合并.
- 由于网络对并发TCP连接的限制,就需要能够控制不必要的网络服务数量,可以通讯模块中加入了网络服务优先级和依赖机制。发送一个网络服 务,可以设置它的优先级,高优先级的服务优先使用长连接, 低优先级的就是用短连接。长连接由于是从长连接池中取到的TCP连接,因此节省了TCP连接时间。
- 网络服务依赖机制是指可以设置数个服务的依赖关系,即主从服务。假设一个App页面要发多个服务,主服务成功的情况下,才去发子服务,如果主服务失败了,上子服务就没必要再关心成功或者失败,会直接被取消。如果主服务成功了,那么子服务就会自动触发
并发控制
- 对于较大文件,如大图片、文件下载可考虑多连接。
- 需要控制请求的最大并发量,毕竟移动端网络带宽受限。wifi 4g 并发大些,2g 3g并发小些.
域名收敛
如图片域名可以全部收敛到某个域名,配合spdy使用效果好。
协议优化
- 关闭TCP快速回收
- Init RTO(超时重传时间)不低于3秒
- 初始拥塞控制窗口不小于10。因为大部分页面在10kB以下,很多请求在慢启动阶段已经结束,改为10可以降低 小页面资源传输时延。内容越大,这个选项的效果就比较不明显。
- Socket buffer > 64k
- TCP滑动窗口可变
- 控制发包大小在1400字节以下,避免分片
多协议并存
无论是TCP、HTTP、UDP、长连接、GZIP、SPDY、WUP还是WebP,每一种协议、方案都有其道理,没有最优,只有是否适合你的产品和服务特点,需要大家在运营过程验证和取舍。