所用屬於和代號。
a : 私網中的主機,設私網ip為192.168.1.2
b : 另一私網中的主機,設私網ip為192.168.245.10
s : 公網中的主機,在此做中間伺服器,設ip為223.11.11.11
nat: net address transmission,在此可以理解為路由器
nat-a:a所在的私網路由器,假設公網ip為188.11.11.11
nat-b:b所在的私網路由器,假設公網ip為199.11.11.11
打洞需要突破幾個關鍵的壁壘,
1. a,b互相無法知道對方公網ip,a,b也不知道自己公網ip。
解決辦法:借助公網伺服器s牽線搭橋。
2. nat會阻擋不明**的資訊貨連線。就是說,即使a知道b的公網位址(包括ip和埠)也無法給b連線請求或資訊,因為nat-b會阻擋不明**的 資訊或連線,此舉是nat過去阻擋syn攻擊的有效手段。
a-->nat-a-->nat-b-->b就會被nat-b放行。於是連線成功。
3. 還有很多nat不支援hairpin,即不支援曲線路由,即假設c,d處於同一內網的主機,那麼他們不可通過nat通訊。即: c-->(nat-c-->nat-d)--d是不行的。所以這種情況只能直接用私網位址通訊c--->d。
假設a(192.168.1.2::1000)第一次經由nat-a時隱射到位址(188.11.11.11::1111)到達s,那麼以後從a(192.168.1.2::1000)出來的資訊或連線都會到nat-a (188.11.11.11::1111)後,再到公網。也就是說,(188.11.11.11::1111)總是a(192.168.1.2::1000)的公網位址,這一對映會在nat-a上保留一段時間(大於20秒),這使得穿越成為可能,不管是tcp還是udp,原理一樣。
udp穿越步驟:
3) s將a的公網位址和私網位址告訴b, 將b的公網位址和私網位址告訴a
4) a,b分別向對方的公網和私網位址傳送資訊,並等待接受對方發過來的資訊。最早返回回來的資訊的源位址,將被採納為對方的有效位址,不管是公網的還是私網的位址,此後就直接與這一有效位址通訊。需要說明的是:假設a先於b發出了第乙個訊息,那麼a的第乙個訊息會被nat-b阻擋而失敗,這一發出的訊息會在nat-a上留下印記,標明b的公網位址為可信的,然後b的任何訊息就可以順利到達a,同時b第一訊息會在nat-b上留下印記,標明a為可信位址,此後a的訊息就可以到達b。
這樣,ab就可以正常通訊。即使ab除以同一私網。
tcp穿越步驟:
原理基本和udp穿越類似,不同的是tcp在使用私網ip發起連線(connect and recv)的同時,要在此私網位址上啟動偵聽:listen and accept. 但是自xp service pack 2之後的windows系統和所有unix或linux系統的 socket都有屬性so_reuseaddr,這就可以實現。對於
不支援socketso_reuseaddr屬性的系統,可以採用順序連線來打洞的方式。即a與s連線通訊之後,斷開連線,然後嘗試與b連線,失敗後listen and accpetb的連線。
希望是對你有意義的一段文字。
這裡有demo**,可看看是怎麼實現的。
**演示了udp打洞技術的實現;
Tcp and Udp NAT 穿越穿透打洞
所用屬於和代號。a 私網中的主機,設私網ip為192.168.1.2 b 另一私網中的主機,設私網ip為192.168.245.10 s 公網中的主機,在此做中間伺服器,設ip為223.11.11.11 nat net address transmission,在此可以理解為路由器 nat a a所...
bit 穿越沙漠
參考 無上陽光13的部落格 穿越沙漠 acm.bit.edu.cn 1005 智力題 時間限制 1秒 記憶體限制 64m problem description 一輛吉普車來到 x 公里寬的沙漠邊沿 a 點,吉普車的耗油量為 1 公升 公里,油量為 500 公升。通常,吉普車必須用自身油箱中的油在沙...
穿越人海2
沒什麼好在乎的,走自己原本走得路。面對過去,面對極差的結果。不要再悲觀 不要再往壞處想,也不要再糊塗 做事要講究方法。以現在的觀點對待現在。以現在的態度面對現在。放得開,又有什麼大不了。不懂,又有什麼大不了。一切又有什麼大不了。保持理智。好好考慮別人的需求。好好做好自己。放得開,有智慧型樂的來。有智...