QQ西游服务器分析01-网关服务器

网关服务器入网流程:

s1.连接网关管理器

s2.上报自身信息给网关管理器

s3.从网关管理器获取自己的管理信息

*s4.按照管理信息预分配好需要的资源

s5.网关服务器打开客户端监听端口

s6.网关服务器开始转发“管理器”和客户端的数据

*网关服务器完全不理解来自客户端的数据(对客户端而言是透明的)

*网关服务器和“管理器”之间存在协议栈,有五个高级命令:转发,广播转发,T下线1,T下线2,关闭网关

*网关服务器会定时给“管理器”发送心跳请求ping

*网关服务器会维护客户端状态机:Freed、Starting、InUse、Stoping

GateWayServer抽象网关逻辑以及和管理器的连接,处理管理器命令,并且转发客户端和管理器的消息

GWClient抽象网关到客户端连接,负责处理网关和客户端的逻辑

网关启动后,GateWayServer会打开监听端口,当新的连接上来以后,会创建一个新的GWClient对象,并且将新的socket连接郊游GWClient管理。GWClient管理客户端和网关服务器之间的通讯数据:接受到客户端的数据会交由GameWayServer对象转发到指定的管理器,GameWayServer也会将管理器发送给客户端的数据交由GWClient发送到客户端。

即在网关服务器内部:GWClient做为客户端的代理,GateWayServer做为管理器(逻辑服务器)的代理。

// 禁用nagles算法

int nodelay = 1;

if(ACE_OS::setsockopt(new_handle,IPPROTO_TCP, TCP_NODELAY,(char*)&nodelay,sizeof(nodelay))==-1)

{

ACE_ERROR( ( LM_ERROR, ACE_TEXT("Set socket TCP_NODELAY failed!!\n")) );

}

缺陷:

1.缺少对客户端的安全检测,也许是放到后面的逻辑服务器上去做了。不能排除恶意连接,或者误操作的连接,所有的连接都被accept上来,然后做数据交换。

2.数据的分发上,好像一个网关服务器只能对应一个管理器(逻辑服务器)

3.网关只能标识到连接(SettionID是用户逻辑无关的),无法识别到具体逻辑客户端

尝试做低级抽象:

IGateWayClientAccpetor

OnClientAccept

IGateWay2ClientSession

SessionID

OnConnect

OnRead

OnWrite

IGateWay2ManagerSession

SessionID

OnConnect

OnRead

OnWrite

IGateWayDataRouter

OnAccessRouting(IGateWay2ClientSession)

OnAccessRouting(IGateWay2ManagerSession)

OnGateWay2ClientSessionRead(来自客户端的数据,当前代码下,会转发给唯一的管理器处理)

OnGateWay2ManagerSession(来自管理器的数据,如果是需要转发给客户端的数据,会包含有客户端SessionId)

协议概览:

网关管理服务器 协议:

enum EGWMgrMsgType

{

GWMMT_Msg,
// Route server msg to clients.

GWMMT_MsgAll,
// Route server msg to all clients.

GWMMT_Droped,
// *A client has been droped by manager( actively or disconnect ack ).

GWMMT_DropedDiscard,
// *A client has been droped by manager( actively or disconnect ack ).

GWMMT_Shutdown,
// Shutdown gateway server.

GWMMT_Max,

};

GWMMT_Msg: 转发消息到指定客户端

GWMMT_MsgAll: 转发广播消息到全部客户端

GWMMT_Droped: 网关管理器T掉指定客户端

GWMMT_DropedDiscard: 网关管理器T掉指定客户端

GWMMT_Shutdown: 关闭网关服务器

---------------------------------------------------------------------------------------

网关服务器 协议:

enum EGWSVMsgType

{

GWSMT_CLJoin,
// New client join.

GWSMT_CLDisconnected,
// Client disconnected.

GWSMT_Msg,
// Route client message to server.

GWSMT_Ping,
// gateway ping message to server.

GWSMT_Max,

};

GWSMT_CLJoin: 新连接客户端

GWSMT_CLDisconnected: 客户端连接断开

GWSMT_Msg: 将客户端的消息转发到服务器

GWSMT_Ping: 网关服务器到逻辑服务器的ping

-----------------------------------------------------------------------------------

网关服务器消息头:

struct GWMsgHdr

{

GWMsgHdr( u_int type, u_int len ):type_( type ), data_len_(len){}

u_int
type_; // Msg type.

u_int
data_len_; //

};

------------------------------------------------------------------------------------

网关上报给网关管理器的自身信息

struct GWLocalInfo  // 监听客户端连接的endpoint

{

u_int
addr_; // Gateway listen address.

u_short
port_;

};

------------------------------------------------------------------------------------

网关从网关管理器接受的信息

struct GWInfo

{

u_int
id_; // Gateway server id.

u_int
cl_num_; // Client num.

};

设计特点:

1.启动参数通过内存共享,本地,可以被其他程序访问到,也许直接被共享到集群了,没有深入去看

时间: 2024-12-14 07:59:02

