本系列文章引用了腾讯技术专家樊华恒《海量之道系列文章之弱联网优化》的部分章节,感谢原作者。

1、前言

随着移动互联网的高速发展,移动端IM以移动网络作为物理通信载体早已深入人心,这其中的成功者就包括微信、手机QQ、支付宝(从即时通讯产品的角度来看,支付宝已经算的上是半个IM了)等等,也为移动端即时通讯开发者带来了各种可以参考的标杆功能和理念:语音对讲、具有移动端体验特性的图片消息、全时在线的概念、真正突破物理体验的实时通知等。

上述IM产品、功能和概念,在开发者间讨论时,无一例外都会被打上“移动端”这个特性,从网络通信的角度来说,这个特性的本质可以认为就是移动网络的特性。

以文件发送为例,传统的PC端IM(可以简单地理解为传统有线网络上的IM)可以直接实时点对点发送(理论上无需经过服务器中转)。

但在移动端IM里我们并不能这么干,原因是:

  • 1)3G/4G/5G网络下P2P成功率并没有那么高(因为是对称型NAT,详见《通俗易懂:快速理解P2P技术中的NAT穿透原理》);
  • 2)移动网络的信号跳变、抖动很难预测(甚至在你转身的瞬间,信号可能会立马由强变弱);
  • 3)移动网络的延迟、丢包、重传等导致通信体验很差(就像从国内访问国外的网站那种“慢”,体验上是相似的);
  • 4)延迟、丢包、重传带来的另一个后果就是电量消耗、流量消耗过大,这些都是不可接受的;
  • 5)智能手机(主要是Android、iOS)的系统省电策略,导致网络可能被阻断,甚至进程被杀死,功能没办法在后台继续工作。

所以,正是移动网络的这些特性,使得原本在传统PC端再普通不过的功能(比如上面说的文件发送),在移动端IM中却不得不另想办法:以文件发送为例——主流的移动端IM现在都是使用服务器中转来搞定的。使用类似技术实现的功能,还有移动端IM里语音短消息的AMR音频小文件、图片消息的图片文件等。

那么回归到本文的正题:移动网络为什么会存在“弱”和“慢”这样的特性?

这个问题网络工程师来回答最为合适,对但于应用层的程序员来说,有关移动网络的理论太生涩枯燥,太难理解了。而对于网络工程师来说,他们也不理解“你们这些程序员到底在纠结移动网络的什么鬼?”。

就像黄品源的那首《那么爱你为什么》的歌曲里面莫文蔚的一段念白:“我讲又讲不清,你听又听不懂......”。这大概是应用层程序员很难能找到通俗易懂的有关移动网络资料的原因吧。

所以本文的目的,就是希望以通俗易懂的语言,帮助移动端IM开发者更好地理解移动网络的各种特性,使得开发出的功能能更好地适应移动网络,给用户带来更好的使用体验。

另外,《现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》这篇文章也提到了本文所阐述的相关内容,强烈建议阅读。

学习交流:

- 即时通讯开发交流3群:185926912[推荐]

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

(本文同步发布于:http://www.52im.net/thread-1587-1-1.html

2、系列文章

▼ 本文是《移动端IM开发者必读》系列文章的第1篇:

如果您是IM开发初学者,强烈建议首先阅读《新手入门一篇就够:从零开发移动端IM》。

3、相关文章

1)关于网络通信的基础文章:

2)涉及移动端网络特性的文章:

4、正文引言

移动互联网颠覆着我们的生活方式,这个每时每刻伴随着我们的网络到底有哪些特点,又是如何影响我们接入信息世界的体验呢。

以下场景如似曾相识,敬请对号入座:

1)上班路上收到朋友分享的一张美女图片,缩略图目测衣服用料相当节俭,立马兴奋点开欲详细钻研,却发现怎么脱也脱不下来,不对,是“拖”不是“脱”,仰望苍天,欲哭无泪。

2)进电梯前收到女友一条消息:“你到底爱不爱我!”,当然马上回复“必须的必!”,电梯门关闭了,北风那个吹,菊花那个转,等到春暖梯开,满屏都是女友的问候“在吗!”、“这都要想那么久!”、“跟哪个MM聊天呢!”、“我生气了!”、“你是好人,再见!”,看着自己的回复刚刚发送成功,停在最后一行,整个互动信息一气呵成,都是眼泪。

3)和朋友聚餐,菜端上先拍照分享,再大快朵颐,明明坐在对面,偏偏还得用手机聊天,世界最远的距离,莫过于我们坐在一起,却只能用手指切磋。

有因有果,有道有术,不入虎穴焉得虎子,不扯了,进入正题。

5、移动网络的特点

理论上说,我们看到移动网络有如下三个典型特点:

  • 1)移动状态网络信号不稳定,高时延、易抖动丢包、通道狭窄;
  • 2)移动状态网络接入类型和接入点变化频繁;
  • 3)移动状态用户使用高频化、碎片化、非WIFI流量敏感。

为什么?

参考【图一 无线网络链路示意】,我们尝试从物理上追根溯源:
<ignore_js_op> 
▲ 图一:无线网络链路示意

