手游系统逻辑档案之通信协议

  在没做游戏之前,我主要的任务就是实现各种基于tcp、udp或者串口的通信协议。当我要设计一套基于tcp的网络游戏协议时,感觉应该很简单,以前各种国际标准的协议都实现过,自定义的协议还不手到擒来。然而事实打完我的脸告诉我,设计协议本身要比实现它难度大得多。

  先说说什么是通信协议,两个不能共享数据的进程想要交换数据,需要两个条件:1.发送和接收数据的机制 2.封装和解析数据的规定。第一个条件就是物理层、链路层、网络层、传输层网络协议家族做的事情,第二个条件就是一套应用层通信协议。如果我们使用基于tcp的网络传输数据,那么要做的事情就简单到,只需要考虑逻辑了,因为底层是基于数据流的可靠的连接。最简单的协议是什么?我想,可能就是发送者要传递的信息只有两种状态,那么只需要连接和断开连接就够了,什么都不用发送。然而如果使用tcp的话,连接需要三次握手,断开连接需要四次握手,这个过程显然发送了大量的数据。所以说应用层面最简单的情况,应该是双方使用udp通信,一段时间内发送任意消息和不发送任何消息,两种状态,且不要求状态可靠。

  好了,脑洞开完了,说下手游中的网络协议设计。从哪里开始呢?我们只考虑逻辑应用的需求,传输使用tcp协议,而tcp协议是数据流协议。那么第一个问题来了,如何确定数据流的头和尾?这个问题还要分情况讨论:

  情况1.发送者和接收者保持tcp长连接,发送速率<=接收速率。那么理论上发送者只要在每个完整的消息开始指定消息长度就可以了,接收者可以正确的解析出每个消息。

  情况2.发送者和接收者保持tcp长连接,发送速率>接收速率。这时候接收者不得不丢弃一些来不及处理的数据,可是一旦丢弃那么他再也无法知道消息的头在哪里了,所以每个消息头要有一段标记表示“这是一个消息的开头”。

  情况3.发送者和接收者之间是tcp短连接。这意味着发送和接收的频率较低,而且发送者不能主动发送,只能由接收者请求之后发送,如http协议。这种情况下的消息处理可以认为每次发送的都是单独一条消息,理论上是最简单的。

  手游里面情况3比较常见,手游有个特点就是手机网络容易丢失,在移动中不断丢失和重建。这直接导致了tcp短连接是不可靠连接,因为断网之后数据包在某一环丢失了,我们却不能像端游那样让客户端回档重新登录,而是让客户端重连重新请求。为了让客户端和服务器都能处理网络故障导致的丢包重发,我在协议层加入了协议序号。规则很简单,客户端序号从1开始,服务器序号从0开始,服务器每收到一条消息则序号+1,也就等于客户端的消息序号,返回消息给客户端,客户端确认消息序号一致。客户端下一条消息序号+1 。

  这样如果客户端发送了消息,却没有收到响应,则超时,提示重发消息或放弃。

  如果服务器没有收到丢失的消息,客户端重发和第一次发送效果一样,序号正常增长。

  如果服务器已经收到消息,返回客户端的消息丢失,则服务器序号已经增加,收到客户端重发的消息序号会和服务器序号相等,服务器返回缓存的上一条消息即可。

  如果网络异常,客户端1号消息发过来太慢,然后重发成功,1号消息又到达了服务器,这时候服务器认为消息过期,不会响应这条消息。

  客户端要有一个发送队列,重发队列,接收队列。每发送一条消息就把这条消息从发送队列转移到重发队列,每收到一个响应包就去重发队列删除一条消息,加入接收队列。

  其他情况都是bug。

  现在我们看一下网络通信协议的基本组成:

    [消息长度][校验码][协议号][序号][消息体]

  事情没有完,这只是个开始。咱们回到游戏,玩家玩游戏的时候是多个玩家对一个服务器,那么明显服务器需要区分哪个消息是属于哪个玩家的,所以在协议号这一层后面需要加上playerId。

    [消息长度][校验码][协议号][PlayerId][序号][消息体]

  嗯,其实除了玩家,游戏的运营也在参与游戏,他们需要使用GM指令秘籍作弊,成为伪大R玩家。这时候咱们的协议又不够用了,我总不能给每个运营玩家一个特殊的playerid吧(我这里的playerid是动态生成的,玩家每次登录分配而得)。服务器除了和玩家通信,内部服务器进程之间也要通过协议通信。为了区分各种通信目的,我们需要在协议的消息头里面加上通道号。

    [消息长度][校验码][通道号][协议号][PlayerId][序号][消息体]

  我要解释一下,为什么先说的序号,却放消息头在如此靠后的位置。因为每个玩家都维持一个序号,玩家之间是没有关系的,序号是针对一个客户端对象和一个服务器对象的。现在咱们的消息格式看上去不错了,C/S之间,S/S之间,GM玩家,请求响应顺利,一条龙服务已然成型。不过现实总是要求的更多,考虑这种情况,客户端的一个操作请求导致了服务器上的多个数据更新,这时候我要在响应协议里加上所有变更的数据。如果类似的操作很多,就导致响应消息很复杂,服务器和客户端代码冗余易错,有的数据甚至不能加入到响应消息里面,客户端必须再请求另一条消息才行。比如,80%的操作可能导致任务完成或者成就完成,我总不能在这么多消息中都加上任务和成就的同步数据,如果没有完成,就变成了冗余数据。种种迹象表明,一问一答式的通信模型不能胜任复杂的消息同步。

  但是上面的分析都是克服了很多历史问题得到的战果,总不能推倒重来,再次解决这些问题吧。机智如我,想到了一个两全的方案:增加一套协议号,作为服务器响应消息的子协议号,子协议可以自由拼接。

    [消息长度][校验码][通道号][协议号][PlayerId][序号][子协议号][子协议长度][子协议体][子协议号][子协议长度][子协议体]...

  这样以来,通信层面的问题通过协议头的外层解决,逻辑层面的问题通过各个子协议解决。哈哈,我真是太机智了。

  然而事情远未结束,客户端使用C#语言,服务器使用C++语言,内存布局不一样,对齐方式不一样,或许由于设备不同还会有大小端不一样的问题。为了解决实现层面的问题,也是经历了一波三折。时间关系我就不一一展开说了。客户端从一开始的同步接口改成异步接口,增加了超时重连,解决了断包拼接,手动解析改成了自动解析。服务器从主动关闭连接,到客户端主动关闭连接,解决了静态发送缓存bug,从主线程处理消息改成IOCP线程池直接处理消息,一问一答的通信模型改成一对多模型。最后,客户端和服务器都做了协议加密。可谓是一把屎一把尿做出来的系统啊。

  

