打個(gè)比方,就拿War3來(lái)說(shuō)吧:
1、你是怎么看到局域網(wǎng)里誰(shuí)開(kāi)了主機(jī)的?
魔獸這游戲是靠UDP廣播找主機(jī)的。每臺(tái)電腦都盯著一個(gè)固定端口(比如6112),誰(shuí)開(kāi)房,就往整個(gè)局域網(wǎng)發(fā)個(gè)我開(kāi)好啦的消息,目標(biāo)地址是255.255.255.255,這就是UDP廣播。其他機(jī)器收到這個(gè)包,就知道有人建房了,列表里就能看見(jiàn)。
2、那點(diǎn)加入之后發(fā)生了啥?
點(diǎn)加入的時(shí)候,你的電腦就會(huì)用TCP去連主機(jī),IP從廣播里拿到,端口還是6112。主機(jī)要是沒(méi)滿員、沒(méi)關(guān)房,就會(huì)accept這個(gè)連接,然后發(fā)地圖信息、玩家列表這些數(shù)據(jù)過(guò)來(lái),你就進(jìn)去了。之后你和主機(jī)就靠這條TCP鏈通信,一路打完。
3、那平臺(tái)是怎么搞跨網(wǎng)聯(lián)機(jī)的?
關(guān)鍵在這兒:平臺(tái)會(huì)劫持你電腦上的tcp.connect和tcp.accept這兩個(gè)操作。你點(diǎn)加入時(shí),它不讓直接連對(duì)方,而是把連接地址偷偷改成127.0.0.1(也就是本地代理)。同時(shí)它也hook住accept,假裝你是主機(jī)。
然后平臺(tái)在背后幫你把連接請(qǐng)求轉(zhuǎn)發(fā)到真正的主機(jī)那邊。如果對(duì)方同意接入,平臺(tái)就在本地造一個(gè)虛擬TCP連接給你冒充真的。所有你發(fā)的數(shù)據(jù),都被平臺(tái)截住,打包成目標(biāo)虛擬IP + 數(shù)據(jù) + 我的虛擬IP這種格式,走UDP發(fā)給服務(wù)器。服務(wù)器一查表,知道目標(biāo)真實(shí)IP,再轉(zhuǎn)出去——這就實(shí)現(xiàn)了外網(wǎng)變內(nèi)網(wǎng)的效果,全程像在局域網(wǎng)打一樣。
1、你是怎么看到局域網(wǎng)里誰(shuí)開(kāi)了主機(jī)的?
魔獸這游戲是靠UDP廣播找主機(jī)的。每臺(tái)電腦都盯著一個(gè)固定端口(比如6112),誰(shuí)開(kāi)房,就往整個(gè)局域網(wǎng)發(fā)個(gè)我開(kāi)好啦的消息,目標(biāo)地址是255.255.255.255,這就是UDP廣播。其他機(jī)器收到這個(gè)包,就知道有人建房了,列表里就能看見(jiàn)。
2、那點(diǎn)加入之后發(fā)生了啥?
點(diǎn)加入的時(shí)候,你的電腦就會(huì)用TCP去連主機(jī),IP從廣播里拿到,端口還是6112。主機(jī)要是沒(méi)滿員、沒(méi)關(guān)房,就會(huì)accept這個(gè)連接,然后發(fā)地圖信息、玩家列表這些數(shù)據(jù)過(guò)來(lái),你就進(jìn)去了。之后你和主機(jī)就靠這條TCP鏈通信,一路打完。
3、那平臺(tái)是怎么搞跨網(wǎng)聯(lián)機(jī)的?
關(guān)鍵在這兒:平臺(tái)會(huì)劫持你電腦上的tcp.connect和tcp.accept這兩個(gè)操作。你點(diǎn)加入時(shí),它不讓直接連對(duì)方,而是把連接地址偷偷改成127.0.0.1(也就是本地代理)。同時(shí)它也hook住accept,假裝你是主機(jī)。
然后平臺(tái)在背后幫你把連接請(qǐng)求轉(zhuǎn)發(fā)到真正的主機(jī)那邊。如果對(duì)方同意接入,平臺(tái)就在本地造一個(gè)虛擬TCP連接給你冒充真的。所有你發(fā)的數(shù)據(jù),都被平臺(tái)截住,打包成目標(biāo)虛擬IP + 數(shù)據(jù) + 我的虛擬IP這種格式,走UDP發(fā)給服務(wù)器。服務(wù)器一查表,知道目標(biāo)真實(shí)IP,再轉(zhuǎn)出去——這就實(shí)現(xiàn)了外網(wǎng)變內(nèi)網(wǎng)的效果,全程像在局域網(wǎng)打一樣。