抓包简单分析英雄联盟的网络设计

我抓包肤浅的分析了下LOL的网络设计。

先说观察到的一些现象:

A)协议基于UDP

B)采用纯C/S模型(无C2C过程),

C)99% 包大小length小于576bytes,最大1038bytes。(100%小于1500bytes)

D)发包的频率是平均0.017s

然后一一的分析:

A)协议基于UDP不用多说

B)对MOBA这类强调微操作的游戏来讲,对英雄角色之间的影响巨大,对同步的要求高,玩家任何操作的不一致性都会带来很差的体验。

但网络的延迟是绝对的,对这里的同步我的理解是只要在在玩家反应时间内完成同步就行,人类的反应也是有延迟的(一般来说200ms吧)。然后我玩LOL中,看到的现象,

1)技能都反应时间,一般就是发送或者指示的耗时,SPELL的耗时等

2)攻击的时候也是有攻击速度,对高攻速的ADC来说有攻击物体飞行的时间。

3)我觉得最有意思的,在几次服务器卡顿时我注意观察了下,远离敌人时英雄的走动不是强同步的,反之则是!

前面两点是游戏设计上的,不多做讨论,第三点上面,我觉得LOL虽然游戏地图不大,但也是有战场概念的(BattleField)。这一点下面继续讨论。

我认为使用纯C/S模型原因有

1)对一致性来说,比网状结构要好,某个玩家的网络不好,对其他玩家的体验影响较小(相对的)

2)反作弊要容易一些

3)星状结构简单,腾讯也财大气粗,机房服务器都不是事

C)在我截的大概3400个包里只有30个是大于576bytes的。看来LOL的网络协议设计的时候是强调对最小MTU的支持。

D)这里的频率应该是每帧都会同步一个。这个速率相当高,大过了我的想象。之前在分析某个ARPG页游(明朝传奇)的时候,我发现游戏和服务器的同步速度是大概3个/s。游戏在这种速度下体验还是很流畅(战斗都是P2E,看得到其他玩家在同一个地图上跑动,我不知道有没有P2P,没玩那么深)。

这里我觉得C)和D)都是在为反应时间服务的。

然后说说我的看法,

首先我觉得要把所有包都设计为576bytes以内是有难度的,10个英雄的状态(等级,装备,技能,HP,MP(PR),BUFF,DEBUFF 各种CD时间等),和地图上物体(小兵,野怪)的时间片状态,加上玩家的OP,以及包的验证,时间,随机数seed各种,是很大的,所以我大胆猜测这个设计上应该有如下原则:

1)传输协议以玩家OP为主,比如移动

struct Operation

{

uint8_t actor;

uint8_t op_type;

uint16_t time; //用time做random_seed?

};

struct MoveOperation : public Operation

{

uint16_t x,y;

};

struct AttackOperation: public Operation

{

uint8_t targets[MAX_TARGET];

};

struct SpellOperation: public Operation

{

uint8_t spell_type;

union {

uint8_t targets[MAX_TARGET];

uint16_t center_x, center_y;

};

};

这样定义某个OP的操作,然后各个客户端以及服务器再维护其状态。

2)设立检查点,强行同步状态

比如将进入或退出战场(BattleField)的时候,某些团控技能spell或者起作用的时候,将玩家英雄各个关键状态(比如装备,HP,MP,BUFF,DEBUFF各种CD时间)值hash或crc一下,然后做一次检查,如果状态值和服务器不对,客户端强行和服务器同步相关量,甚至直接判定客户端掉线。

3)重点同步战场(BattleField)以及同视野内的各个玩家OP。

首先这里的“战场”我想应该是敌我玩家所在的位置里可能发生交战的区域,和视野的区别是,一方可能是隐身或者隐藏在草丛里等。

这里如果是实现的话,设定一个边界条件后,用一个四叉树即可。

对非战场以及同视野内玩家弱同步。

4)对地图内的NPC同步的话,这里也有难度,

我想到的就是各个NPC的位置各个客户端用强规则的有限状态机维护好(比如某个时间点,NPC一定在某个位置上,发生碰撞时一定会停下),对未在视野上的,由服务器传状态给客户端,然后用服务器判定NPC的攻击,或者被谁杀死的行为。