时间: 2024-10-05 04:58:52

手游系统逻辑档案之通信协议的相关文章

手游系统逻辑档案之竞技场与排行榜

再接再厉,前文说了任务系统的设计思路,不知道别人能不能看明白,为了锻炼一下表达能力,还是应该多画图,尤其是动态图.一图胜千言,尤其是讲数据结构和算法的时候,简直是没图没真相.不过画的太细就顾此失彼,画的太粗又达不到效果,像北京地铁图一样的示意图就是良好表达的典范. 之所以把竞技场和排行榜拿出来说,主要是因为这个系统涉及到了所有玩家的状态,还涉及到了开服和重启服务器的初始化.一般的系统功能只不过是单个玩家的数据管理,顶多与服务器的公共数据关联一下,而在做这个系统的时候感觉到了明显的不同.先简单描述

手游联运有利有弊,如何选择手游联运系统

所谓的手游联运就是自己去找平台,自己去接平台,自己去买流量,自己宣传游戏. 好处: 1.分钱比例较高,一般收入和平台分就行了,好的话能分到55,千万流水就分500万了. 2.不受制于人,游戏要怎么做,怎么改,怎么运用,都自己决定,不用看人亮色,也不用把精力花费在满足代理方一些奇奇怪怪的要求上. 坏处: 1.风险自担,没有保底,游戏不赚钱就全陪. 2.费精力,需要商务去和各平台接洽,需要运营部门,需要客服,还需要各种资源. 3.流量是个问题,有钱任性的公司除外,实力雄厚的公司除外. 应用+手游联运

应用+:手游推广联盟系统

手游推广联盟系统是像360.百度.UC一样成为大渠道的必备武器.网罗推广精英.发展下线子渠道,联合更多人帮你推广,为您创造更大的共赢力量.应用+搭建手游联运平台的手游推广联盟系统就是让所有的个人站长或是中小型企业都能够拥有属于自己的推广联盟. 多渠道管理:推广渠道越来越多,一键生成多个子渠道包,省时更省力.您可以更资源.方便地和渠道.媒体.公会开展合作. 渠道监测:针对不同市场监测每个渠道的数据,才能更有针对性进行审核的合作推广. 财务管理:分成比例自主定义.提现周期自由控制.收入透明.渠道才通