根据“图一:无线网络链路示意”所示内容,我们可以得到以下信息。

第一、直观印象是通讯链路长而复杂:从(移动)终端设备到应用服务器之间,相较有线互联网,要多经过基站、核心网、WAP网关(好消息是WAP网关正在被依法取缔)等环节,这就像送快递,中间环节越多就越慢,每个中转站的服务质量和服务效率不一,每次传递都要重新交接入库和分派调度,一不小心还能把包裹给弄丢了。

第二、这是个资源受限网络:移动设备接入基站空中信道数量非常有限,信道调度更是相当复杂,如何复杂就不展开了,莫文蔚那首歌词用在这里正合适:“我讲又讲不清,你听又听不懂......”,最最重要的是分配的业务信道单元如果1秒钟不传数据就会立马被释放回收,六亲不认童叟无欺。

第三、这个链条前端(无线端)是高时延(除某些WIFI场景外)、低带宽(除某些WIFI场景外)、易抖动的网络:无线各种制式网络带宽上限都比较低而传输时延比较大(参见【表一 运营商移动信号制式带宽标准】),并且,没事就能丢个包裹玩玩,最最重要的是,距离基站的远近,把玩手机的角度、地下室的深度等等都能影响无线信号的质量,让包裹在空中飞一会,再飞一会......。这些因素也造成了移动互联网网络质量稳定性差、接入变化频繁,与有线互联网对比更是天上人间的差别,从【图二 有线互联网和移动互联网网络质量差异】中可以有更直观的感受。

<ignore_js_op> 
▲ 图二:有线互联网和移动互联网网络质量差异

【表一 运营商移动信号制式带宽标准】数据来自互联网各种百科,定性不定量,仅供参考;
<ignore_js_op> 
<ignore_js_op> 【表一-运营商移动信号制式带宽标准】-清晰图.rar (252.64 KB , 下载次数: 0 )

第四、这是个局部封闭网络:空中信道接入后要做鉴权、计费等预处理,WAP网络甚至还要做数据过滤后再转发,在业务数据有效流动前太多中间代理人求参与,效率可想而知。产品研发为什么又慢又乱,广大程序猿心里明镜似的;最最重要的是,不同运营商之间跨网传输既贵且慢又有诸多限制,聪明的运营商便也用上了缓存技术,催生了所谓网络“劫持”的现象。

如果我们再结合用户在移动状态下2G/3G/4G/WIFI的基站/AP之间,或者不同网络制式之间频繁的切换,情况就更加复杂了。

6、移动网络为什么“慢”

我们在移动网络的特点介绍中,很容易的得到了三个关键字:

  • 1)“高时延”;
  • 2)“易抖动”;
  • 3)“通道窄”。

这些物理上的约束确实限制了我们移动冲浪时的速度体验,那么,还有别的因素吗。

当然有,汗牛充栋、罄竹难书:

  • 1)DNS解析,这个在有线互联网上司空见惯的服务,在移动互联网上变成了一种负担,一个往复最少1s,还别提遇到移动运营商DNS故障时的尴尬;
  • 2)链路建立成本暨TCP三次握手,在一个高时延易抖动的网络环境,并且大部分业务数据交互限于一个HTTP的往返,建链成本尤其显著;
  • 3)TCP协议层慢启动、拥塞控制、超时重传等机制在移动网络下参数设定的不适宜;
  • 4)不好的产品需求规定或粗放的技术方案实现,使得不受控的大数据包、频繁的数据网络交互等,在移动网络侧TCP链路上传输引起的负荷;
  • 5)不好的协议格式和数据结构设计,使得协议封装和解析计算耗时、耗内存、耗带宽,甚至协议格式臃肿冗余,使得网络传输效能低下;
  • 6)不好的缓存设计,使得数据的加载和渲染计算耗时、耗内存、耗带宽。

现在终于知道时间都去哪了,太浪费太奢侈,还让不让人愉快的玩手机了。天下武功,唯快不破,我们一起踏上“快”的探索之路吧。

更多有关TCP的基础理论性文章,可以看看下面的文章:

7、针对移动网络“弱”和“慢”的特点,有优化办法吗?

答案是:有。

在移动互联网时代,对我们的产品和技术追求提出了更高的挑战,如何从容和优雅的面对,需要先从精神上做好充分的准备,用一套统一的思考和行动准则武装到牙齿。

从来就没有什么救世主,只有程序猿征服一切技术问题的梦想在空中飘荡。屡败屡战,把过往实践中的经验教训总结出来,共同研讨。针对移动网络的特点,我们总结一些实用方法,请看下篇《移动端IM开发者必读(二):针对移动弱网络特性的优化方法总结》。

(意犹未尽?请看下篇:《移动端IM开发者必读(二):史上最全移动弱网络优化方法总结》 )

附录:更多计算机网络方面的资料

