转存文章—网游加速器实现原理解析

转存⽂章—⽹游加速器实现原理解析
1. 前⾔
⽹游加速器是针对个⼈⽤户快速连接⽹游服务器的⼀种服务。为了解决国内南北⽹络互联瓶颈的问题,“⽹络加速器”⼚商通过搭建多个⾼带宽的双线机房(或通过租⽤双线VPS主机),并在这些机房的两⼤线路中架设多个节点服务器,然后为其编写“⽹络加速器客户端”,通过客户端判断⽤户的⽹络线路类型,并将⽤户应⽤客户端的⽹络数据转发到指定的节点服务器,由节点服务器转发给⽤户应⽤客户端请求的真正服务器。“⽹络加速器客户端”通过⾃动选择速度最快的节点服务器进⾏数据转发,以达到数据加速作⽤。优秀的⽹络加速器可以有效减少⽹络丢包和⽹络延迟。
本⽂基于前期对各种加速器的分析以及对其中的关键技术进⾏试验。⽂章⾸先对互联⽹上流⾏的⽹游加速器分析结果进⾏简要汇总,然后针对各种不同的加速器实现⽅式进⾏详细实现细节的介绍。
2. 流⾏加速器分析
本⽂前期对⽬前流⾏的⽹游加速器(或⽹络加速器)客户端进⾏了⼀定的深度分析,了解了这些⽹络加速器的使⽤特点、应⽤领域以及所采⽤的关键技术。⽬前⽹络上流⾏的⽹络加速器主要有:迅游加速器、迅雷⽹游加速器、盛⼤ET加速器、LavaVPN、NetPas等。
启动加速后加速客户端对其全部节点服务器进⾏测速(迅游加速器部署了82个节点服务器),然后选择速度最快的服务器作为转发服务器,并在本地建⽴IP地址以172开头的虚拟⽹卡(局域⽹地址)。启动后通过抓包⼯具分析,所有发送到该游戏服务器的数据都是从该172开头的虚拟⽹卡地址发出的(VPN技术?),⽽不是从物理⽹卡地址发出。通过查看路由表,被加速的游戏当前所使⽤的服务器被增加到了路由表中,并指向了该172开头的虚拟⽹卡地址。
在对迅游加速器分析过程中还发现,迅游加速器在加速过程中使⽤了LSP技术(⼀种通过在TCP/IP协议上层安装⼀层⽤户⾃定义协议,可以对WinSock2  API进⾏拦截的技术),并对WSAConnnect函数进⾏了拦截。
迅雷给⼒加速器也提供了四种加速模式,模式⼀采⽤的是基于LSP的代理加速⽅式,通过LSP技术,将⽤户的⽹络数据直接转发给代理服务器,再由代理服务器将数据转发给真正的游戏服务器;模式⼆采⽤的是基于L2TP协议的VPN技术;模式三采⽤的是基于PPTP协议的VPN 技术;模式四采⽤的是基于基于OpenVPN的VPN技术。这三种模式在启动加速后都需要修改路由表,以实现针对指定⽬的IP的加速功能。
VPN顾名思义,虚拟专⽹,你接⼊VPN就是接⼊了⼀个专有⽹络,那么你访问⽹络都是从这个专有⽹络的出⼝出去,好⽐你在家,你家路由器后⾯的⽹络设备是在同⼀个⽹络,⽽VPN则是让你的设备进
⼊了另⼀个⽹络。同时你的IP地址也变成了由VPN分配的⼀个IP地址。通常是⼀个私⽹地址。你和VPN服务器之间的通信是否加密取决于连接VPN的具体⽅式/协议。
代理服务器则是把你的⽹络数据请求通过⼀条连接你和代理服务器之间的通道,由服务器转发到⽬的地。你没有加⼊任何新的⽹络,只是http/socks数据经过代理服务器的转发送出,并从代理服务器接收回应。你与代理服务器通信过程不会被额外处理,如果你⽤https,那本⾝就是加密的。
对LavaVPN的分析过程中未发现其有使⽤到LSP技术的迹象。
3. 加速器实现⽅式概要
通过对以上加速器的分析进⾏参考,并查阅相关资料,⽬前主流的加速技术可以采⽤两种⽅式来实现:“代理服务器⽅式”和“VPN⽅式”。
电动小飞机代理服务器⽅式通过部署SOCKS5代理服务器作为加速节点,加速客户端⾃动选择最快的代理服务器作为当前的转发节点。在客户端主要采⽤LSP技术,在⽤户的主机安装分层协议,在游戏客户端调⽤connect函数(或WSAConnect函数)试图连接游戏服务器时,将连接重定向到代理服务器,并采⽤SOCKS5协议规范与代理服务器进⾏数据协商,由代理服务器来连接真正的游戏服务器,并将游戏服务器的数据原封不动转发给⽤户、将⽤户的数据原封不动转发给游戏服务器。
VPN⽅式需要部署双线VPN服务器作为加速节点,加速客户端⾃动选择速度最快的VPN服务器,并通过VPN拨号连接到VPN服务器并获取⼀个虚拟IP地址,同时通过修改路由表的⽅式,将指定进程的⽹络访问路由到虚拟IP上,⽽其余地址仍经过原默认路由途径访问。
下⾯就这两种加速⽅式的具体实现以及重要的技术难点进⾏详细分析。另外,报告中的所有代码截图均来⾃之前写的测试程序,并测试通过;VPN加速⽅式由主要进⾏了原理的详细介绍,并编写了⽀持PPTP协议的VPN客户端和服务器进⾏了测试。
4. VPN加速⽅式
4.1. VPN加速概述
VPN技术常常被⼴泛应⽤于“⽹游加速技术”和“FQ技术”中。如前⾯提到的迅游加速器、迅雷⽹游加速器、LavaVPN都采⽤到了VPN 技术进⾏加速,⽽且⽬前主流的⽹游加速器都主要是采⽤的VPN技术。由于VPN环境的测试需要建⽴VPN服务器,本⼈的测试环境有限,所以只是进⾏了客户端的代码编写并连接通过,⽆法做相关的代理效果的测试。下⾯只针对实现的流程和原理给以介绍。
4.2. VPN加速实现步骤
通过建⽴如下步骤,可以采⽤VPN技术来实现⽹络加速:
1. 部署双线VPN服务器节点;
2. 加速器客户端启动后选择⽹络性能最好的VPN服务器,并在客户端进⾏RAS拨号,与该VPN服务器建⽴隧道连接,连接建⽴后将会⾃动在本机⽣成⼀个虚拟⽹络地址,同时客户端的默认路由会被修改成指向该虚拟⽹络地址,如果此时不进⾏特殊处理,客户端的所有⽹络访问将都会通过该VPN通道出去;wap上网
3. 因为⽹游加速器的功能需求是仅仅针对某款游戏进⾏加速,即:在知道这款游戏连接的服务器IP的前提下,只有发送到该服务器IP的数据才被加速,其他⽹络数据应该不受影响。因此加速客户端在建⽴完VPN通道以后,需要⽴即修改路由表:在拨号前通过修改拨号参数,使其不修改本机的默认路由表;其次,将游戏服务器IP增加到路由表中,并让其指向VPN拨号建⽴的虚拟⽹络地址上。这样,与游戏服务器之间的通信都⾛VPN通道,⽽其他⽹络数据都不受影响。
4.3 VPN加速使⽤的三种协议介绍
⽬前⽹络上现有的⽹游加速器(或⽹络加速器)都使⽤到了三种VPN协议:PPTP、L2TP和OpenVPN。各种不同的协议在使⽤时可能受⽤户的⽹络状况的限制⽽⽆法使⽤,因此⼀般的⽹络加速器都会提供不同的加速模式供⽤户选择。或在启动加速过程中根据⽤户当前的⽹络状况⾃动选择可⽤的加速模式。
PPTP协议:PPTP协议是在PPP协议基础上开发的增强型安全协议。PPTP协议中有两个流:控制流和数据流。PPTP协议的数据流采⽤了GRE协议,由于该协议的特殊性,如果同⼀个NAT中有两个或以上的主机同时在发送PPTP协议数据包,当数据包从外部达到NAT时,NAT 将⽆法通过端⼝将数据转发到不同的主机,因此,当使⽤PPTP协议时,如果⽤户所在的NAT⽹关不⽀持VPN穿透功能(即⽀持PPTP协议的NAT编辑器,该编辑器在GRE协议的报头使⽤了⼀个CallId⽤来表⽰NAT下的⼀个会话,通过CallId来模拟端⼝,做NAT映射),那么内部主机只能与同⼀个服务器中间建⽴⼀个会话,不能有第⼆个客户端。⽬前,⼤多数NAT⽹关都具有PPTP NAT编辑器,能很好的⽀持PPTP协议。
L2TP协议:第⼆层隧道协议,该协议是PPTP协议和Cisco第⼆层转发协议L2F的结合体。在windows建⽴的基于L2TP协议的VPN连接中,默认是启⽤了证书⽅式的IPSec协议作为安全传输协议,IPSec协议为了保护IP数据包的完整性,会禁⽌任何对数据包的修改,否则修改后的数据包达到⽬的主机后其解密和完整性认证就会失败,从⽽导致这个报⽂被认为是⾮法数据⽽被丢弃。⽽当加速器客户端位于NAT后时,数据包在通过NAT时,NAT会对IP头数据等进⾏修改,导致数据到达VPN服务器时被认为是⾮法数据⽽丢弃。
解决该问题的⼀种⽅式是通过硬件⽅式:要求通信的双⽅的边界路由都⽀持NAT-T,基本原理是在IPSec封装好的数据包外再进⾏⼀次UDP 的数据封装,因此,当数据包穿过NAT⽹关时,被修改的只是外层IP/UDP头,⽽真正的IPSec数据未被修改;到⽬的主机时再将IP/UDP封装去除,这样就可以得
到未被修改的IPSec数据包。
另⼀种⽅式是在L2TP协议中禁⽤IPSec。对于我们制作⽹络加速器应⽤来讲,IPSec协议并⾮必须的,因此,我们可以在加速器连接中去除IPSec协议,⽽不影响加速功能。在Windows系统下采⽤RAS进⾏VPN连接时,若要去除IPSec协议,需要修改注册表并重启机器使之⽣效。迅游的给⼒加速器中就是采⽤这种⽅式。
OpenVPN模式:OpenVPN是⼀个基于OpenSSL加密和验证的应⽤层VPN实现,能够在NAT环境下很好的⼯作,是今年来新出现的⼀个基于开源软件体系的VPN项⽬。使⽤OpenVPN进⾏连接前,需要在客户端机器上安装⼀个虚拟⽹卡设备,并需要客户端修改路由表。
以上VPN协议中,除了OpenVPN的使⽤可以不受⽤户当前⽹络的限制外,其他两种⽅式都可能收到⽤户的NAT情况影响⽽导致加速失败,因此在实际应⽤中,各种加速器都会把这⼏种模式都提供给⽤户,并根据⽤户的⽹络情况进⾏选择。
4.4 VPN拨号客户端的实现
多媒体网络教学系统
试验过程中对RAS拨号建⽴VPN连接功能进⾏了测试。如下客户端实现了连接到VPN服务器,并同时客户端⽤户输⼊的“待加速地址”列表,修改路由表,已达到“仅指定IP⾛VPN通道”的功能,⽽⽤户的其他⽹络访问完全不受影响。
4.5 VPN⽅式尚存在的问题
1. 与采⽤代理⽅式⼀样,判断与当前启动的游戏通讯的是哪个服务器是个问题(原因如前所述),这⾥可以⽤到前⾯描述的LSP技术,通过在connect函数中判断欲建⽴连接的IP是否在当前游戏的服务器列表中。此时⽤到LSP技术并不是⽤于转发,仅仅⽤于判断是否加速。
2. 采⽤VPN⽅式有⼀个问题:如果⽤户修改路由表,让其他进程的服务器IP(如p2p下载软件)或默认路由表经过VPN通道的话,可能会造成VPN通道中的数据量增⼤,可能会影响正常的游戏。迅游加速器也没有对该问题进⾏很好的解决,早前的测试发现迅游加速功能启动后,通过修改路由表,可以使任意客户端进程都使⽤迅游的加速通道来访问⽹络。
该问题的也许可以通过两种⽅式来解决:⼀种是在客户端限制⽤户修改路由表,另⼀种是通过在服务器端进⾏限制⾮游戏服务器相关的数据。具体实现⽅式有待研究。
5. 代理加速⽅式
5.1. 代理加速的基本原理
采⽤代理服务器进⾏⽹络加速是⼀类使⽤较早的技术。⽬前某些⽹游客户端和⽹络应⽤程序都直接⽀持SOCKS5代理协议来连接其客户端,客户端提供设置代理服务器IP和端⼝的⽅式供玩家来设置。然⽽⼤部分⽹游客户端并不直接⽀持SOCKS5代理技术。此处介绍的代理加速模式不仅⽀持那些⽆法设置SOCKS5代理的⽹络游戏,即使那些可以设置SOCKS5代理的游戏,玩家也可以不⽤⼿动去设置,⽽⾃动采⽤下⾯介绍的代理加速技术进⾏代理加速。
车刀刃磨代理加速⽅式可以直接采⽤SOCKS5协议,由于SOCKS5协议有现成的服务器程序可⽤,可以节省服务器编写时间;但是也可以⾃⼰定义⼀个“类SOCKS5”的代理协议,⾃⾏实现代理协商和⾝份验证功能。下⾯的介绍将会基于⾃⼰定义代理协议的模式。
在使⽤代理⽅式加速时,LSP技术的使⽤是关键。Microsoft在Winsock2中提供了Winsock服务器提供者(SPI),允许⽤户在基础
TCP/IP协议上层插⼊⾃⼰定义的分层协议(LSP),当⽤户通过Winsock2 API连接⽹络或发送⽹络数据时,如调⽤WSAConnect函数,将会⾸先执⾏到LSP协议的dll中我们定义的函数,这样我们可以先进⾏处理,然后再交给真正的WSAConnect函数,这样就会起到
API Hook的作⽤。
要使⽤LSP技术,必须要将写好的LSP协议安装到⽤户的机器上,安装过程实际就是将DLL放⼊系统⽬录,并在注册表中写⼊该DLL位置信息的过程。注意:安装未签名的LSP时,安装过程中⼀般防⽕墙都会有警告提⽰。
5.2. 代理加速⽅式的实现概要
采⽤LSP⽅式进⾏⽹络加速需要部署SOCKS5代理服务器作为加速节点,加速客户端⾃动选择最快的代理服务器作为当前的转发节点。
开发⼈员在客户端需要完成的动作有:
1. 编写我们⾃⼰的LSP协议动态库,重新实现我们需要的相关socket函数,如connect;
2. 在⽤户的主机安装我们⾃⼰的LSP协议,这⼀操作可以放⼊我们的应⽤程序部署的时候完成,也可以在我们的加速器每次启动的时候进⾏部署;
3. 当游戏客户端调⽤connect函数(或WSAConnect函数)试图连接游戏服务器时,通过LSP将连接重定向到代理服务器,并采⽤SOCKS5协议规范与代理服务器进⾏数据协商,由代理服务器来连接真正的游戏服务器,并将游戏服务器的数据原封不动转发给⽤户、同时将⽤户的数据原封不动转发给游戏服务器。
由于Socks5协议并不涉及协议加密,⽽且Socks5协议本⾝协商过程较长,实际在开发中,⽹络加速器开发商⼀般都不会直接采⽤socks协议,⽽是对该协议进⾏改造,定义⾃⼰的代理协议。
5.3. Socks5协议与LSP结合
通过LSP技术Hook到相应的套接字函数进⾏数据转发之前,需要进⾏Socks5代理协商,即将鉴权信息告诉代理服务器,以及告诉代理服务器⾃⼰想连接的真正游戏服务器地址。代理协商完成后才能进⾏数据的收发。
针对不同的⽹络连接⽅式,代理协商的⽅式有所不同:
1. 普通阻塞⽅式的TCP连接最简单,可以在hook到connect函数后直接在内部进⾏阻塞式的代理协商,直到协商完毕后才将connect函数返回给⽤户,这时候⽤户拿到的socket实际上是连接到代理服务器的socket,当应⽤程序通过这个socket收发数据时,实际上是在和代理服务器交互,⽽这⼀过程对应⽤程序来说是透明的,应⽤程序以为⾃⼰是直接在和游戏服务器通信。
⽬前的⽹络应⽤程序很少会采⽤阻塞⽅式进⾏TCP连接,所以这种情况应⽤场景⽐较少。
2. ⾮阻塞⽅式的TCP连接情况⽐较复杂,有的TCP连接的socket是可以修改阻塞选项,这样,我们可以在connect函数的⼊⼝处判断⼀下当前socket是否是⾮阻塞,如果是则将其改为阻塞⽅式,修改后以
阻塞⽅式进⾏socks5代理协商,协商完毕后再将socket的阻塞⽅式修改为⾮阻塞。
3. 另⼀种更为复杂的⾮阻塞TCP连接是基于Windows异步消息的连接,这种连接采⽤了WSAAsynSelect⽅式设置了⽹络消息到来时的Windows接收窗⼝,所有的⽹络数据都需要在这个窗⼝的消息处理函数中处理(QQ飞车的TCP连接就是采⽤的这种⽅式)。这类⽹络模型不能简单采⽤修改socket阻塞⽅式的⽅法来解决。
解决这⼀问题的唯⼀办法是在LSP中hook住WSAAsynSelect,在该函数中创建⼀个我们⾃⼰的隐藏窗⼝,让⽹络应⽤程序的所有数据都转发我们⾃⼰的窗⼝上来,在我们的窗⼝的消息处理函数中进⾏代理协商和⽹络数据转发。
4. 对于UDP⽹络数据的socks5代理转发⽐TCP⼜要稍微复杂⼀些,TCP只需要hook到connect和WSAAsynSelect,对于⽹络收发数据的send和recv函数是不需要我们⾃⼰来实现的。UDP由于是不保持连接的,因此每次发送和接收的UDP包都要包含代理协商信息,因此我们需要把RecvFrom函数和SendTo函数都hook住。
对于UDP连接,需要在应⽤程序发送第⼀个UDP包的时候进⾏代理协商,以后发送数据的时候按照socks5协议的规定,加上socks5头部;收到的信息去除socks5头部再交给应⽤程序。
5.4. 代理加速⽅式详细实现
下⾯就详细介绍每⼀步的具体实现⽅式,为了⽅便流程分析,这⾥从LSP实现数据包转发开始介绍,最后介绍代理服务器的实现。
豁翎子1. 利⽤LSP编写DLL,实现客户端数据包转发功能:
编写LSP协议并安装到现有协议之上,需要建⽴基于DLL的⼯程,并导出WSPStartup函数,这样当有应⽤程序创建套接字时,会⾃动执⾏到该WSPStartup函数。在WSPStartup函数函数中,参数信息指明了应⽤程序期望采⽤哪种协议来创建套接字(所有的协议存在于⼀个协议链中,该协议链也包含了我们安装的LSP协议),我们需要在该函数中加载下层协议,并调⽤下层协议提供者的WSPStartup函数初始化,并修改传递给上层的函数表,将我们需要Hook的Winsock2函数指针的地址指向我们⾃⼰的函数。关键代码如下:
如果测试程序只针对TCP数据包的转发,只需要实现WSPConnect函数就可以了,其余函数只需要直接调⽤g_NextProcTable中的默认函数就可以了。
当⽤户应⽤程序调⽤connect函数或WSAConnect函数试图进⾏TCP连接时,将会先进⼊LSP的DLL中定义的WSPConnect函数,该函数进⼊后我们会判断应⽤程序试图连接的服务器IP和端⼝是不是我们待加速的服务器,如果是,会执⾏到socksProxy函数与代理服务器连接,并进⾏代理协商;如果不是待加速服务器,则执⾏g_NextProcTable中原有的连接函数,此时LSP就没有起作⽤,流程与不安装LSP 前的流程是⼀致的。
2. 安装LSP。
要使我们上⼀步实现的转发协议⽣效,还必须将上⼀步⽣成的DLL安装到⽤户的系统上。只有安装了LSP,应⽤程序在调⽤ws2_32.dll中的函数时就会执⾏到我们的LSP的DLL中。⼀般来讲,⽣成的DLL需要放⼊Windows/System32⽬录下,⼀个原因是DLL路径不能有中⽂等特殊字符,另⼀⽅⾯,如果有其他程序误删了该DLL,会导致整个系统⽆法上⽹的现象,还可能导致整个系统崩溃。
安装LSP⾸先需要安装协议链,需要将下层协议的信息拷贝过来,修改成我们需要的协议特点,并进⾏安装;然后对协议链进⾏排序,将我们的协议放在协议链的最上层,以保证ws2_32.dll调⽤到的第⼀个协议是我们的协议。
这⾥需要注意的是,当安装了“迅游加速器”后,系统上原有安装的分层协议将会被移到最下层,导致原有的协议⽆效。因此,我们在开发⾃⼰的⽹游加速器时需要考虑该问题,并予以避免。
5.4. 代理⽅式尚存在的问题
1. 不同⽹络加速器⼚商的LSP安装程序相互之间可能会出现不兼容的情况,所以我们实现⾃⼰的加速LSP的时候,其他⽹络加速器⼚商可能对我们安装的协议⼲扰,如迅游在安装和每次启动的时候会删除其他⼚商的LSP协议;
2. 如前所述,LSP在Hook到connect函数后,在WSPConnect函数中会判断当前连接的服务器是否是需要被加速的⽬的地址。如何获得⽤户当前启动的游戏的IP和端⼝是多少是⼀个难点,因为⼀个游戏可能连接了多个服务器并开启了多个端⼝,⽽真正进⾏通讯的只是其中⼀个;另⼀⽅⾯,通过加速客户端启动的进⾏可能并不是真正的游戏进程(可能只是⼀个升级程序)。
券商报告迅游加速器可能收集了每款待加速游戏的服务器ip和端⼝,如果客户端发送⽹络包的⽬的地址是这些ip的时候,才会针对这些⽬的ip地址进⾏加速。本⼈有过测试:⾸先获取迅游加速器⽀持的某款游戏的某个服务器IP和端⼝,然后⾃⼰编写⼀个客户端不断给该服务器的端⼝发送数据,当该exe替换游戏的exe并启动后,从抓包结果来看,加速功能仍然有效;当从迅游列表中选择另⼀款游戏,启动exe时仍启动我们刚刚编写的exe时,加速功能就失效了。因此可以推测:迅游加速器并不是通过判断进
程信息来获取⽬的服务器的(况且通过判断进程信息来获取⽬的服务器IP并不容易实现,如前所述),⽽是通过⽤户从列表中选择的游戏的名称。
6. 总结
本⽂主要介绍了两种实现⽹游加速的可⾏的技术⽅案,其中提到的对其他⽹络游戏加速器的分析以及具体实现细节可能会有⼀些不完善之处。
加速器实际实现过程中,还有关键⼀步就是判断当前⽤户的⽹络环境。⽐如⽤户当前连接的服务器是⽹通服务器,更智能的做法是在加速之前提前判断当前⽤户的⽹络情况,如果⽤户是⽹通⽤户,则不必启⽤加速功能,如果⽤户是电信或其他⽹络,则需要给⽤户提⽰可以启动加速功能,并由⽤户来决定是否启⽤加速。
当前游戏如果采⽤了P2P通信,⽤户⽹络环境的判断仍然需要被考虑。如QQ飞车和CF等对战游戏,启动游戏后建⽴了P2P连接,是否需要对这些P2P连接进⾏加速呢?这种情况也需要考虑⽤户的当前⽹络环境:如果P2P双⽅处于同⼀个NAT下,则不需要加速,如果⼀⽅是电信⽤户,⽽另⼀⽅是⽹通⽤户,就需要加速功能。
⽤户⽹络环境的判断(包括是否处于同⼀个NAT下的判断)是进⾏⽹络加速器的具体实现前需要解决的技术问题。

本文发布于:2024-09-22 19:35:58,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/136881.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:协议   加速   服务器   客户端   连接   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议