前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习。由于文本太多,按类型分开。这一篇是 网络 常问问题总结,有帮助的可以收藏。
1. TCP与UDP的区别
区别 |
UDP |
TCP |
是否连接 |
不连接 |
面向连接 |
是否可靠 |
不可靠 |
可靠传输(传输过程中会丢失,但会重发)使用流量控制和拥塞控制 |
连接对象个数 |
支持一对一,一对多,多对一,多对多交互通信。 |
仅支持一对一通信。 |
传输方式 |
面向报文 |
面向字节流 |
数据边界 |
保存数据边界 |
不保存数据边界 |
速度 |
速度快 |
速度慢 |
发送消耗 |
轻量级(因为 UDP 传输的信息中不承担任何间接创造连接,保证交货或秩序的的信息。这也反应在包头大小。) |
重量级 |
首部开销 |
首部开销小,仅8个字节 |
首部开销大,最小20字节,最大60字节。 |
有序性 |
不提供有序性的保证 |
TCP 保证了消息的有序性,即使到达客户端顺序不同,TCP 也会排序。 |
应用场景 |
IP电话,视频会议,直播,以及FPS竞技类的使用UDP帧同步。 |
要求可靠传输的应用例如文件传输,以及MMO类的TCP状态同步。 |
2. 帧同步与状态同步
2.1 帧同步
让每个客户端在相同的时刻发送游戏数据到服务端,服务器广播分发所有客户端的数据,然后客户端根据服务端发来的数据做出相应的逻辑处理,保证每个客户端在同一时刻所有的数据都是一致同步的。客户端做游戏逻辑处理。
核心思想: 相同的输入+相同的时机=相同的表现
同步的实现:
- 同步随机种子
- 客户端上传当前逻辑帧的操作(帧索引+游戏操作)
- 服务器广播客户端操作
帧同步可以说同步的是操作(输入)-服务器收到每个客户端当前的输入,将数据广播到所有客户端,客户端针对其他客户端的操作,做出逻辑处理,使得所有客户端在每一时刻的数据都是一致的。
优点:
- 单次同步数据很小,传输速率快,因为数据的逻辑处理主要是在客户端,服务器只起到分发同步的作用。
- 服务端压力小。
- 更容易实现录像功能,因为是帧同步,每一个时刻的帧序列都有记录,可以很好的还原游戏过程。
- 开发效率高,可以部分当作单机游戏来开发。
- 游戏精准度更高,能呈现更好的打击感、音效、特效等反馈、以及动作的反馈、动作的频率也可以更高。
- 流量消耗小,因为传输的数据量更少。大部分逻辑处理都在客户端处理好了。
缺点:
1.反外挂能力弱。因为主要的数据处理是在客户端。
2.网络要求更高,因为是是实时同步,一旦客户端网络延迟过高,很容易影响用户体验,产生网络抖动。
3.断线重连难度很大,因为一旦掉线,本地数据丢失了,需要从服务器逐帧来读取游戏进度,直到与当前游戏进度一直。如果直接从当前游戏进度开始进行同步,是很容易出现数据错误的。
2.2 状态同步
客户端将数据发送到服务端,服务端根据每个客户端发来的数据做出处理,再将处理完的数据广播发送到所有客户端,客户端根据数据进行数据表现。服务端做游戏逻辑处理。
优点:
- 反外挂能力强,因为大部分数据处理都是在服务端。
- 网络要求不高。
- 玩家可以随时加入到一个开始的战局,只需要同步当前战局内的所有玩家当前的状态即可。
缺点:
- 传输数据大,传输速度慢。因为客户端会将大量数据传输给服务端,再由服务端进行逻辑处理,再分发给所有客户端。
- 服务