打洞之我見

2021-07-16 13:03:08 字數 1735 閱讀 2465

兩個處在不同內網的機器上的應用要想直接通訊(不通過第三方來交換資料),由於互相並不知道彼此的外網ip,是做不到的。

當然如果是人為干預,你知道了彼此機器的外網ip,並做好埠對映的設定,兩個是能夠互相通訊的,而這裡說的,是在互不相知的情況下如何建立通訊(這也符合生活常理,因為你較少的關注過你自己的外網ip,一些p2p應用也從來沒要求過你先設定好埠對映才能夠使用)。

為了能夠讓這樣的兩台不同內網中的p2p應用直接通訊,首先能想到的就是,可以通過第三方的幫助來讓著兩台機器建立直接的通訊。

如,有a、b、c三颱機器

a機器內網ip:10.10.0.123

外網ip:123.0.0.123

b機器:

內網ip:192.168.0.2

外網ip:211.0.0.211

c機器:222.0.0.222

那麼a、b建立連線的過程應該為,a、b機器先與c機器建立會話,這樣c就知道了a、b兩台機器各自的外網ip,然後,a、b再利用對方的外網ip來互相連線。

上述過程假設很有道理,但實際上並沒有想象的那麼簡單,因為,真正的對映不簡簡單單地是ip的對映,nat所做是:將內網某個埠發出的會話對映為外網的乙個埠,並且,不允許第三方插足這個會話,例如:a機器訪問c機器的5000埠,即:

a機器: 10.10.1.123:1234 ---對映為---> 123.0.0.123:60000  會話到  c機器: 222.0.0.222:5000

那麼,這個nat之後,逆過程只允許c機器的5000埠到123.0.0.123:60000的通訊,然後再由nat到a機器的1234,第三方就無法再插足了。於是,上面的過程貌似行不通了。

然而,由於乙個埠可以向多個服務端發出請求(建立多個對外的會話),而絕大多數nat的實現都是對映埠而不是對映會話,讓這個想法變得可以實現了,當然,有些nat是對映會話的,這種情況下就實現不了上面的方法了。

所謂的對映埠而不是對映會話的意思是,對映埠只會為內網的某個埠分配乙個外網埠來對映,而不管這個埠上建立的多少個會話。而對映會話的意思是,如果內網的乙個埠建立了多個會話連線,那麼nat會為每乙個會話都分配乙個埠,如下圖:

對映埠:

a:10.10.1.123:1234   ----對映為---->   123.0.0.123:60000  | ---會話到---> c機器

\ ---會話到---->b機器

對映會話:

a:10.10.1.123:1234  | ----對映為---->  123.0.0.123:60000    ----會話到---->c機器

\-----對映為---->  123.0.0.123:60001   ----會話到---->b機器

如果是這樣,那麼就可以借助於c機器來建立a和b的連線了。

a和b都連線到c,再由c告訴a、b對方的外網ip和埠號,然後a,b再向對方提出通訊請求,這個過程就是打洞的過程。

為什麼a、b再向對方提出通訊請求就可以了呢?因為當a向b提出連線請求時,nat就會將這個通訊的逆過程合法化,即允許b的相應埠回訪a的該埠。而此時b也做了同樣的操作,導致了a也能夠訪問b的相應埠。於是a、b間不依賴於第三方的通訊就建立了。

由上可知,有兩個機制是很重要的,乙個是乙個埠可以建立多個會話,另乙個是nat對映的是埠而不是會話(只對會話做了不允許第三方插足的通訊限制)。

還有,上面的過程顯然是適用於udp的,tcp需要乙個客戶端和服務端,而上面的過程要求通訊的兩個埠首先需要是客戶端(因為連線了第三方服務端),其中乙個再轉為服務端是否能行得通呢?進一步,tcp應該如何打洞呢?

TCP打洞和UDP打洞

1,tcp協議通訊 現在有兩台電腦a和b。在 假設a的位址為 192.168.0.100 假設b的位址為 192.168.0.102 a想給b傳送乙個字串hello,如果a,b之間採用tcp協議,那麼b收到hello的過程是怎樣的呢?首先建立連線 3次握手成功之後,a和b的鏈結才算成功 然後a在給b...

關於TCP打洞和UDP打洞

解決辦法是 a向b的公網ip傳送乙個資料報,則nat a能接收來自nat b的資料報並 給a了 即b現在能訪問a了 再由s命令b向a的公網ip傳送乙個資料報,則nat b能接收來自nat a的資料報並 給b了 即a現在能訪問b了 以上就是 打洞 的原理。但是tcp和udp在打洞上卻有點不同。這是因為...

UDP hole punching UDP打洞技術

udp打洞技術依賴於由公共防火牆和cone nat,允許適當的有計畫的端對端應用程式通過 nat 打洞 即使當雙方的主機都處於nat之後。這種技術在 rfc3027的5.1節 nat prot 中進行了重點介紹,並且在internet kegel 中進行了非正式的描敘,還應用到了最新的一些協 議,例...