游戏卡顿白皮书 › 按症状查找
瞬移:47 个原因及负责方
又称:闪现、跳位、顿一下就跳走
在含图示的完整版症状词典中打开 →
角色没有移动过程,一下子出现在很远的位置。
对方原本站着不动,突然出现在已经走远的位置。
通常说明数据包中断了一段时间。排查丢包、线路短暂中断、服务器停顿、外推失败。别人都正常、只有一个人在跳,先怀疑这个人的线路。
导致此症状的原因
L1 客户端游戏进程
- 过度外推(航位推测): 数据包没到的这段时间,按最后的速度继续显示移动,发现猜错后再纠正回去。 (研发团队·客户端开发)
L2 客户端操作系统与设备
- 接收缓冲区溢出: 游戏太忙,从 socket(操作系统提供的网络收发接口)里取数据包取得晚,操作系统的缓冲区就会溢出。 (研发团队·客户端开发)
- Wi-Fi 后台扫描: 操作系统为了搜索周围的 Wi-Fi,会定期切换信道,这期间通信会短暂停顿。 (外部·外部)
L3 家庭网络
L4 公网链路
- 卫星互联网(低轨、静止轨道): 卫星互联网的信号要在太空中往返。静止轨道卫星光是往返就超过 0.5 秒;Starlink 这类低轨卫星平时很快,但在重新分配路径的瞬间延迟会波动,还可能短暂中断。 (外部·外部)
- 高峰时段对等互联链路拥塞: 晚上 9~11 点前后视频流量激增,运营商之间的互联链路(对等互联)容易拥塞。 (运维团队·网络运维)
- 海底光缆/国际线路故障: 海底光缆一旦中断,修好之前的几周(长则几个月)里流量要走很远的绕行路径,剩下的线路也会拥挤。 (外部·外部)
- BGP 路由变更/收敛: 互联网的路由信息发生变化后需要重新收敛,在这几秒到几十秒(少数情况下几分钟)里会丢包。 (运维团队·网络运维)
- ECMP 单条路径故障: 运营商和数据中心通往同一目的地的路径往往有多条,每个连接固定走其中一条。只要有一条路径出故障,分到这条路径上的人就会一直卡。 (运维团队·网络运维)
- 运营商限速/流量管理: 套餐流量用超,或套餐对特定流量做管控时,数据包会被延后或丢弃。 (外部·外部)
- 国家/运营商级 UDP 限制与包检测: 有些网络会封锁特定的 UDP 地址和端口,或限制 UDP 速率;包检测设备还会过滤掉它识别不了的协议。用 UDP 通信的游戏在这类网络里会连不上,或频繁掉线。 (外部·外部)
- 线路质量差: 接头接触不良、线路老化或调制解调器异常,会造成持续丢包和周期性的线路中断。 (外部·外部)
- DDoS 导致共享线路饱和: 针对游戏公司或同一网络中其他目标的大流量攻击,会把共享线路占满。 (运维团队·网络运维)
- 经由 VPN/游戏加速器: 开启 VPN 或游戏加速器后,数据包会经过该公司的中转服务器。中转服务器远或拥挤时,反而会变慢。 (外部·外部)
L5 数据中心网络设备
- DDoS 防护引流/误判: 为防御攻击把流量牵引到清洗中心后,路径会变长,还可能把正常用户误判为攻击而拦截。 (运维团队·网络运维)
- 交换机微突发: 多台服务器在同一瞬间向数千名玩家集中发包时,这些流量汇聚的交换机端口缓冲区很小,不到 1 ms 就会溢出。 (研发团队·服务器开发)
- 数据中心线路饱和: 版本更新包分发、日志传输、备份与游戏共用同一条线路时,线路会被占满。 (运维团队·网络运维)
- 线缆不良/端口错误: 光模块或线缆不良时,经过这条路径的数据包会按一定比例损坏。 (运维团队·网络运维)
L6 服务器网卡
- 网卡中断集中在单个核心: 网卡把数据包到达中断只发给一个 CPU 核心时,这个核心就会成为瓶颈。 (运维团队·系统运维)
- 环形缓冲区不足: 网卡用来暂存数据包的环形缓冲区太小时,流量瞬间涌入就会溢出,数据包被丢弃。 (运维团队·系统运维)
- 超出云 PPS 上限: 云服务器每种规格都有每秒包数和带宽上限,超出部分会被悄悄丢弃。 (运维团队·系统运维)
- 网卡带宽饱和: 流量用到 1 Gbps、10 Gbps 网卡的极限时,发送队列会越排越长,最终数据包被丢弃。 (研发团队·服务器开发)
- 云宿主机维护/热迁移: 云厂商维护物理服务器(宿主机)时,会把虚拟机迁到其他宿主机(热迁移)或暂停片刻。这期间整台服务器停住,停住时间一长,连接就会断开。 (运维团队·系统运维)
L7 服务器操作系统(内核)
- 内核 socket 缓冲区不足: 收发缓冲区太小时,一旦突发流量涌来,UDP 收到的数据包会被丢弃,TCP 发送则因缓冲区没有余量而阻塞。 (运维团队·系统运维)
- 服务器 conntrack 表耗尽: Linux 防火墙会把所有连接记在连接跟踪(conntrack)表里,这张表达到上限后,新的数据包会被丢弃。 (运维团队·系统运维)
L8 Socket 与协议
L9 服务器游戏进程
- 广播激增: 把一个人的移动发给所有能看到他的人时,要发的更新数量是聚集人数的平方。 (研发团队·服务器开发)
- 版本更新导致流量特征变化: 新内容、特效、同步项增加了数据包的大小和频率,原本正常的服务器在版本更新后开始碰到 MTU、带宽、包数的上限。 (研发团队·服务器开发)
同步设计
- 客户端权威: 各自决定自己的结果,自己的画面很流畅,但结果会与别人的画面对不上,也容易被外挂利用。 (研发团队·服务器开发)
- 回滚网络代码预测失败: 先预测对手的输入并显示出来,猜错了就回滚重新计算。ping 越高,回滚的幅度越大。 (研发团队·客户端开发)
- 指令同步的路径计算不一致: 只互传“去这里”,路径由双方各自计算时,计算稍有差异,角色或怪物就会走上另一条路,然后被拽回原位。 (研发团队·服务器开发)
- 快照发送频率低: 服务器每秒只发几次位置更新(快照)时,插值缓冲就得相应拉长,看到的其他角色也就是更久以前的状态。 (研发团队·服务器开发)
只有部分人遇到的问题
- 网络差的玩家在别人画面上快进移动: 线路差的人,输入会忽多忽少地扎堆到达服务器。服务器每个 tick 收到多少就应用多少时,在别人眼里,这个角色会顿一下,然后一下子走出好几步。 (研发团队·服务器开发)
- 怪物控制权在慢的客户端上: 有的游戏为减轻服务器负载,把怪物的移动计算交给附近某个玩家的客户端。这个人的线路差时,这只怪物在所有人的画面上都会动得很怪。 (研发团队·服务器开发)
- 基准快照丢失: 在服务器只发“与上次相比变化的部分”的方式下,丢了最初那一份完整信息(基准),之后的变化量就没法应用。 (研发团队·服务器开发)
TCP 重传的根本原因
- 无线链路丢包: Wi-Fi 和移动网络会在无线链路上重传几次,仍然失败就丢弃数据包。被丢弃的包要等过好一阵,才由 TCP 重新发送。 (外部·外部)
- 突发发送导致浅缓冲区溢出: 服务器每个 tick 在一瞬间集中发出几千人份的更新,交换机的小缓冲区或云平台的瞬时上限不到 1 ms 就会溢出,一部分包被丢弃。 (研发团队·服务器开发)
- 流量监管丢弃超额流量: 运营商套餐限速、云实例上限和 DDoS 防护设备,有时会把超过规定速率的数据包直接丢弃,不放进队列。 (运维团队·网络运维)
- 物理层错误(线缆/光模块/连接器不良): 线缆损坏、光纤连接器积灰、光模块老化都会产生误码,损坏的数据包会被设备悄无声息地丢弃。 (运维团队·网络运维)
- 接收端服务器主机丢包: 数据包已经到了服务器,却因网卡的环形缓冲区(暂存到达数据包的缓冲区)溢出,或内核中负责接收处理的 CPU 核心饱和而被丢弃。 (运维团队·系统运维)
- 中间设备超出处理上限(防火墙/IPS/DDoS 防护): 防火墙、入侵防御设备(IPS)、DDoS 防护设备会逐个检查经过的数据包。一旦超出检测能力,处理不过来的包就会被丢弃。 (运维团队·网络运维)
- 路径变更/ECMP 故障路径: 互联网路由切换的几秒内,或者被分配到多条 ECMP 路径中某条故障路径的连接上,会出现丢包。 (运维团队·网络运维)
查看含图示的完整版症状词典