皇家水族馆手游app系统开发详解

皇家水族馆app开发(七月冰:188.1414.7927)皇家水族馆游戏开发 皇家水族馆平台 皇家水族馆app源码 皇家水族馆模式 皇家水族馆理财游戏 根据调研数据显示,手游行业自2013年爆发以来,势如破竹,始终保持着两位数的增长,市场规模的扩大如雨后春笋般涌现出来,2018年手游市场规模预计将超过PC端游,这种高速增长也促使游戏厂商将布局重心转移至手游,进而形成了手游市场竞争日趋激烈的局面. 随着我们专业团队自主研发的这款皇家水族馆手游的问世,将为手游市场注入一剂强心剂,核心的开发技术,震撼

药王谷手游理财模式系统源码开发搭建

药王谷理财游戏系统原件开发(杨小姐:136-027-9-9492 微电).药王谷游戏系统开发.药王谷理财拆分盘操作系统开发.药王谷理财APP药王谷游戏APP软件开发.药王谷理财项目APP专业定制开发 药王谷这是一款手游,画面还挺精巧的.炼丹师游戏330项目定制,炼丹师界面设计,药王谷理财游戏网页版开发. 1.简单注册之后,能够看到自己每天炼丹的状况以及收益,以及收成好友的金丹明细,还有就是整个系统的买卖的记载明细. 2.加金丹则把库房中剩余的金丹放到丹炉中去炼丹,能够进步自己的基数,也就是第二天

独具特色,应用+手游联运系统

2015年智能手机的用户人数持续上升,随着时间的推移,90后.00后的成长,移动互联网的未来用户多为青年人群,手游自然也会成为移动互联网的主力军.然而面对如此庞大的消费市场,手游联运平台的数量则是供不应求.我国国内的应用商店搭建的系统繁多,但是真正技术人员缺乏,所以一个好的手游联运平台应该是不仅能够完成应用商店的搭建,同时还要有足够的内涵去吸引用户. 应用+手游联运系统全面的专业级渠道运营系统可以让您的手游运营更轻松 1. 行业顶尖的手游运营平台: 2. 方便的开发者管理系统(含定制专属渠道SD

【小松教你手游开发】【unity系统模块开发】热更

现在的手游项目如果没个热更新迭代根本跟不上, 特别是像我们项目做mmo的更是需要经常改动代码. 而现在的项目一般会选择用lua的方式实现热更新 不过我们项目由于历史原因没有使用,用的是另外一种方案 在项目里的所有GameObject都不挂脚本(NGUI脚本就通过代码的方式挂上),自己写的脚本都不继承Mono并打成dll,然后通过一个启动脚本去打开这些dll. 不过这样就有个问题,ios不能热更... 不管怎么样,先来讲讲这种方案要怎么做. 首先有两部分,一部分是打包,一部分是解包. 而包又分为资

建一座安全的“天空城” ——揭秘腾讯WeTest如何与祖龙共同挖掘手游安全漏洞

作者:腾讯WeTest手游安全测试团队商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest导读 <九州天空城3D>上线至今,长期稳定在APP Store畅销排行的前五,本文将介绍腾讯WeTest手游安全团队在游戏上线前为<九州天空城3D>挖掘安全漏洞的全过程. <九州天空城3D>(下文简称<九州>)是祖龙娱乐的一款正版授权次世代3D飞行手游,在8月,正式向全平台开放.作为一个前身是端游研发工作室的研发商,祖龙娱乐在<九州>

梦幻成仙,诛灭外挂——《梦幻诛仙手游》的阻击外挂之旅

随着智能手机的全面普及和市场泛娱乐化,移动游戏行业发展迅猛,无论是市场收入还是用户规模,手游在游戏市场上已经占据了半壁江山.如此火热的市场吸引了大量外挂.辅助工作室等非法盈利团队,严重影响了游戏的收益.平衡,缩短游戏的生命周期,外挂对手游形成了这些危害: 手游外挂八大危害 为了避免这些损害,腾讯游戏内部的测试流程已经将"手游安全测试"设立为必经环节,腾讯大部分手游上线前都会进行手游安全测试,<王者荣耀>.<穿越火线:枪战王者>等六星级游戏更是每一个版本都主动寻求