# 元气骑士公网异地联机
## 初探局域网联机过程
### 前言
元气骑士作为当下热门的单机游戏,很多人都在琢么怎么和好朋友即使不在一个局域网内也能一起玩耍。目前网上比较成熟的方案是在服务器上搭建 VPN,两个手机通过连接 VPN 来穿透内网,实现彼此的连通,再通过联机工具转发房间的广播信息,如此就能做到公网异地联机了,相关的教程 CSDN 上都有。
本学期正式学习了计算机网络、windows API 编程等课程,正想对这些课程进行一个实践总结,我打算不通过 VPN,而是通过自己编程实现元气骑士的公网异地联机。
不过要实现公网异地联机,需要做到转发数据报、穿透内网,本篇主要就是通过封包分析,搞明白这个游戏局域网联机过程,从而弄明白,要转发数据报应该监听哪个端口。
在这个过程中我用了两种方法监听游戏的封包,第一种是电脑开热点,Wireshark 监听虚拟 wifi 所对应的的网卡,这种方法能收到广播信息,但是收不到点对点的 UDP 数据报,随后根据所学内容对问题进行分析,找到了问题的原因。第二种方法是用 tcpdump 直接监听安卓设备,导出封包信息,用 Wireshark 进行分析。
对于当前我们研究的问题来讲,第二种方法才是恰当的方法,使用第二种方法既能对创建房间时的广播进行监听,又能对游戏进行时的 P2P 进行监听,但是我还是打算把第一种方法写上,一方面是对自己分析过程的记录,另一方面也希望能提醒自己遇到问题不要想当然,要有扎实的理论基础,从理论出发去分析问题。
读者若是不感兴趣可以直接跳过 **监听创建房间阶段的封包数据** 与 **监听游戏进行阶段的封包数据(错误方法)** ,可直接从 **监听游戏进行阶段的封包数据(正确方法)** 开始阅读。
### 分析工具
Wireshark
tcpdump
逍遥安卓模拟器工作室版
### 获取封包
#### 监听创建房间阶段的封包数据
##### 搭建测试环境
第一步:配置电脑搭建一个热点,ssid 为 jack,密码为 jackjackjack
```bat
@echo off
netsh wlan set hostednetwork mode=allow ssid=jack key=jackjackjack
net start "Windows Firewall"
netsh wlan start hostednetwork
pause
12345
```
第二步:测试将测试所用的两部安卓手机连接到我们电脑搭建的热点上
第三步:用 Wireshark 监听虚拟 wif 所对应的网卡
![](https://www.writebug.com/myres/static/uploads/2021/12/24/e1e7bde5c9af5b0d948ad13a3d724094.writebug)
##### 监听并分析创建房间时的封包数据
使用手机连接电脑搭建的热点,随后进入元气骑士,创建一个房间,观察到有 UDP 封包如下:
![](https://www.writebug.com/myres/static/uploads/2021/12/24/2427424ecc03fd16dcd39bd2023e5996.writebug)
192.168.137.110 是手机接入热点后,DHCP 给手机分配的内网 ip,当有玩家创建游戏房间时,玩家所在主机(192.168.137.110)会往 192.168.137.255 发送一封 UDP 封包,可见封包内容包括版本号、房间名和一些其他的配置信息。192.168.137.255 是一个特殊的地址,它最后 8 为全是 1,说明这是一个广播地址,向这个地址发送的数据会广播给同一网段下(192.168.137.0/24)下的其他主机。
#### 监听游戏进行阶段的封包数据(错误方法)
将另一台主机连接热点,加入游戏,观察 Wireshark 监听的封包情况:
![](https://www.writebug.com/myres/static/uploads/2021/12/24/d07fb84b4378d0447a11da2142b7c843.writebug)
当另一台手机加入游戏后,Wireshark 并没有监听到什么可疑的封包,只是主机创建房间的消息一直在广播,之后我开始了游戏,房间内只有我的两部手机,手机 A 的角色移动也同步传输到了手机 B,但是 Wireshark 中并没有从 A 到 B 的数据包(无论 TCP 还是 UDP 都没有),这曾经让我一度陷入困惑。
随后我又观察到,在游戏的过程中,不断能接收到 ARP 封包,在广播寻问手机 A(192.168.137.110)、手机 B(192.168.137.92)的物理地址。![](https://www.writebug.com/myres/static/uploads/2021/12/24/e0d2b9356716c671dea70b518bdee1d6.writebug)
这说明,他们之中绝对有通信,只是 Wireshark 并未监听到。
#### 问题分析过程:
出现了理论上应该存在、但是却监听不到的封包着实让我头疼。期初我的想法是,两个游戏角色的行为可以同步,说明他们之间绝对有数据往来,二者都连接到我电脑的热点上,按理说,我电脑虚拟 wifi 的网卡是二者数据往来的必经之路,只要在这里设下监听,什么数据都应该尽收眼底,所以我曾一度认为是软件配置和使用方法的问题,但我又能找到方法证明软件和配置都没有问题,那么问题出在哪里呢?我从中午思考这个问题一直到凌晨两点都未曾想通,要是这个问题解决不了,后面也无法继续了。
凌晨两点,我关了房间的灯,准备卧床睡觉,在床上我尽力回忆着计算机网络相关的理论知识,企图推出问题的原因,我想到了我的计网老师,我努力回想她上课讲过的每一句话……甘霖娘,我没去上几节课,上课也复习数学来着,仅剩的记忆也就是她最后一节课让我打扫实验室来着……
这事不怪老师,是我自己没去上课,虽然我没去上过课,但是书我还是看了,书中自有黄金屋,我又开始努力想,书上都写了什么?突然一句话映入我的脑海
> 我们知道适配器有过滤功能。但适配器从网络上每收到一个 MAC 帧就先用硬件检查 MAC 中的目的地址。如果是发往本站的帧则收下,然后再进行其他处理。否则就将此帧丢弃,不再进行其他处理。
>
> ——《计算机网络》第七版 P95 页 第四段
我清楚的记得这句话,上述引用是书中原文,这句话让我印象非常深刻,因为它有错别字!
> 但适配器从网络上每收到一个 MAC 帧就先用硬件检查 MAC 中的目的地址。
这句话的第一个字显然是错字,此处用”但”逻辑不通,应该“当”,作者打字的时候少打了个“g“。
目前的路由器兼有交换机的功能,加之监听到的数据包中有很多 ARP 协议,事件的全貌一下就理出来了:
- 当手机 B 玩家加入游戏后,B 得到了手机 A 的 IP 地址
- B 向 A 发送 IP 报,IP 报在数据链路层封装成帧,通过 ARP 协议得到了 IP 对应的 MAC 地址
- 当 B 发送出去的 MAC 帧传输到我的电脑时,我电脑负责交换机功能的那一部分硬件,直接将 B 发送的帧转发给了 A,并没有向上传输
- Wireshark 监听我电脑负责路由的那一部分,B 发送给 A 的 MAC 帧没到这一层,所以监听不到 AB 之间直接通信的数据报
#### 混杂模式
按理说,开启混杂模式,应该就可以监听到 MAC 帧了,但是这里我并未成功,具体原因不明,先 mark 日后探究。
##### 监听游戏进行阶段的封包数据(正确方法)
总之,进行到这一步,想获取游戏进行阶段的封包数据,只在网关监听是万万不行的了,必须想办法在安卓上直接对设备网卡进行监听。幸亏 Android 和 Linux 有着千丝万缕的联系,在安卓上可以直接执行 shell,这才为在安卓上拦截封包提供了可行性。想实现封包的拦截需要有:
1. 一台支持 adb 的、已经 root 的手机
2. tcpdump 工具
我使用的是逍遥安卓模拟器工作室版,在它根目录下有一个叫 memuc.exe 的工具,可以提供 ADB 支持,同时该模拟器默认就是已经 ROOT 的,很好满足了我的第一个需求。
按住 Shift,右键点击根目录文件件空白处,
基于Java实现的元气骑士公网异地联机游戏设计.zip
版权申诉
102 浏览量
2023-06-18
18:09:11
上传
评论
收藏 80KB ZIP 举报
shejizuopin
- 粉丝: 9533
- 资源: 1288
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