前言:,經過在網上,和書上查閱了一些資料,了解了一些情況,現在就總結一下我的解決方案吧(本人也是在不斷錯誤中學習,如果有什麼不對的地方,請大家多多指教)。
問題描述:
問題分析:
首先,在不同網路點之間(即peer-to-peer對等網路),可以分為以下幾種情況:
1.clienta在子網,clientb也在同乙個子網2.clienta在子網,clientb在外網
3.clienta在乙個子網內,clientb在另乙個子網內
對於第一種情況,不需要經過路由器的**,可以直接相互通訊。
對於第二種情況,clientb對於clienta是公開的,clienta對於clientb是透明的。
clienta-->直接相通-->clientb,clientb-->不能直接想通-->clienta。換句話說,clienta都能接受到包涵真正傳送者ip的資料報;如果clienta傳送資料報給clientb,clientb接受資料報的ip**並不是clienta,而已中轉站(路由器)的ip。
對於第三種情況,兩者之間都是相互透明的。解決方案:
要解決p2p跨區域網,就要用到nat穿透技術,我在這裡先講udp穿透,tcp穿透原理一樣,實現更簡單,這裡就不多說了。
nat的全稱是network address translator,網路位址轉換。一般是應用於路由器,更詳細資料請自己查閱資料吧。nat分兩大類:
1)nat
2)napt ,network address port translator,網路位址埠轉換
這裡預設是用nat,埠號沒有轉換,如果是napt,實現的原理也是差不多的,只是細節不同。
關於第二種情況,原理如下:a:192.168.1.10,處於內網
nata:路由器對外的wlanip:168.38.2.2;路由器對內的lanip:192.168.1.10
b:168.38.2.225,處於外網
1.首先,a(內網ip)先向b(外網ip)傳送udp包,nat會產生session,存放192.168.1.10-- >168.38.2.225的對映關係此時,a為了b在nat上打了乙個洞2.接下來,只要b把資訊發給nata,nata會自動把資訊**給a這樣a,b之間的nata會有個洞來讓兩者通訊,但是此方案不適用於第三種情況。關於第三種情況,原理如下:首先,我先介紹下這個伺服器的作用。所有的客戶端都和伺服器建立了面向連線可靠的tcp連線,即伺服器--客戶端之間可以相互通訊。客戶端會向客戶端傳送自身的真實ip(如a:192.168.1.110),伺服器接受到這資訊之後,同時也會知道資訊源的ip(如:nata的外網ip:210.38.196.110),因為接受方總能知道資訊包的最直接**。此時,伺服器就記錄了clienta的ip、nata外網ip和clientb的ip、natb外網ip。要想ab之間無需經過第三方的通訊,必須在nata中為b打個洞,在natb中為a打個洞。實際上就是在nata中存放a(192.168.1.110)--->natb(外網ip:210.38.196.30)的對映,這樣只要是從natb傳送到nata的,都會**到a子網中,此過程叫nata為b打洞。同理natb也可以為a打洞。具體過程:server會傳送資訊告知a,b的natb的外網ip;告知b,a的nata的外網ip。這樣子,a可以先傳送乙個資料報到natb(外網ip:210.38.196.30),nata會生成乙個session記錄a————>natb的對映關係。資料報到達natb時,natb因為還未為a打洞,會丟包。然後b向nata(外網ip:210.38.196.110)傳送資料報,natb會生成乙個session記錄b————>nata的對映關係。此時,nata接受到來自natb的資料報,會查詢下session對映,發現有a————>natb的對映關係,會把包**給a。只要a再發資訊給natb時,natb也會根據session來**給b。雙方打洞完成。所以對於第二種情況,也可以用此方案,如圖:利用第三方伺服器來幫p2p對等點之間的udp打洞,是比較全面的方案,此方案適用於p2p對等點在任何網路點(說得可能比較絕對吧,大家有什麼不同意見記得提出來哦,純屬個人的偏見)總結:簡單說下tcp穿透原理吧,分四種情況:1.建立tcp等待連線方和請求tcp連線方在同乙個子網,或者是外網(不用穿透)2.建立tcp等待連線方在外網,請求tcp連線方在內網(請求方會先發請求資訊,同時為建立方打洞)3.建立tcp等待連線方在內網,請求tcp連線方在外網(需要第三方伺服器,原理同上面的udp穿透一樣)
4.建立tcp等待連線方,請求tcp連線方分別在不同的子網(需要第三方伺服器,原理同上面的udp穿透一樣)
不足:由於我開發的只是簡單的即時通訊系統,可能很多複雜的情況我沒有考慮進去,例如存在多個nat的巢狀,naptip位址埠號轉換沒有考慮進去,路由器中的session的生命週期的不確定(有時候是幾分鐘,有時候幾個小時不定),所以需要定期地進行穿透等等等等。最後:這是我第一次在csnd發的部落格,有什麼不足或者錯誤希望大家多多指教,也希望大家能和我多多分享更多資源和知識~~!關於使用UDP TCP 跨區域網,NAT穿透的心得
前言 問題描述 問題分析 首先,在不同網路點之間 即peer to peer對等網路 可以分為以下幾種情況 1.clienta在子網,clientb也在同乙個子網 2.clienta在子網,clientb在外網 3.clienta在乙個子網內,clientb在另乙個子網內 對於第一種情況,不需要經過...
關於使用UDP TCP 跨區域網,NAT穿透的心得
前言 問題描述 問題分析 首先,在不同網路點之間 即peer to peer對等網路 可以分為以下幾種情況 1.clienta在子網,clientb也在同乙個子網 2.clienta在子網,clientb在外網 3.clienta在乙個子網內,clientb在另乙個子網內 對於第一種情況,不需要經過...
關於使用UDP TCP 跨區域網,NAT穿透的心得
前言 經過在網上,和書上查閱了一些資料,了解了一些情況,現在就總結一下我的解決方案吧 本人也是在不斷錯誤中學習,如果有什麼不對的地方,請大家多多指教 問題描述 問題分析 首先,在不同網路點之間 即peer to peer對等網路 可以分為以下幾種情況 1.clienta在子網,clientb也在同乙...