Messenger · IM即时通讯

首页/新闻列表/文章详情

困扰开发者的im即时通讯如何解决网络延迟丢包,如何优化弱网的交互呢?

发表时间:2022-09-20 18:23:07    浏览次数:1197

哎哟即时通讯作为即时通讯层自研供应商(IM、消息推送等应用场景)相关技术的开发者人员来说,似乎了解跨专业的通信技术(这是大学通信工程专业类学生的学习内容),有点过于深入和底层了,因为一般来说熟练掌握逻辑层的TCP\IP相关协议、网络编程相关的应用技术就差不多能胜任这方面的本职工作了。



消息发不出,长连接连不上,丢消息,没错,确实是这样。但在开发IM、推送这类应用系统时,尤其在移动网络下,各种弱网问题,让人非常痛苦。


典型的弱网问题,比如:


    1)频繁掉线;

    2)丢包严重;

    3)网络抖动;

    4)网络延迟;

    ........


优化方法一:“快链路”


我们需要有一条(相对)快速、(相对)顺畅、(相对)稳定的网络通道承载业务数据的传输,这条路的最好是传输快、不拥堵、带宽大、收费少。生活中做个类比,我们计划驱车从深圳到广州,如果想当然走广深高速十之八九要杯具,首先这个高速略显破败更像省道,路况不佳不敢提速;其次这条路上的车时常如过江之鲫,如果身材不好操控不便,根本就快不起来;最后双向六车道虽然勉强可以接受,但收费居然比广深沿江高速双向八车道还贵;正确的选路方案目前看是走沿江高速,虽然可能要多跑一段里程,但是通行更畅快。




① 控制传输包大小


控制传输包的大小在1400字节以下。暂时不讲为什么这样建议,先举个例子来类比一下,比如一辆大卡车满载肥猪正在高速上赶路,猪笼高高层叠好不壮观,这时前方突然出现一个隧道限高标识,司机发现卡车超限了,这下咋整。方案一,停车调头重新找路,而且十之八九找不到,最后只能哪来回哪;方案二,把其中一群猪卸下来放本地找人代养,到达目的地卸完货回来再取,你别说,这个机制在TCP/IP协议栈中也有,学名“IP分片”,后面会专门介绍。这个故事侧面证实美国计算机科学家也曾经蹲在高速路边观察生猪超载运输的过程,并饱受启发。且慢,每次遇到问题,想到一些方案后我们都应该再扪心自问:“还有没有更好的办法呢?”。当然有,参照最近流行的说法,找个台风眼,把猪都赶过去,飞一会就到了,此情此景想想也是醉了。


回归正题,概括的说,我们设定1400这个阈值,目的是减少往复,提高效能。因为TCP/IP网络中也有类似高速限高的规定,如果在超限时想要继续顺畅传输,要么做IP分片要么把应用数据拆分为多个数据报文(意指因为应用层客户端或服务器向对端发送的请求或响应数据太大时,TCP/IP协议栈控制机制自动将其拆分为若干独立数据报文发送的情况,后面为简化讨论,都以IP分片这个分支为代表,相关过程分析和结论归纳对二者均适用)。而一旦一个数据报文发生了IP分片,便会在数据链路层引入多次的传输和确认,加上报文的拆分和拼接开销,令得整个数据包的发送时延大大增加,并且,IP分片机制中,任何一个分片出现丢失时还会带来整个IP数据报文从最初的发起端重传的消耗。


我们可以得出如下结论,TCP/IP数据报文大小超过物理网络层的限制时,会引发IP分片,从而增加时空开销。


因此,设定合理的MSS至关重要,对于以太网MSS值建议是1400字节。什么,你的数学是体育老师教的吗?前面说以太网最大的传输数据大小是1500字节,IP数据报文包头是20字节,TCP报文包头是20字节,算出来MSS怎么也得是1460字节呀。如果回答是因为很多路由设备比如CISCO路由器把MSS设定为1400字节,大伙肯定不干,回忆一下IP和TCP的数据报包头都各有40字节的可选项,MTU中还需要为这些可选项留出空间,也就压缩了MSS的空间。要是再追问为啥这个值不是1380字节,那就有点过分了。




    1)导致这些现象的根本原因到底是什么?

    2)怎么跟老板解释,要搞定在高铁上用好音视频聊天功能很困难?

    3)怎么跟客户解释P2P在3G、4G甚至5G网络下的成功率问题?

    4)怎么向客户说明,商场或人多场合下,明明信号很好,但你的APP确用不了?

    .......



你说这些都是网络问题,APP代码无能为力。那么,你倒是讲讲到底是什么样的网络问题?能把人讲信服了,就可以甩锅给网络,不然只能是APP代码背锅了。现实吧!


所以,我们还是老老实实花点功夫来研究研究通信技术吧(通信技术直面的是网络通信物理层),至少遇到问题,不说给别人,至少给自已找到一个说的过去的解释。这才是一个优秀程序员的修养!


