`

实时游戏的网络协议设计

    博客分类:
  • Flex
阅读更多

在家上网赚钱更容易

类似于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  +
+--------+--------+--------+--------+--------+--------+---------+----------+


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

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

在家上网赚钱更容易

分享到:
评论

相关推荐

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

    实时游戏的网络协议设计是构建在线游戏不可或缺的一部分,它涉及到数据传输、同步、延迟处理以及错误恢复等多个关键领域。在本文中,我们将深入探讨实时游戏网络协议的核心概念、设计原则和常见技术。 首先,我们...

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

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

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

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

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

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

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

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

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

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

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

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

    网络协议源代码

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

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

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

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

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

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

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

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

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

    C#网络编程高级篇之网页游戏辅助程序设计软件包

    在本压缩包中,我们关注的是"C#网络编程高级篇之网页游戏辅助程序设计软件包",这是一份专门针对C#编程语言在网络编程领域的高级应用,特别是涉及到网页游戏辅助程序设计的实例代码。这份资源对于想要深入学习C#网络...

    C#本科毕业设计基于Tcp_Ip协议的1v1网络对战游戏源代码.zip

    C#本科毕业设计基于Tcp_Ip协议的1v1网络对战游戏源代码.。包括服务端 教程如下: 执行Mysql文件,数据库连接账户名为root,密码为root 开启服务端 开启客户端 使用说明 客户端界面,若连接成功,可使用数据库内已有...

    基于java语言设计的网络五子棋游戏

    网络五子棋游戏的关键在于实时的网络通信。项目中可能采用了Socket编程来实现客户端与服务器之间的数据交换。Socket允许两个网络连接上的进程进行双向通信,玩家的每一步操作都需要通过Socket发送到服务器,服务器再...

    网络 五子棋 设计 小游戏

    《网络五子棋小游戏设计详解》 五子棋是一种古老而深奥的棋类游戏,深受全球玩家喜爱。在网络技术高度发达的今天,将五子棋搬到线上,实现网络对战,不仅增加了游戏的趣味性,也使得玩家可以随时随地与他人切磋棋艺...

    常见网络协议RFC文档

    常用于实时应用如视频流和在线游戏。 4. IP(互联网协议):IP是网络层的核心,负责将数据包从源主机传输到目的主机。IPv4和IPv6是两个主要版本,其中IPv6正在逐渐取代IPv4以解决地址枯竭问题。 5. DNS(域名系统...

Global site tag (gtag.js) - Google Analytics