これで、サードパーティのサーバーなしで2人の間で直接「UDPホールパンチング」を行うことは非常に難しく、時には不可能であることを確信しています。ここに質問してくださいそして私の答えは以下にあります)。
それでは、UDPホールパンチングを行う方法は?そしてサードパーティのサーバー?
例:
peerA$ nc -u -p 7777 serverIP 8888
このパケットはPeerAのNATによって変換され、localnetworkIP
ソースpeerApublicIP
ポートは7777から55123に変換されます。
サーバーはこのパケットが到着するのを見て、PeerAのパブリックIP +ポート55123を覚えています。この情報(ピアAのパブリックIP + 55123)をピアBに提供し、その逆も同様です。 NATによって8888から42000ポートに変換されたことを覚えています)。
これでPeerAはこれを行うことができます
peerA$ nc -u -p 7777 peerBpublicIP 8888 # will be dropped by peerB but at least it will
# punch a hole in peerA's firewall, port 55123
ピアBは、ピアAに接続するために宛先ポート55123を使用する必要があることを知っています(この情報はサーバーによって提供されます)。
peerB$ nc -u -p 8888 peerApublicIP 55123
質問:これは、次の仮定の下で動作するようです。
もし
peerA$ nc -u -p 7777 serverIP 8888
ソースポートを7777から55123に変換します。それから
peerA$ nc -u -p 7777 peerBpublicIP 8888
また、ソースポート7777を55123に変換します。
しかし、ほとんどのルーターはこんな感じですか?
そうでない場合(たとえば、NATはサーバーに接続すると7777を55123に変換しますが、NATはピアBに接続すると7777を51098に変換します)UDPホールパンチングはどのように機能しますか?
長い話を短く:より一般的には、ピアA、ピアB、およびサーバーを含む単にを使用してUDPホールパンチングを実行する方法は何ですかnetcat
(後者は最初にのみ使用され、後で使用されません)。
ノート:読みましたこの記事しかし、ポート翻訳が完了したかどうかはわかりません。同じようにサーバーに接続してからピアBに接続するとき。