TCP/IP详解 - 第11章·UDP:用户数据报协议
TCP/IP详解 - 第17章·TCP:传输控制协议
TCP/IP详解 - 第18章·TCP连接的建立与终止
TCP/IP详解 - 第21章·TCP的超时与重传
技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)
通俗易懂-深入理解TCP协议(上):理论基础
通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
理论经典:TCP协议的3次握手与4次挥手过程详解
理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程
计算机网络通讯协议关系图(中文珍藏版)
UDP中一个包的大小最大能多大?
P2P技术详解(一):NAT详解——详细原理、P2P简介
P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
通俗易懂:快速理解P2P技术中的NAT穿透原理
高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少
高性能网络编程(二):上一个10年,著名的C10K并发连接问题
高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了
高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索
不为人知的网络编程(一):浅析TCP协议中的疑难杂症(上篇)
不为人知的网络编程(二):浅析TCP协议中的疑难杂症(下篇)
不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT
不为人知的网络编程(四):深入研究分析TCP的异常关闭
不为人知的网络编程(五):UDP的连接性和负载均衡
不为人知的网络编程(六):深入地理解UDP协议并用好它
不为人知的网络编程(七):如何让不可靠的UDP变的可靠?
网络编程懒人入门(一):快速理解网络通信协议(上篇)
网络编程懒人入门(二):快速理解网络通信协议(下篇)
网络编程懒人入门(三):快速理解TCP协议一篇就够
网络编程懒人入门(四):快速理解TCP和UDP的差异
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势
技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
让互联网更快:新一代QUIC协议在腾讯的技术实践分享
现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障
聊聊iOS中网络编程长连接的那些事
移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”
移动端IM开发者必读(二):史上最全移动弱网络优化方法总结
>> 更多同类文章 ……

(本文同步发布于:http://www.52im.net/thread-1587-1-1.html

移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”的更多相关文章

  1. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”>,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文将针对上篇中提到的特性,结合我们的实践经 ...

  2. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  3. (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)

    @翻译:huangyongye 原文链接: Understanding LSTM Networks 前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LST ...

  4. 深入理解openstack网络架构(2)----Basic Use Cases

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture1 译文转自: http:// ...

  5. 深入理解openstack网络架构(1)

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 译文转载自:http://b ...

  6. 理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...

  7. [转] 理解 LSTM 网络

    [译] 理解 LSTM 网络 http://www.jianshu.com/p/9dc9f41f0b29 Recurrent Neural Networks 人类并不是每时每刻都从一片空白的大脑开始他 ...

  8. 『TensorFlow』通过代码理解gan网络_中

    『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上 上篇是一个尝试生成minist手写体数据的简单GAN网络,之前有介绍过,图片维度是28*28*1,生成器的上采样使 ...

  9. 【翻译】理解 LSTM 网络

    目录 理解 LSTM 网络 递归神经网络 长期依赖性问题 LSTM 网络 LSTM 的核心想法 逐步解析 LSTM 的流程 长短期记忆的变种 结论 鸣谢 本文翻译自 Christopher Olah ...

随机推荐

  1. 如何配置IIS使其支持APK文件的下载

    在管理工具里打开Internet 信息服务(IIS)管理器.然后选择需要配置的网站. 右侧的界面中会显示该网站的所有功能配置,我们选择并点击进入“MIME类型” 在左侧的操作区选择点击“添加”MIME ...

  2. Helm简介

    什么是Helm 微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,作为Kubernetes应用的一个包管理工具,可理解为Kuberne ...

  3. k8s定义Deployment,和service

    定义一个Deployment和service做个简单的笔记 有时候我们需要开放Pod的多个端口,比如nginx的80和443端口,那如何定义Deployment文件呢,定义单个端口如下 apiVers ...

  4. Mask RCNN 源码阅读(update)

    之前看了Google官网的object_dectect 的源码,感觉Google大神写的还不错.最近想玩下Mask RCNN,就看了下源码,这里刚好当做总结和梳理.链接如下: Google官网的obj ...

  5. MFC之sqlite

    引用头文件和将生成的SQLite.dll加载到项目中 #include "sqlite3.h" 1.动态加载sqlite //***********************数据库动 ...

  6. http 连接 analysis service (ssas)

    当数据仓库搭建好后,我们就可以通过sqlserver的管理工具查看服务器上的数据集了.但是这样挺不方便的,如果要远程访问,那么就可以通过http来连接数据仓库.要配置数据仓库http连接非常的简单.如 ...

  7. [leetcode]35. Search Insert Position寻找插入位置

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  8. time模块的使用

    https://www.cnblogs.com/jimmy-share/p/10605575.html import time 一.方法汇总: time.sleep():定时函数 time.time( ...

  9. JAVAEE——SpringBoot配置篇:配置文件、YAML语法、文件值注入、加载位置与顺序、自动配置原理

    转载 https://www.cnblogs.com/xieyupeng/p/9664104.html @Value获取值和@ConfigurationProperties获取值比较   @Confi ...

  10. 七、eclipse添加离线约束,使不联网也能有一些代码的提示,例如dubbo

    eclipse添加离线约束,使不联网也能有一些代码的提示,例如dubbo 1.将dubbo.xsd文件放到一个无中文目录下 2.eclipse->windows->preferences- ...