网上能找到的通信技术资料都太过专业或太不专业,要么都是搞网络工程方面的内行人编写的(内容专业但很枯燥难懂),要么就是外行的IT开发人员写的(很少见,且价值不大,因为不够专业,所以内容并不准确,参考价值很有限)。


既能让外行的普通程序员看懂,还能准确地讲明白通信技术知识,这样的资料简直比找金矿还难。因为普通程序员能接触到的网络编程、网络通信方面的资料多针对数据通信的逻辑层(比如:tcpip、socket等知识范畴),而通信技术涉及的是数据通信的物理层(交换机、路由器、天线、网络制式等),某种意义上来说,这是完全不同的技术方向。


好消息是,经过长时间的资料搜集,终于有了本系列文章,希望能给你带来帮助。


对于不太了解网络通信的人来说(包括开发者),可能会经常碰到下面这些问题:


    “手机(电脑)上网经常掉线,是为什么?”

    “手机(电脑)上网总是很慢,看个抖音都很卡,是怎么回事?”

    ……



想要搞清楚这些看似简单的问题,其实并不容易。归根到底的原因,就是因为上网牵扯到的技术和环节太多,容易出现问题的地方也很多。即使是老司机,也有可能被难住。


对于即时通讯网的开发者来说,为了更深入地搞清楚这些常见的网络问题,很有必要系统地了解导致这些问题的方方面面。




 


本文将详细介绍生活中遇到的常见网络问题,及可能的解决方法,虽说是一篇技术文章,但内容将一如既往地通俗易懂,简单实用。


废话不多说,我们直入主题。


正文开始之前,几个基本知识需要先说明一下。(如果是老司机,请跳过本节。如果是零基础,请认真阅读。)


我们首先来解释一下,到底什么是“网速慢”。


网速慢,就是上网速度慢。上网,就是上互联网。互联网,就是因特网(Internet)。


手机(电脑),首先通过有线信号(网线、光纤)或无线信号(WiFi、基站),连到运营商(移动、电信、联通)的网络里。然后,运营商会把我们的数据,送到互联网。同时,把互联网的数据,送给手机(电脑)。


什么是数据呢?


文字、声音、图片、视频(电视剧、电影等),这些都是数据:


数据的大小,是有度量单位的。单位有两种,一种是比特(bit),一种是字节(byte)。它们的换算关系,是1字节=8比特(1 byte = 8 bit)。因为bit和byte都是b开头,所以,为了区分,把byte简写成大写的B。我们口语上,把B叫做“大B”,把b叫做“小b”。


bit是一个很小的单位。通常,一张图片的大小,就有40000000bit。所以,为了方便,我们就创造了更大的单位:b、Kb、Mb、Gb、Tb。(就像长度有毫米、厘米、分米、米一样。)


大B和小b,都是数据的大小单位。如果是网速(数据传输速率)的话,就是每秒多少比特(bit/s)或每秒多少字节(byte/s)。


因此,大家判断网速,一定要先搞清楚使用的是什么单位。


例如,中国电信的200M宽带,其实是指200M bit/s,实际上,最高速度只有200÷8=25MB/s。


再例如,你的千兆网卡,是指1000M bit/s,也就是1000÷8=125MB/s。


还有大家现在使用的4G LTE手机,理论峰值速率是150M,也是bit/s,实际上,也就是150÷8=18.75MB/s。(这只是理论上的最高速度,人一多,速度就达不到。)


好了,搞清楚这些,我们开始真正进入正文。


刚才说了,所谓上网,就是手机访问互联网上的数据。这些数据,都在别人公司的电脑(服务器)上。


也就是说,网络通信,就是把你的手机和别人公司(例如腾讯、阿里、优酷)的服务器之间,连一个通道。


如果这个通道有任何一处出现问题,那么,整个通道的速率,就会出现问题。


就像一根水管,它最细的地方,决定了整个水管的流速。


出现问题导致的后果,就是——消息发不出去(或收不到),音乐或视频播放会停顿或模糊,游戏也会停顿,甚至重连。


因此,处理网速问题,说白了,就是找到这根水管的最窄处,把它拓宽。解决断网问题,也是这个道理,找到水管断掉的位置,把它接上。


有的人会抱怨网速:“我家不是百兆光纤嘛,怎么还会卡顿?”。其实就是搞错了问题的方向——他没有找水管的最窄处,而是强调自己水管的最宽处。


移动通信?有线宽带?  


处理网络问题的第一步,就是先判断——你到底是用的什么上网方式?


前面我提到,之所以我们能上网,是使用了运营商提供的“电信服务”。


这种服务,主要分为两种:


    1)一种是卖手机SIM卡给你,你把卡插入手机,进行通信。这种叫移动通信服务;

    2)另一种,是给你家里拉根宽带,可能是网线,或者是光纤(现在基本上是光纤为主)。然后你通过这根线上网。这种,叫有线宽带服务。