现在想到的就这些。

另外服务器上,因为对服务器IO要求很高,我想反作弊服务器和AI服务器肯定是分开设计的。

时间: 2024-10-28 19:02:40

抓包简单分析英雄联盟的网络设计的相关文章

如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPad等iOS设备或Android设备的网络通讯数据的方法 不管是iPhone的iOS还是Android系统上开发的应用App基本上都会需要使用网络通讯来传输数据.开发者有的时候可能会需要通过抓包的方式来了解应用具体在传输些什么数据,以及数据是否正确.今天给大家介绍一种如何在Windows操作系统上使用

C抓包并分析问题

1.抓包并分析 某列表页 传入的参数: ---------------------------------------------------------------------------------------------- 返回的内容: ------------------------------------------------------------------------------------------------------------- 接口文档 根据以上抓包数据.接口文档

浅谈使用tcpdump、wireshark对Android应用程序进行抓包并分析

本文主要介绍如何使用tcpdump和wireshark对Android应用程序进行抓包并分析,需要说明的是在抓包之前,你的Android设备必须root过了,另外你的电脑必须有Android SDK环境. 下载并安装tcpdump tcpdump链接:http://www.ijiami.cn/ 选择一个版本下载并解压提取出其中呃tcpdump文件,然后push到你的手机上去: adb push c:\tcpdump /data/local/tcpdump 进一步操作: adb shell su

shell脚本实现网络扫描 自动抓包 协议分析 nmap

此文章提供思想基础用法:关于自动检测功能,各个端口和抓包功能,项目中使用的为nmap软件,Linux操作系统,首先我们要安装nmap的软件 项目中使用的为nmap-6.40-7.el7.x86_64版本, 命令格式为:  #nmap  [扫描类型]  [选项]  <目标主机> 扫描类型: -sS (TCP  SYN扫描半开) -sT(TCP 连接扫描全开) -sU  (UDP扫描) -sP    (ICMP扫描) -A     //对目标主机做全面分析 选项       : -n     //

抓包及分析(wireshark&amp;tcpdump)

1.简介 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话,我直接用tcpdump了,因为我工作环境中的Linux一般只有字符界面,且一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析. 在Windows平台下,Wireshark通过WinPcap进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器.且是一个免费工具

Wireshark抓包实例分析TCP重复ACK与乱序

转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese 介绍 TCP 的一大常见问题在于重复 ACK 与快速重传.这一现象的发生也是由于性能问题,本章讨论如何发现这一问题以及他们意味着什么. 另一个常见问题是前一片段丢失以及乱序片段.某些情况下,这一现象喻示着故障发生,可能是由于网络问题或是抓包中断. 更多信息 重复 ACK 与快速重传 : 当网速变慢时,重复 ACK 是可能的原因之一.大多数情况下,重复 ACK 的发生是由于高延

抓包报文分析

尽管用到的抓包工具次数比較多.可是还是记不住这些16进制代码的含义.上次參加CTF居然有这种题,今天有时间就分析了一下,记下来 00 23 69 B7 81 24 0C 82 68 56 D3 AC 08 00 45 00 00 32 07 9D 40 0040 06 F9 B9 C0 A8 01 68 3A DD 3C 82 13 A1 21 24 D6 70 14 2F 0F A7 F7 86 50 18 40 98 F8 5E 00 0069 66 6F 66 31 75 D6 77 36

使用Packet Sniffer抓包和分析(z-stack协议)

1.首先路由器上电,此时还没有网络形成,抓包如下: 路由器会不断的发送Beacon request来发现网络. 2.协调器上电,其他设备均不上电,抓包如下:

抓包简单操作Fiddler

先把fiddler装好 然后对你所爬取的网页进行分析 起初都对自己想要爬取数据进行分析 对就是这东西这是从fiddler获取出来我想要的内容网址 就是这个到了这一步下面就通过你代码吧 原文地址:https://www.cnblogs.com/chunqing/p/9073656.html