簡體   English   中英

以編程方式從已知的公共服務器遍歷NAT

[英]NAT traversal from known public server programmatically

我已經對NAT穿越進行了一些研究,並從Web上獲得了有關P2P應用程序的一些建議。 但是我的情況與傳統的P2P應用有所不同,我已經有一個公共服務器,我只需要從已知的公共服務器訪問NAT后面的設備即可。

有關我的案件的詳細信息如下:

1.PC-A have public IP
2.PC-B is behind NAT, does not have public IP. In my case PC-A and PC-B is under full control.
3.PC-C is also behind NAT, and could be reached from PC-B

問題是:

  1. 有什么辦法可以在公共服務器PC-A和PC-B之間建立隧道,以便我可以使用TCP協議(甚至是UDP)從PC-A到達PC-C?
  2. 值得注意的是,所有這些都應該以編程方式完成,尤其是在Java中。是否有任何庫可以做到這一點?

在P2P對話中,您的PC-A通常被稱為“中繼”。

基本原則是,防火牆后面的所有對等設備(在您的情況下為PC-B和PC-C)都建立與PC-A的出站連接。 然后,PC-A“鏈接/綁定”連接。 通常,這些連接是通過HTTP進行的,這是防火牆友好的。 因此,為了使PC-B與PC-C進行通信,簡化的順序為:

  • PC-B和PC-C都建立與PC-A的HTTP連接
  • PC-B向PC-A發出信號,它希望將數據發送到PC-C
  • PC-B根據出站請求將其數據發送到PC-A
  • PC-A根據同步響應將數據轉發到PC-C。

當您投入時,事情變得(非常)復雜

  • 認證方式
  • 安全
  • 冗余繼電器
  • 連接超時,可靠性,恢復等...

大多數P2P框架都實現某種中繼。 對於JXTA和XMPP(檢查ICE)就是這種情況。

我相信Ian Mc Ginniss在Netty項目中也開發了一個稱為HTTP Tunnel的東西(最初是替代JXTA中繼的,有些不太理想)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM