1

p2p ベースで動作する簡単なチャット プログラムを Java で作成したいと考えています。公開サーバーを使用して接続を開始するだけです。しかし、これが可能かどうかさえわかりません。

少なくとも 1 台の PC が適切なポートを転送した場合に機能するチャット ソリューションを Java で実装することに成功しました。クライアント側でポートを転送する代わりに、外部サーバーを使用することもできました。

だから私は、どうにかして公開サーバーを使用して接続を開始し、クライアント間でデータを適切に送信して、サーバーの負荷を軽減することさえ可能でしょうか?

私はルーターの仕組みにあまり詳しくありませんが、内部 IP からパブリック サーバーを呼び出すと、ルーターはそのパブリック IP からの呼び出しと受信応答を PC に送信するよりも覚えていると思います。だから私は、おそらく最初のクライアントがサーバーに接続した場合、サーバーが2番目のクライアントに情報を渡すよりも、何らかの方法で直接通信できるのではないかと考えました。ルーターのルールがサーバーによって確立された場合は?

わかりやすく説明していただければ幸いです。そうでない場合は、ご容赦ください。これがどのように正確に行われるかさえわかりません。自分のコンセプトに何か正しいことがあるかどうかを知りたいだけで、それを実行できる可能性があるので、もっと勉強しなければなりません. ありがとう。

4

3 に答える 3

5

TeleHashはこういうことができる新しいプロジェクトだと思います。最近知ったばかりなのであまり知りません。

私はこの回答コミュニティウィキを作成したので、他の人がそれを更新して、TeleHashをこれに使用する方法を説明できます。

于 2011-04-16T18:12:17.617 に答える
4

それは膨大なテーマです。ホール パンチングを検索してください(TCP の場合: http://en.wikipedia.org/wiki/TCP_hole_punching )

于 2011-04-16T17:59:28.130 に答える
-2

編集:コメント(およびリンクされたページを読んだ後)、アドバイスを撤回する必要があります。素敵なグラフィックのために削除はしませんが、最後の部分を変更しました。


私の理解が正しければ、2 つのクライアントが両方とも NAT ファイアウォールの背後にあり、発信接続を許可しますが、そのように特別に構成されていない場合は着信接続を転送しません (ローカル ホストの宛先がわからないため)。

原則として、TCP 接続は、存在している間ずっと、常に同じ 2 つの IP アドレスとこれらのアドレスのポート番号に接続します (たとえば、一定のままの 4 つの番号があります)。NAT の場合、実際には 2 つの接続がありますが、これはクライアント コンピューター A (またはサーバー S) からは見えません。

Client A  -------(LAN)------ NAT B      ------ (Internet) -------- Server S
  IP A                   IP B1 | IP B2                               IP S
  Port a                       | Port b                              Port s

TCP パケットには、LAN 部分の [A:a / S:s] (または [S:s / A:a]) アドレスと [B2:b / S:s] (または [S:s / B2:b]) があります。 ]) インターネット部分のアドレス。接続はこの [IP:ポート / IP:ポート] の 4 重で識別されるため、4 つの番号の 1 つでも変更しようとすると、これは新しい接続でなければなりません (そうしないと、パケットが破棄されます)。

そのため、最初にサーバーと話している場合、サーバーがコンテンツを転送していない限り、同じ接続で他のクライアントと話し続けることはできません。

同じことがUDPパケットにも当てはまりますが、接続がないという違いがあり、NATは賢く、どのパケットが他のどのパケットに対する応答であるかを推測し、正しい方向に転送する必要があります。

コメントやその他の回答で指摘されているように、ここで NAT がだまされる可能性があります。最初に UDP パケットを他のクライアントに送信すると、そこで NAT によって破棄されます。しかし、その後、他のクライアントは、発信パケットに対する実際の応答ではない応答パケットを送信します (このパケットは他のクライアントの NAT のために受信されなかったため) が、IP アドレスとポート番号が一致しているため、それでも通過させられます。NAT がポート番号も変換する場合、これはさらに複雑になる可能性があります。

TCP の場合、両方の NAT が実際には開いている接続を保持せず、以前に送信された SYN があったときに単にパケットを転送 (変更) する場合、同様に機能します。ここでは TCP シーケンス番号も一致する必要があるため、さらに複雑になります。

于 2011-04-16T17:58:27.227 に答える