Switch lan-play原理

8 4月

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2020/04/08/switch-lan-play/



Switch的机器要是被ban了(原因可能有很多,比如买了淘宝数字版。。。),最大的问题就是不能联网了,但是部分游戏是支持局域网联机和当面联机的,所以理论上是可以一起玩的。

lan-play的作用就是可以让大家在网络环境下也做到当面联机或者局域网联机的效果,这样足不出户就可以和朋友联机。

由于最近用lan-play老是炸岛,所以花时间看了下大致原理。lan-play大体工作原理如下:

其中电脑运行了lan-play client,它会和私服链接。而你的Switch需要和电脑链接同一个路由器。

Switch和lan-play client的通讯

Switch和lan-play client在一个路由下,而Switch上配置的IP和Gateway地址配置了10.31.XX.XX和10.13.37.1,但是实际上lan-play并没有在这个IP提供服务,而是通过pcap监听相关的包,这就是为什么安装lan-play的第一步是安装pcap。

pcap是一个抓包工具,支持协议比较广泛,包括

  • Ethernet, Linux SLL, raw IP, PPP (RFC1661, RFC1662), BSD (Mac OS X) loopback encapsulation, and Radiotap
  • IEEE 802.11
  • Probe Request
  • LLC and SNAP
  • IEEE802.1Q
  • ARP
  • IPv4 (RFC791 and RFC1349) and IPv6 (RFC2460)
  • ICMPv4 (RFC792) and ICMPv6 (RFC4443, RFC4861, and RFC6275)
  • TCP (RFC793, RFC2018, and draft-ietf-tcpm-1323bis-21), UDP, and SCTP (only common header)
  • GTPv1 (only GTP-U and GTP-C header)
  • DNS (RFC1035, RFC3596, and RFC6844)

所以lan-play client会在网卡上抓包,进而伪装作为路由器和Switch交互。pcap抓包最重要的一个配置是filter,lan-play使用的是net 10.13.0.0/16 and not ether src mac地址。也就是10.13网段所有包都会被监听。

当client收到server的数据以后,会进行一些判断,改写mac等信息后调用pcap_sendpacket方法将包再次发出。

lan-play client和server通讯

lan-play client和server之间的交互就灵活多了,这里有一个自定义协议,包含了这几种操作

static int LAN_CLIENT_TYPE_KEEPALIVE = 0;
static int LAN_CLIENT_TYPE_IPV4 = 1;
static int LAN_CLIENT_TYPE_PING = 2;
static int LAN_CLIENT_TYPE_IPV4_FRAG = 3;
static int LAN_CLIENT_TYPE_AUTH_ME = 4;
static int LAN_CLIENT_TYPE_INFO = 0x10;

LAN_CLIENT_TYPE_KEEPALIVE

这个是保活请求,收到后不处理。保活是10秒一次,发送成功后服务端的在线人数就会加1。

保活包如下

         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 00                                              |.               |
+--------+-------------------------------------------------+----------------+

LAN_CLIENT_TYPE_PING

ping-pong通讯用的,发送以后会收到内容一样的返回值。

ping-pong包如下

         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 02                                              |.               |
+--------+-------------------------------------------------+----------------+

LAN_CLIENT_TYPE_IPV4和LAN_CLIENT_TYPE_IPV4_FRAG

这两个是主要的通讯载体,区别在于第一个没有数据,第二个包含数据内容。这里面除了类型以外还有三部分数据,第一个是来源(就是我们自己的IP),第二个目标(和你联机的用户的IP),第三部分是可选的,就是通讯所需的数据包。

数据传送到私服以后,私服会获取来源IP和目标IP,如果目标IP在IP池中,就直接发送信息包到对方的lan-play client中,lan-play转发数据包给Switch,如果不在,就做一次广播。私服的IP池缓存30秒。

这里的server有两个版本,老版本是nodejs的,版本号1.X;新版本是rust写的,版本号2.X。



本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2020/04/08/switch-lan-play/

发表评论

电子邮件地址不会被公开。