打个比方,就拿War3来说吧:
1、你是怎么看到局域网里谁开了主机的?
魔兽这游戏是靠UDP广播找主机的。每台电脑都盯着一个固定端口(比如6112),谁开房,就往整个局域网发个我开好啦的消息,目标地址是255.255.255.255,这就是UDP广播。其他机器收到这个包,就知道有人建房了,列表里就能看见。
2、那点加入之后发生了啥?
点加入的时候,你的电脑就会用TCP去连主机,IP从广播里拿到,端口还是6112。主机要是没满员、没关房,就会accept这个连接,然后发地图信息、玩家列表这些数据过来,你就进去了。之后你和主机就靠这条TCP链通信,一路打完。
3、那平台是怎么搞跨网联机的?
关键在这儿:平台会劫持你电脑上的tcp.connect和tcp.accept这两个操作。你点加入时,它不让直接连对方,而是把连接地址偷偷改成127.0.0.1(也就是本地代理)。同时它也hook住accept,假装你是主机。
然后平台在背后帮你把连接请求转发到真正的主机那边。如果对方同意接入,平台就在本地造一个虚拟TCP连接给你冒充真的。所有你发的数据,都被平台截住,打包成目标虚拟IP + 数据 + 我的虚拟IP这种格式,走UDP发给服务器。服务器一查表,知道目标真实IP,再转出去——这就实现了外网变内网的效果,全程像在局域网打一样。
1、你是怎么看到局域网里谁开了主机的?
魔兽这游戏是靠UDP广播找主机的。每台电脑都盯着一个固定端口(比如6112),谁开房,就往整个局域网发个我开好啦的消息,目标地址是255.255.255.255,这就是UDP广播。其他机器收到这个包,就知道有人建房了,列表里就能看见。
2、那点加入之后发生了啥?
点加入的时候,你的电脑就会用TCP去连主机,IP从广播里拿到,端口还是6112。主机要是没满员、没关房,就会accept这个连接,然后发地图信息、玩家列表这些数据过来,你就进去了。之后你和主机就靠这条TCP链通信,一路打完。
3、那平台是怎么搞跨网联机的?
关键在这儿:平台会劫持你电脑上的tcp.connect和tcp.accept这两个操作。你点加入时,它不让直接连对方,而是把连接地址偷偷改成127.0.0.1(也就是本地代理)。同时它也hook住accept,假装你是主机。
然后平台在背后帮你把连接请求转发到真正的主机那边。如果对方同意接入,平台就在本地造一个虚拟TCP连接给你冒充真的。所有你发的数据,都被平台截住,打包成目标虚拟IP + 数据 + 我的虚拟IP这种格式,走UDP发给服务器。服务器一查表,知道目标真实IP,再转出去——这就实现了外网变内网的效果,全程像在局域网打一样。