开源网络引擎RakNet分析

时间:2022-09-14 11:22:12

RakNet:著名开源网络引擎,用于网络游戏、多人联机游戏。

架构分析:

分为三大模块:network communication, plugins that use network communication, and general game functionality

核心是network communication,分为RakPeerTCPInterface。游戏状态同步用的是RakPeer,基于UDP协议。某些业务如补丁升级用的是TCPInterfaceRakPeer会创建2个线程,一个线程用于阻塞式的recvfrom(),另一个线程用于周期性的发包如保活检测、RTT检测、MTU探测等。收到的包会放到一个线程安全的队列中,用户线程每次主循环都调用RakPeer::Receive()来读取期间所有收到的消息。用户发送给RakPeer的消息,会在一个RakPeer发送周期整合成一个报文。

基本架构如下:

开源网络引擎RakNet分析

开源网络引擎RakNet分析

    其实它的核心代码大量的工作都花在了用UDP模拟出一个近似TCP的效果,从功能上来说,只是比TCP增加了几种传输方式:UNRELIABLE,UNRELIABLE_SEQUENCED,RELIABLE,RELIABLE_ORDERED,RELIABLE_SEQUENCED。以发送1,2,3,4,5,6数据为例,各传输方式下接收端收到的包为:

UNRELIABLE - 5, 1, 6

UNRELIABLE_SEQUENCED - 5 (6 was lost in transit, 1,2,3,4 arrived later than 5)

RELIABLE - 5, 1, 4, 6, 2, 3

RELIABLE_ORDERED - 1, 2, 3, 4, 5, 6

RELIABLE_SEQUENCED - 5, 6 (1,2,3,4 arrived later than 5)。

     目的只有一个,就是想去掉TCP的丢包重传机制。用UNRELIABLE_SEQUENCED传输方式,游戏的数据不需要每包都必达从而避免丢包重传,因为新的包代表新的状态,直接用新状态即可,不用非要等旧的包到达。TCP的丢包重传会花费比较多的时间(ping值的1.5倍)造成网络延迟。

    Plugin代码都是在构建在核心代码之上,提供一些网络游戏或多人游戏常用的功能。

 

发现其他玩家方式:输入IP直连,局域网广播搜索然后连接,服务器Room管理连接,或者服务器提供玩家列表用来连接。

互联方式:主要还是用Master/Slave方式实现多机互联。也提供了单独服务器(就是网游的方式)连接的功能,和p2p的功能。但p2p方式其实除了聊天外其他情景没法儿用。单独服务器用来给Console Game互联太浪费也意义不大,并且编程复杂度要高很多。

组队:可以通过它的TeamBalancer plugin来建立队伍。

补丁系统:如果玩家之间版本不一样,可以通过从Master那里下载补丁来达到版本一致,RakNet提供AutopatcherServer and AutopatcherClient pluginsFileListTransfer plugin and the DirectoryDeltaTransfer plugin实现这一功能。

游戏结果成就上传:游戏结束后有类似积分之类的数据需要上传到服务器的,可以用LobbyServer and LobbyClient来实现。需要有单独的服务器并且为每个用户建立一个账号。

聊天:

 

——未完,后续会更新补充。