我们都有过这样的经历:在同一个Wi-Fi下,手机上的视频应用播放1080P电影毫无压力,但电脑上的QQ消息转半天发不出去。很多人以为是网速不够,实际查一下,带宽明明几十兆。真正的原因是,视频和聊天站在网络需求的两端。
视频流可以看作一条宽阔的管道,里面的水一直在流。播放器做的事情是先把水存进一个大水池,再慢慢放给你看。主流视频网站使用的HLS协议,会把视频切成一个个2到6秒的小切片。播放器每次请求的是整个切片,同时后台还会预取后续多个切片。以爱奇艺的1080P视频为例,码率4Mbps,30秒的缓冲就相当于15MB数据先到了内存。此时即使网络突然中断10秒,视频依然会播放,因为池子里的水还没干。QQ聊天则是一滴一滴的水,每滴都要单独穿过管网。你发一个“你好”,这个数据包只有几十字节,必须立刻通过信号塔或者路由器,经过服务器接力,再落到对方手机上。途中任何一个环节耽搁,消息就卡住了。
这里的关键指标是延迟与抖动。延迟是数据从A到B的时间,抖动是延迟的变化幅度。在线视频依靠缓冲能把延迟带来的影响吸收掉,所以对抖动不敏感。而聊天的每个数据包都是独立的,一旦出现延迟尖峰,那一条消息就会被卡住。比如在地铁上,手机信号从4G切到3G,延迟瞬间从30毫秒跳到800毫秒,视频可能只出现一秒的模糊,因为码率自适应降低了清晰度,而QQ消息则直接显示发送中转。
网络设备对二者的处理也完全不同。家用路由器通常启用NAT,内部设备共享一个公网IP。为了支持视频,路由器会建立大量大数据包的转发通道,并且对这些连接保持常开。而QQ为了节省电量,会维持一条低频心跳连接,心跳包可能几秒钟才一小段。运营商和路由器都会为视频这种高吞吐连接优化调度,毕竟它耗资源多,而聊天包小,往往被塞进普通队列。在某些路由器上,如果开启了QoS,甚至会因为视频流量占带宽而压缩其他数据包的优先级,聊天消息就排在后面。
设备本身的协议栈也有影响。视频常用UDP的QUIC协议,自带丢包重传和拥塞控制,并且在用户空间实现,能够快速适应网络变化。QQ聊天虽然也用UDP辅助,但核心消息走TCP。TCP的慢启动和拥塞窗口机制,对于长时间空闲的聊天连接非常不友好。如果那条连接几分钟没有数据传输,突然发消息时,TCP可能还在用很小的窗口探测网络,速度自然上不去。而视频连接是连续满负荷传输,TCP能迅速把窗口拉满。

还有服务器位置。视频网站有全球部署的CDN,就算你家在偏远地区,CDN节点也总会在附近,平均距离在几十公里内。QQ消息的服务器虽然全国也有多个机房,但为了消息同步、安全审核,消息往往要经过一级或多级中转。多一次转发,就多一秒延迟。常见情况下,一条QQ消息从上海发出到北京,正常耗时大约150毫秒,而加载一个视频片段可能只要50毫秒。
有人以为换成更贵的宽带就能解决聊天卡的问题,其实对聊天来说,带宽大小远不如延迟重要。你用ping命令测一下会发现的,延迟低于50毫秒时聊天基本顺畅,而视频只要缓冲足够,哪怕ping值飙到1000毫秒也一样播放。理解了这个区别,就能明白为什么看电影不卡,QQ聊天却会卡。视频应用靠缓冲包容了网络的波动,而聊天要求每一次传输都准时到达,二者对网络质量的评价标准,从来就不在一个维度上。