`

[转]实时游戏的网络协议设计

阅读更多
类似于SLG这类游戏,对游戏的实时交互要求不是很高,所以一般选择的都是通过HTTP协议,进行前后台数据交互。但随着用户对游戏的需求越来越高,MMORPG也逐步出现在webgame之中,诸如昆仑、乐土这类回合制MMORPG-Webgame。由于HTTP是短连接,不能适应这种长连接的网络需求。所以肯定是需要使用socket进行网络连接的。虽然COMET也能达到类似的目的,但是性能上还是难以达到socket的水平,所以在商业化应用上还是比较少考虑的。
本文不会涉及到用何种语言实现socket连接来传递数据,主要内容是根据实际的经验,和大家讨论下服务器端和客户端之间传递的数据及数据结构的一些问题。

首选说几个名词:
1、封包
大家在使用互联网的时候,所有的数据都是被打成一个包发出去的,这个包不是压缩包(zip\rar),而是有一定数据结构的二进制数据。封包的主要内容是数据信息,含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之间可以通过路由协议来进行路由信息的交换,从而更新路由表。
在设计游戏的封包中,我们只关心数据信息,而其他的不需要关心。

2、字节(Byte)
大家对对MB,KB肯定不陌生,也一定知道MB或KB中的B就是Byte。Byte是存储空间的基本计量单位。一般来说一个ASCII码就占用一个字节,比如'A'或者1

3、位
既然知道了字节,那么字节由什么组成呢,那就是位了。是计算机中最小的数据单位。一个字节由8个二进制位构成,如00001111。ASCII码是都可以转换成二进制的。如下表
二进制       十进制     十六进制  字符
00110001      49          31          1
00110010      50          32          2
00110011      51          33          3
00110100      52          34          4
00110101      53          35          5
00110110      54          36          6
00110111      55          37          7
00111000      56          38          8
00111001      57          39          9

1、协议设计
一般来说我们都会设计一个协议,这个协议指明了,这个封包的数据的作用是什么。一般我们都会用数字来代表协议。
如:
登陆登出 1
聊天        2
移动        3

所以我们可以这样设计数据协议
--------------------------------
控制器 登陆登出 1
--------------------------------
动作    登陆       1
动作    登出       2

----------------------------------
控制器     聊天        2
----------------------------------
动作    私聊       1
动作    世界       2
动作    队伍       3

-----------------------------------
控制器     移动        3
-----------------------------------
动作        移动        1

这样就构成了数据结构:控制器,动作,DATA
如世界聊天:2,2,DATA; 移动:3,1,DATA

这样客户端和服务器端就能根据控制器和动作来调用不同的程序来处理DATA中的数据。
而DATA也有自己的结构,这个是根据实际的功能来设计的。
比如私聊,就设计成:2,1,from,to,msg

如果我们使用socket传输字符串,那么客户端和服务器端收到这样的数据后就可以进行处理了。

2、封包设计
在协议设计中,我们是使用的字符串组成的协议,而为了降低网络开销,一般使用二进制来传递数据。这样可以大大降低包的长度。节省网络带宽。

之前我们在协议设计了控制器和动作,现在我们加一个返回值,返回值代表了控制器和动作的结果,而不是数据本身。那么就构成了这样的数据结构:控制器,动作,返回值,DATA。

我们可以把控制器、动作、返回值放到两个字节里面,这就要进行位操作。

一个字节有8位,我们可以这样分配位:
第一个字节
+--------4--------8
+   控制器   +   动作 +
+---------+------+
将一个字节的第1-4位用与控制器,5-8位用于动作

第二个字节
+--------4--------8
+   返回值   +   保留 +
+---------+------+
将一个字节的第1-4位用与返回值,5-8位保留以作他用

如果无返回值,者第二个字节为00000000


而DATA中的数据也是使用二进制结构,这就需要根据不用的协议,来写不同的解包程序。也可以写通用的解包程序,那就需要在设计数据结构的时候更要深思熟虑。关于DATA这部分的数据结构的设计,会以后专门进行说明。

我们构造出了封包的数据主体,还要标示出这个数据有多长,我们会在长度和数据主体之间加一个分割符,我这里用了0x88或0x86
+--------16--------8--------8---------4--------8---------4----------n
+ 包长   +   0x88   + 控制器 + 动作 + 返回值   + 保留   + DATA +
+--------+--------+--------+--------+--------+---------+----------+
这里需要根据实际情况,决定包长使用1个字节还是2个字节,1个字节可以表示255个字节的长度,2个字节可以标示65535的长度



在进行socket通信的时候,经常会处理拼包和粘包这些问题。用我们之前设计的数据结构,是无法处理拼包和粘包这些问题的,所以我们还必须把以控制器为单位的包区分开来。

比如我们的包构成是:
+--------16--------8--------8---------4--------8---------4----------n
+ 包长   +   0x88   + 控制器 + 动作 + 返回值   + 保留   + DATA +
+--------+--------+--------+--------+--------+---------+----------+


我们可以在包前端增加一个字节以进行区分
+--------8--------16--------8--------8---------4--------8---------4----------n
+   0x86   + 包长   +   0x88   + 控制器 + 动作 + 返回值   + 保留 + DATA   +
+--------+--------+--------+--------+--------+--------+---------+----------+


在整个封包中,还可以加入更多的元素,比如加密,奇偶校验等,这些要根据实际情况来设计包的结构,这些需要大家在实际的项目中去体会和发现。

本文只是对封包做了一个概要性的讲解,不足、漏洞、不合理肯定是比比皆是。希望大家能指出来一起讨论,也希望能看到有更好的想法提供给大家。
分享到:
评论

相关推荐

    实时游戏的网络协议设计

    实时游戏的网络协议设计是构建在线游戏特别是MMORPG(大型多人在线角色扮演游戏)的关键技术之一。在早期,简单战略游戏(SLG)等类型的游戏通常采用HTTP协议与服务器进行交互,这是因为它们对实时性要求较低。然而...

    基于思科的校园网搭建及网络协议分析 计算机网络课程设计

    通过这个校园网搭建及网络协议分析的课程设计,学生可以全面了解网络基础设施的规划、实施和优化,为未来在IT领域的工作打下坚实基础。同时,VLAN技术的应用展示了如何通过网络分段提升网络效率和安全性,这对于现代...

    网络协议规范大全大全.rar网络协议规

    总的来说,理解并掌握网络协议规范对于从事网络相关的任何工作都是必不可少的,无论是设计网络架构、优化网络性能,还是排查网络故障,都离不开对这些规范的深入学习和应用。因此,这份"网络协议规范大全"对于IT专业...

    网络游戏-用于通信网络的通信协议转换连接器和室内通信网络系统.zip

    在网络游戏中,大量的玩家同时在线,每个玩家的操作都需要实时反映到游戏中,这就对网络的延迟和带宽提出了高要求。室内通信网络系统设计的目标是提供低延迟、高可靠的通信环境,通常包括局域网(LAN)、无线局域网...

    全部网络协议图,展现网络协议全貌

    通过"网络协议图1.gif"和"网络协议图2.jpg",你可以清晰地看到这些协议是如何相互配合工作的,这对于初学者理解和网络开发人员设计网络应用都非常有帮助。理解网络协议的工作原理,有助于我们更好地优化网络性能,...

    网络协议源代码

    4. UDP协议:UDP(用户数据报协议)是一种无连接的、不可靠的传输协议,适用于实时数据传输如视频流和在线游戏。研究UDP的源代码,可以了解其如何通过最小的头部开销实现高效的数据传输。 5. DNS协议:DNS(域名...

    网络游戏设计及其平台的设计与开发 毕业论文

    网络游戏设计及其平台的设计与开发是信息技术领域中的一个重要分支,它涉及到多方面的技术和理论知识。这篇毕业设计论文旨在探讨如何创建一款网络游戏以及构建其配套的游戏平台,以提供丰富的用户体验。 网络游戏...

    网络游戏-将数据包从一个网络协议转换到另一个的方法和装置.zip

    - 不同的游戏服务器和客户端可能采用不同的网络协议,如内部测试环境可能使用自定义协议,而公测环境可能需要与标准互联网协议对接。 - 网络环境差异,例如局域网与广域网,不同的ISP(互联网服务提供商)可能使用...

    网络游戏-网络协议引擎.zip

    网络游戏中的网络协议引擎是游戏开发中的重要组成部分,它负责处理游戏中所有与网络相关的通信,确保玩家之间的交互流畅、实时,并且稳定。网络协议引擎的设计和实现对于网络游戏的成功至关重要,因为它直接影响到...

    网络游戏-多协议标签转换网络系统.zip

    在“多协议标签转换网络系统.pdf”文档中,可能详细介绍了MPLS的工作原理、架构设计、配置方法、在网络中的实际应用案例,以及如何在网络游戏环境中部署和优化MPLS网络系统等内容。阅读这份文档将有助于深入理解MPLS...

    网络游戏-基于射频能量收集的无线传感器网络MAC协议设计方法.zip

    《网络游戏-基于射频能量收集的无线传感器网络MAC协议设计方法》 在现代网络游戏的开发与运营中,无线传感器网络(Wireless Sensor Networks, WSNs)的应用日益广泛,尤其是在环境监测、玩家行为分析和游戏场景模拟...

    网络游戏-用于网络协议的报头压缩方法.zip

    网络游戏中的网络协议报头压缩方法是优化网络游戏性能的关键技术之一。在网络游戏的实时通信中,数据传输效率至关重要,因为延迟和带宽限制可能直接影响玩家的游戏体验。报头压缩旨在减少在网络上传输的数据量,从而...

    网络游戏-可经由网络地址转换型设备操作的通信协议.zip

    总的来说,网络游戏中的通信协议设计是一门综合了网络协议、NAT穿透、安全性和性能优化的复杂学问。对于开发者而言,理解并掌握这些知识是确保游戏稳定、流畅运行的关键。通过持续的技术创新和优化,我们可以为玩家...

    常见网络协议RFC文档

    网络协议是互联网的灵魂,它们规定了设备如何在网络中通信,数据如何传输以及各种服务如何运行。RFC(Request for Comments)文档是定义这些协议的标准,由Internet Engineering Task Force(IETF)发布。这些文档...

    实验指导书 - 网络协议软件编程_网络程序设计_网络编程_WINSOCK_

    **网络协议软件编程_网络程序设计_网络编程_WINSOCK_ 实验指导书** 网络编程是计算机科学领域的重要组成部分,特别是在互联网技术飞速发展的今天,掌握网络编程技能对于IT专业人士至关重要。本实验指导书主要围绕...

    网络游戏-基于实时传输协议的端到端网络测量方法.zip

    RTP是一种广泛用于音频、视频等实时数据传输的互联网标准协议,尤其在网络游戏中,它能够确保数据的低延迟传输,从而提供更流畅的游戏体验。 端到端网络测量是指从数据发送方到接收方的全程监控,包括了数据在网络...

    网络游戏的开发与设计 毕业设计

    网络游戏的开发与设计是一项复杂而综合的工作,涵盖了多个IT领域的知识。这个毕业设计项目包括了服务器和客户端的构建,以及3D引擎的应用,是学习和实践C++编程、网络通信和游戏开发技术的一个典型实例。 首先,...

    常用网络协议原理 (中兴资料)

    它不保证数据包的顺序到达,也不进行错误检测和重传,因此适合实时性要求高的应用场景,如视频通话、在线游戏等。 4. IP协议:IP(Internet Protocol)协议负责将数据包发送到目标地址。它包含IP头部,用于标识源和...

Global site tag (gtag.js) - Google Analytics