為什麼需要打洞呢?主要是不同區域網路的電腦,他們通過一台路由器連接配接Internet上外網,由于不同區域網路的電腦IP是内部IP,連接配接外網是通過内網的伺服器的路由器臨時分派一個通信端口實作的,區域網路絡内部的電腦并不是真正Internet上的一個節點,這樣不同區域網路絡的電腦肯定無法通過Internet直接通信了(因為他們之間根本不知道對方在哪裡)。那是不是沒有辦法實作呢?肯定有,那就是把很多人都整得迷迷糊糊UDP打洞技術。
網上很多文章,又是圖有是表,又是一大堆理論,看起來很專業,其實很多人講了半天,估計自己很可能沒有真正寫過打洞程式, 讓我們這些寫代碼的人雲裡霧裡!其實我用幾句話就能說明白:
1)打洞技術需要借助一個真正的Internet伺服器,目的讓對方都能找到這個伺服器上的橋接器(其實就是我們程式設計人員寫的一個程式啦)。
2)打洞的A和B雙方都需要連接配接到這個伺服器上的橋接器,連接配接成功後,這個橋接器将需要打洞的A、B雙方的IP和通信端口(雙方局域 路由器臨時分派的Port)做好記錄。
3)橋機器分别告訴A和B對方的IP和端口。
4)A直接向B發請求,B也向A發請求,這樣通信建立了。
注意大多數路由器都支援打洞,有的不一定。另外路由器分派的端口,很多情況下是變動的(5分鐘可能變一次),橋機器應該動态更新這個Port且告訴對方。
UPD實作不同區域網路的電腦直接通信,不通過伺服器轉發,QQ等軟體發檔案基本上UDP這種方式,這樣降低伺服器開銷,實作更加高效的點對點通信。
很多朋友問TCP能打洞嗎?我覺得不能,因為TCP是面上連接配接的,技術應該不可行。
今天晚了,不想寫了,如果有需要列子的朋友,可以聯系我。