コンピューター/クライアントの一方または両方がパブリック IP を持っていない場合に、コンピューター/クライアントが互いに直接接続できるようにしたいと考えています。これは、仲介者としてサーバーを使用して実行できると思います。最終的に確立される接続は、クライアント間の直接トラフィックでなければなりません。これはどのようにして可能になり、その技術は何と呼ばれますか?
Java のコード fx を見てみたいと思います。
ありがとう
コンピューター/クライアントの一方または両方がパブリック IP を持っていない場合に、コンピューター/クライアントが互いに直接接続できるようにしたいと考えています。これは、仲介者としてサーバーを使用して実行できると思います。最終的に確立される接続は、クライアント間の直接トラフィックでなければなりません。これはどのようにして可能になり、その技術は何と呼ばれますか?
Java のコード fx を見てみたいと思います。
ありがとう
ポート フォワーディングがオプションでない場合は、 NAT traversalと呼ばれる UDP トラフィックで使用できる最も信頼性の高い手法があります。中間サーバーがランデブー ポイントとして機能する必要がありますが、初期設定後はすべてのトラフィックがエンドポイント間になります。
これはすべての場合に機能するとは限りません。これは、さまざまな NAT レイヤーが外部エンドポイントを内部エンドポイントにマップする方法によって異なります。
TCP NAT トラバーサルは実装が非常に難しく、機能する可能性も非常に低くなります。
(UDP NAT トラバーサルを使用して、異なる大学の 2 台のコンピューター間で OpenVPN 接続を確立することに成功しました。両方とも複数の NAT レイヤーの背後にあります!)
両方の当事者が NAT の背後にある場合は、おそらくホール パンチング( TCPまたはUDP )を使用する必要があります。このようなもの:
socket = new DatagramSocket(port);
volatile boolean connectionEstablished = false;
volatile boolean reveivedSomething = false;
送信者スレッド:
while (!connectionEstablished) {
byte[] buf = new byte[256];
buf[0]=reveivedSomething?1:0;
DatagramPacket packet = new DatagramPacket(buf, buf.length,
otherpcpublicaddr, otherpcsport);
socket.send(packet);
Thread.sleep(500);
}
レシーバースレッド:
while (true) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
reveivedSomething=true;
if (buf[0]==1) {
connectionEstablished=true;
break;
}
Thread.sleep(500);
}
(両方のPCでこれを行い、静的でない限り、到達可能なサーバーを使用してIPとポートを交換する必要があります)
Java の修正についてはわかりませんが、動的 DNS サービスを使用して、トラフィックを非パブリック IP に再ルーティングできます。彼らは、ISP によって割り当てられたパブリック クライアント IP を追跡し、それをサービスに報告するクライアントを使用していると思います。サービスはホスト テーブルを更新します。パブリック リクエストをプライベート ip に転送するために、各システムのルーターでいくつかの構成が必要になる場合もあります。
これを実行するには、ポート転送、NAT、動的 DNS など、いくつかの手法が使用されます。