p2p之udp 穿透nat 原始碼分析
說明:
有關這方面的介紹很多,請參考p2p 之udp 穿透nat 的原理與實現的講解。主要技術就是nat ,網路位址轉換。
要強調的一點是,當內網客戶端要連線公網伺服器時,會在nat 上建乙個session, 並且分配乙個埠( 十分重要) ,並且記錄相應的公網ip 位址和埠。這個時候,從該公網伺服器傳送的資料到該埠的資料,將會被**到該內網客戶端,其它ip 傳送到該埠的資料,將被拋棄。
如果客戶端的套接字同時向兩個不同的公網伺服器連線。nat 的處理是不同的,symmetric nat是會再建乙個session並且分配乙個新埠號,而cone nat會再建乙個session,但仍然使用原來的埠號。
穿透原理:
返回到前面講的內容。我們要收到外網的資料,必須要傳送乙個資料報,會在nat 上建乙個session, 並且分配乙個埠( 十分重要) ,並且記錄相應的公網ip 位址和埠。就可以收到該公網傳送過來的資訊。
所以問題就變為:內網客戶端a 傳送乙個資料報連到natb 的公網位址。然後就可以接收到natb 公網位址傳送過來的資料(其實是由內網使用者外發,它只是**)。但是現在問題來了:a 客戶端通過公網伺服器得到了natb 的外網ip 及埠,於是就發資料過去,滿懷信心的等待連線,沒想到資料到了natb 這裡,natb 說:「我內網的使用者又沒有連線你,那有不請自己來,我不認識你。」於是就把資料拋棄了。b 客戶端也同樣這樣。a 和b 都想把公網nat 資訊告訴對方,只要有一方收到訊息就可以通訊,問題是雙方沒有連線,怎麼能通知該訊息呢?所以這個問題就需要由公網伺服器來處理。
當a 想和b 通訊的時候, 需要向公網伺服器傳送訊息,由公網伺服器把訊息傳送給b ,b 再向a 傳送連線請求( 打洞) 。然後b 就可以接受a 的訊息了。b 想和a 通訊的時候,也是同樣的道理。
這樣a 即能和公網伺服器通訊,又可以和b 客戶端通訊了。
注意:因為nat 裝置會收回一些不活動的session ,因此,雙方必須經常互發心跳資料報,讓session 一直存活著。
伺服器端原始碼簡單分析:
伺服器啟動後,啟動訊息執行緒。接受資料,然後,根據訊息頭(登入,下線,打洞,得到使用者列表,傳送檔案等)。
登入流程:
就建立乙個使用者結構,並把使用者的姓名,ip ,埠號加入到使用者列表中(這裡使用者的ip ,實際是nat 的公網ip )。
下線流程:
直接從使用者列表中刪除該使用者資訊。
使用者列表:
定時傳送使用者列表給使用者,或者使用者主動請求使用者列表。
打洞:
a客戶端請求連線b 客戶端的,把b 客戶端的ip ,埠號(nat 外網位址)傳送給b ,b 收到之後傳送乙個資料到a 的nat 外網位址。
客戶端原始碼簡單分析:
登入流程: 把使用者資訊,傳送給公網伺服器。
退出流程: 傳送相應訊息,給公網伺服器。
使用者列表: 傳送相應訊息,從公網伺服器得到使用者列表資訊。
連線其它客戶:
*流程:直接向某個使用者的外網ip 傳送訊息,如果此前沒有聯絡過
*那麼此訊息將無法傳送,傳送端等待超時。
*超時後,傳送端將傳送乙個請求資訊到服務端,
*要求服務端傳送給客戶c 乙個請求,請求c 給本機傳送打洞訊息
*以上流程將重複maxretry 次
乙個執行緒接受資料:
接受訊息:其它使用者發來的訊息
接受公網伺服器發來的打洞訊息。
接受使用者列表訊息。
接收公網伺服器發來的心跳資料。
P2P之NAT穿透問題
stun協議 rfc3489 詳見http www.ietf.org rfc rfc3489.txt 提出了4種nat型別的定義及其分類,並給出了如何檢測 在用的nat究竟屬於哪種分類的標準。但是,具體到p2p程式如何應用stun協議及其分類法穿越nat,則是仁者見仁 智者見智。因為stun協議並沒...
P2P之NAT穿透原理
p2p之nat穿透原理介紹 一次專案中,對於主動協議接入的裝置,客戶希望能夠裝置端直接推送碼流到客戶端以此減少中心 的負載。所以對p2p這塊方案做了了解,這裡做下整理。即對等計算機網路,是一種在對等者 peer 之間分配任務和工作負載的分布式應用架構 是對等計算模型在應用層形成的一種組網或網路形式。...
P2P 之 UDP穿透NAT的原理與實現
原創 shootingstars 參考 http midcom p2p.sourceforge.net draft ford midcom p2p 01.txt 論壇上經常有對p2p原理的討論,但是討論歸討論,很少有實質的東西產生 源 呵呵,在這裡我就用自己實現的乙個源 來說明udp穿越nat的原理...