一、什么是网络延迟
指各式各样的数据在网络介质中通过网络协议进行传输,如果信息量过大不加以限制,超额的网络流量就会导致设备反应缓慢,卡顿,便称之为网络延迟。
二、网络延迟的常见三种状态
为什么会产生网络延迟(上网状态)
- 服务器:网络处于高峰,网络负荷过高造成延迟,光纤好比是一条公路,光纤越大代表着路越宽,当车子涌入太多,再宽的路也会堵住(很多人一同发数据),那么大家必须要遵守规则,排队行驶,那么耗时就多了。
- 物理方面:网卡性能差、手机运存不够、手机电脑中毒等造成软件无法运行从而影响硬件。
- 网线:网线质量差,线路周围电磁干扰等等都会影响运行速度
- 区域性问题:所处的区域若是网点发生了问题。
为什么会产生网络延迟的状态(发送文件状态)
- 发送过程
发送过程中出现卡顿是因为系统正在处理数据(一般都会将数据压缩),而电脑或手机硬件不行,就会出现卡顿。
- 接收过程
接收文件视频的时候,一般来说会将发送时候的数据解码,然后展现到手机上,这个时候,若是手机运算能力不足,那么会出现卡顿。
- 发送邮件时间过长(通常带有较大附件)
- 访问网站速度很慢
- 无法访问网站网络延迟出现的原因是什么?有哪些方法降低网络延迟?
网络时延是所有后台程序员的挑战,特别是对于游戏开发来说,特别是FPS或MOBA游戏,有时候,延迟可能左右一次击杀,甚至一盘游戏的胜负。而网络延迟也常在程序员的面试题中出现:
三、什么是延迟
- 首先我们要明白什么是网络延迟,网络延迟是你从客户端上发出一次操作,到收到服务器响应的一个延迟时间。举个例子:你在打王者荣耀,然后你决定不慌吃口药。很显然吃药能否恢复生命是由后台决定的,所以,你从吃药到开始回血可能是下面这样的过程:
- 用户点击了回血,客户端向后台发起请求
- 针对用户的请求,会校验角色的状态(例如角色跪了肯定就不能再吃了),上次吃药的频率(1分钟才能吃1次)等业务逻辑
- 校验没问题之后,会下发消息给客户端说可以吃药了。
- 客户端收到消息之后,继续吃药的动画。
在用户发起请求,到用户收到服务端的确认请求之间的时间,我们称之为延迟。
四、延迟的产生
从用户的手机,到游戏后台的服务器,是有距离的。现在,光纤已经遍布大江南北,即便数据在光纤中的传播速度接近光的速度,从深圳到北京也是需要十来毫秒。事实上,从你的手机上操作,访问北京服务器的数据,并非是直线访问,需要经历过非常多中间设备,不同的运营商。在这些设备之间,可能性能参差不齐,造成延迟进一步加大。
其次,服务器处理数据,是需要时间的,如果代码写得不合理,或者服务器性能过载,都可能增加单个请求的处理时间,从而造成延迟加剧。
五、延迟优化
第一个是从硬件上处理,建立专线。如果说原先的网络环境是普通的公路,那么,专线就是高速公路,在专线上,中间设备会减少,并且带宽更大,减少数据进行绕路。
第二个是从传输协议上,例如使用UDP协议替换TCP协议。越来越多的游戏传输协议,从TCP切换成UDP。由于TCP建立连接需要三次握手,并且TCP有队首阻塞问题。在网络不稳定的时候,更容易加大延迟。有人说,使用UDP协议,不就不可靠了么?在我们之前有一篇文章,专门介绍可靠的UDP协议传输,有兴趣可以看一下。
第三个还是从传输协议上优化,一般来说,为了优化的性能,在客户端或服务端,我们都会使用Buffer来进行数据缓冲,带来更高的IO效率。但是,如果Buffer过大,就可能是人为的制造延迟,所以我们可以减少Buffer的使用,或者缩小Buffer的大小。
第四是服务器使用更高的更高的帧率运算。什么是帧率呢?很多对战的游戏,并不是数据一发送到服务器,服务器就立马处理的。如果服务器1秒钟处理30次,那么,如果一个请求到服务器的时候,上一帧刚处理完,它就需要等待33ms。如果帧率提升到120帧,那么同样的情况,只需要等待8ms,大大减少延迟的时间。
第五客户端提前动画或预测数据,改善用户体验。还是上述那个吃口药的例子,我们在用户点击之后,就立马处理吃药的动画,因为绝大部分用户,都是正常的用户,发出来的请求都是合法的请求,对于少数外挂的用户,后续服务器返回进行对齐就可以了。这种方法,实际上并没有改善延迟,但是却大大提升了用户体验。