QQ西游服务器分析01-网关服务器的相关文章

linux服务器分析优化

一.系统性能分析 1.系统的性能是指操作系统完成任务的有效性.稳定性和响应速度.操作系统完成任务与系统自身设置.网络拓扑结构.路由设备.路由策略.接入设备.物理线路有关.当linux服务器出现问题,应该从应用程序.操作系统.服务器硬件.网络环境等方面排查. 2.性能优化方案提供:影响系统性能最大的因素是应用程序和操作系统两个方面,因为这两个方面出现的问题隐藏性好,不易察觉,而其他方面出现的问题一般会立刻定位到.系统硬件:(1).当硬件属于物理故障,直接更换硬件:(2).硬件性能不满足需求,升级硬

Django之HttpServer服务器分析详解

大家知道,软件的正向工程,是从软件的需求获取开始,大概经历需求分析,概要分析,领域分析,设计分析,详细设计,代码实现,部署,实施这几个步骤,最终交付给用户使用.而在某些时候,比如某个软件产品是用PHP开发的,因为某些原因,我们想移植到JAVA平台去.或者某公司看到某个软件的市场前景很好,想COPY它的主要功能,然后经过加工润色后推出一个具有相同功能,更好用户体验或更多功能的软件.或者单纯的以研究软件的结构.设计思想为目的.基于这些需求,我们需要逆向工程.正向工程是一个从过程导出结果的步骤,而逆向

web服务器分析与设计(一)

自己写一个简单的服务器. 面向对象分析与设计第一步:获取需求(基于用例) 功能:1,支持html静态网页,2,支持常用HTTP请求,且容易扩展支持不现请求 3,可以发布站点 补充:至于对动态网页等高级功能,只要确保可扩展性就可以了. 目标系统客户角色:1,上网者 2,浏览器客户端 3,网站发布人 (暂时想到主要的这几个角色) 只要满足了他们的主要需求,这个服务器也就是成功的. 客户发起动作(用例起点):U1:上网者------>打开网站(www.xxx.com) U2:上网者------>提交

linux+iptables搭建网关服务器

公司购买的一批云服务器只带内网,配置了一个负载均衡器(lb),这批服务器通过lb可以对外提供服务,但是这批服务器不能主动连接外网,例如使用wget下载文件,或者curl访问ttlsa.com站点. 额外购买一台带外网的云服务器,将这台服务器配置成网关服务器,其他服务器网关改为这台服务器,问题得到解决.方法很简单 网关服务器IP:172.16.0.1客户端IP:172.16.0.0/24 1. 开启forward 1 2 # cat /etc/sysctl.conf | grep forw net

web服务器分析与设计(二)

面向对象分析与设计第二步:寻找对象,建立问题域模型 1,用例场景描述 接上一篇中的用例,编写用例场景 U1: 上网者:打开网站(www.xxx.com) 浏览器:连接网站 目标系统:接受连接 检查连接合法性(主要是因为服务端是容易受攻击的,所以需要加入安全检查) 合法,接入连接,等待HTTP请求(不合法看备选流程) 浏览器: 发送GET请求 等待回复 目标系统:收到GET请求 处理GET请求 向浏览器发回请求回复 回复完成,断开连接 备选流程:连接不合法,断开连接. U2 上网者:点击提交按钮

Tornado源码分析之http服务器篇

一. Tornado是什么? Facebook发布了开源网络服务器框架Tornado,该平台基于Facebook刚刚收购的社交聚合网站FriendFeed的实时信息服务开发而来.Tornado由Python编写,是一款轻量级的Web服务器,同时又是一个开发框架.采用非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用. 二. 为什么要阅读Tornado的源代码 Tornado由前google员工开发, 代码非常精练, 实现也很轻巧, 加上清晰的注释和

java实现简单web服务器(分析+源代码)

在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简化操作,这里不考虑资源不存在等异常情况.web服务基于的是HTTP协议,用户在浏览器的地址栏输入要访问的地址,服务器如何得到该地址是个关键.先看下一般的HTTP请求和响应报文的一般格式: HTTP 请求报文 HTTP 响应报文 web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:

基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息

每次升级,客户端都会获取服务器端存放在upgradefile文件夹下的需要升级的文件和升级信息配置文件(即upgradeconfig.xml文件) 我们来看一下代码 //升级信息配置文件相对应的类 ( 升级信息配置文件是由这个类转化成的) private UpgradeConfig upgradeConfig = null; //客户端存储升级配置文件的地址 是放在客户端根目录下的 (就是把服务器 upgradefile/upgradeconfig.xml下载到客户端存放的位置) string

网关服务器——个人学习

首先说一下网关的概念:网关(Gateway)又称网间连接器.协议转换器.网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连.网关既可以用于广域网互连,也可以用于局域网互连. 网关是一种充当转换重任的计算机系统或设备.使用在不同的通信协议.数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器.与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求.同层--应用层.——来自百度百科. 通俗的说,网关就相当于一个明星的经纪人,