今天来给大家说说可靠的UDP的设计,打算分三个部分来给大家讲解:
- 什么时候有可能采用 UDP 通讯而不是用 TCP 更好
- 一个可靠的 UDP 通讯模块的 API 接口该如何设计
- 一个C版本的实现
1什么时候使用UDP通讯会更好?
我反对基于UDP来实现可靠的传送协议使用的是类似于TCP那样的可靠的协议。TCP 已经够复杂了,几乎不太可能重新设计的更好。如果用 UDP 再实现一个可靠传输协议,而表现的比 TCP 效果更好,那么多半只是在部分情况下的优势;或是霸道的占用了过量的资源,而 TCP 在设计时则是很友好的,以整个网络的通畅为更高准则的。在网络游戏,尤其是移动网络上的网络游戏制作圈里,不断的有人期望基于 UDP 协议通讯来获得更快的响应速度,而又想让通讯流像 TCP 一般可靠。我也时常思考这个问题,到底该怎么做这件事?如果基于 UDP 可以做的比 TCP 更好,那么一定是放弃了点 TCP 需要做到的东西。
情景1: 寄希望于业务逻辑上允许信息丢失:比如,在同步状态中,如果状态是有实效性的,那么过期的状态信息就是可丢失的。这需要每次或周期性的全量状态信息同步,每个新的全量状态信息都可以取代旧的信息。或者在同步玩家在场景中的位置时可以用这样的策略。不过在实际操作中,我发现一旦允许中间状态丢失,业务层将会特别难写。真正可以全量同步状态的场合也非常少。
那么,不允许信息丢失,但允许包乱序会不会改善? 一旦所有的包