Category Archives: 网络编程

游戏服务端架构发展史(上)

手游页游和端游,本质上没有区别,区别的是游戏类型: 《游戏服务端架构发展史》转载请著名出处:http://www.skywind.me/blog/archives/1265  类型1:卡牌,跑酷等弱交互服务端 卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的 HTTP服务器: 登录时可以使用非对称加密(RSA, DH),服务器根据客户端uid,当前时间戳还有服务端私钥,计算哈希得到的加密 key 并发送给客户端。之后双方都用 HTTP通信,并用那个key进行RC4加密。客户端收到key和时间戳后保存在内存,用于之后通信,服务端不需要保存 key,因为每次都可以根据客户端传上来的 uid 和 时间戳 以及服务端自己的私钥计算得到。用模仿 TLS的行为,来保证多次 HTTP请求间的客户端身份,并通过时间戳保证同一人两次登录密钥不同。

Loading

Posted in 游戏开发, 网络编程 | 1 Comment

快速可靠协议-KCP

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,并以 callback的方式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。 整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的 ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 URL:https://github.com/skywind3000/kcp

Loading

Posted in 编程技术, 网络编程 | Tagged , | 21 Comments

参考ZeroMQ改进服务器

今天参考 ZeroMQ的观点为我们的网络模块增加了一个“订阅模式”,及客户端包头用四字节表示,低24位为长度,高八位为“消息分类”。后端连接网络层的若干“频道”可以根据自己的喜好订阅“分类消息”,那么客户端发送该分类消息到网络层的时候,将会被抄送到订阅过该分类的频道。每个频道还可以订阅若干系统消息,比如连接开始、断开、时钟等等。 我们的服务器自2004年底到现在,一直是网络和逻辑分离在不同的进程(主机)中间,网络模块可以连接多个提供服务的“频道”,只是配合休闲游戏的模型,当前只有一个频道可以和特定玩家进行交互。不过其基于多频道的模型使得这次改进很容易,改了三个小时,又跑了几个小时的测试用例,基本通过。 以后交易,聊天,逻辑等,都可以分布在不同的频道里面同时为玩家提供服务了。

Loading

Posted in 网络编程 | 2 Comments

[业余土制] 简易网络库 easenet

1. 跨平台网络库 2. 异步事件:kevent, iocp, epoll, poll, select封装 3. 内存管理:SlabPlus 4. 可靠协议:类tcp纯协议实现,包括重传机制,窗口管理,流量控制,拥塞处理。 5. 多种工具:缓存池,环状缓存,高性能hashmap等。 代码贴上:

Loading

Posted in 开源项目, 编程技术, 网络编程 | Tagged , | 3 Comments

[业余土制] Python P2P模块

项目地址:http://code.google.com/p/pyp2p/  

Loading

Posted in 开源项目, 编程技术, 网络编程 | Tagged , | Leave a comment

影子跟随算法(2007年老文一篇)

算法简述   动作类游戏如何在高延迟下实现同步?不同的客户端网络情况,如何实现延迟补偿?十年前开始关注该问题,转眼十年已过,看到大家还在问这类问题,旧文一篇,略作补充(关于游戏同步相关问题还可以见我写于2005年的另外两篇文章,帧锁定算法 和 网游同步法则): 影子跟随算法由普通DR(dead reckoning)算法发展而来,我将其称为“影子跟随”意再表示算法同步策略的主要思想: 1. 屏幕上现实的实体(entity)只是不停的追逐它的“影子”(shadow)。 2. 服务器向各客户端发送各个影子的状态改变(坐标,方向,速度,时间)。 3. 各个客户端收到以后按照当前重新插值修正影子状态。 4. 影子状态是跳变的,但实体追赶影子是连续的,故整个过程是平滑的。 图1 算法演示 前面的1号终端控制红色飞船P1向左飞,并把自己的状态时时告诉服务器 后面的2号终端上接收到飞船P1的影子S1的状态(向左移动),并让P1的实体追赶S1 网络性能指标一:带宽,限制了实时游戏的人数容量 网络性能指标二:延时,决定了实时游戏的最低反应时间   使用该算法可以容易的开发出一款马里奥赛车,或者Counter Strike,详细说明见后:

Loading

Posted in 游戏开发, 编程技术, 网络编程 | Tagged , | 14 Comments

帧锁定同步算法

帧锁定算法解决游戏同步 早期 RTS,XBOX360 LIVE 游戏常用同步策略是什么?格斗游戏多人联机如何保证流畅性和一致性?如何才能像单机游戏一样编写网游?敬请观看《帧锁定同步算法》 《帧锁定同步算法》转载请注明出处:https://skywind.me/blog/archives/131 算法概念 该算法普遍要求网速 RTT 要在 100ms 以内,一般人数不超过 8 人,在这样的情况下,可以像单机游戏一样编写网络游戏。所有客户端任意时刻逻辑都是统一的,缺点是一个人卡机,所有人等待。 1.客户端定时(比如每五帧)上传控制信息。 2.服务器收到所有控制信息后广播给所有客户。 3.客户端用服务器发来的更新消息中的控制信息进行游戏。 4.如果客户端进行到下一个关键帧(5帧后)时没有收到服务器的更新消息则等待。 5.如果客户端进行到下一个关键帧时已经接收到了服务器的更新消息,则将上面的数据用于游戏,并采集当前鼠标键盘输入发送给服务器,同时继续进行下去。 6.服务端采集到所有数据后再次发送下一个关键帧更新消息。 这个等待关键帧更新数据的过程称为“帧锁定” 应用案例:大部分 RTS 游戏,街霸II(xbox360),Callus 模拟器。 算法流程 客户端逻辑: 判断当前帧 F 是否关键帧 K1:如果不是跳转(7)。 如果是关键帧,则察看有没有 K1 的 UPDATE 数据,如果没有的话重复第 2 步等待。 采集当前 K1 … Continue reading

Loading

Posted in 游戏开发, 编程技术, 网络编程 | Tagged , | 35 Comments

网络游戏南北互通问题分析

网络游戏南北互通问题方案 网络游戏用户按接入分,有多数的电信用户,次多数的网通用户,又有处于教育网的学生用户,造成了互联互通上极大的障碍。又由于当今游戏用户数据的越来越强的集中性和游戏服务器的分散性之间无可避免的矛盾,无法将游戏平台划分成为一个个独立的世界。 在上次的文档“QQ游戏服务器分布说明”后又补充了一篇“QQ游戏服务器响应速度”,可以发现QQ游戏服务器除去黑龙江,吉林,辽宁三省的大量网通用户外,在各地相对于电信和网通的访问速度都还是比较迅速的。下面是一些分析:

Loading

Posted in 游戏开发, 编程技术, 网络编程 | Tagged | Leave a comment