すべて単一のサーバー プロセスに接続する必要があるクライアントがあります。クライアントがサーバーを見つけるために UDP 検出を使用しています。ディスカバリーの完了後に TCP/IP 接続を確立できるように、クライアントとサーバーで IP アドレスとポート番号を交換します。このようにして、パケット サイズは小さく保たれます。これは、UDP を使用して次の 2 つの方法のいずれかで実行できることがわかりました。
- 各クライアントは、サーバーを探して独自のマルチキャスト メッセージを送信し、サーバーはそれに応答します。クライアントは、サーバーが応答するまで、このマルチキャスト メッセージの送信を定期的に繰り返すことができます (サーバーがダウンしている場合)。
- サーバーは、定期的にマルチキャスト メッセージ ビーコンを送信します。クライアントはマルチキャスト グループにサブスクライブし、この方法でサーバーのマルチキャスト メッセージを受信して検出を完了します。
1. 多数のクライアントが存在する場合、最初は多数のマルチキャスト メッセージが送信されます (各クライアントから 1 つ)。サーバーのみがサブスクライブし、クライアントからのマルチキャスト メッセージを受信します。サーバーがクライアントに応答すると、クライアントはマルチキャスト メッセージの送信を停止します。すべてのクライアントがサーバーの検出を完了すると、マルチキャスト メッセージはネットワーク上で送信されなくなります。ただし、サーバーがダウンしている場合、各クライアントは、サーバーがバックアップされて応答できるようになるまで、間隔を置いてマルチキャスト メッセージ ビーコンを送信します。
2. では、サーバーのみが定期的にマルチキャスト メッセージ ビーコンを送信します。このメッセージは、マルチキャスト グループに加入しているすべてのクライアントにルーティングされることになります。クライアントがパケットを受信すると、クライアントの UDP リッスン ソケットが閉じられ、マルチキャスト グループに登録されなくなります。ただし、新しいクライアントがそれを検出できるように、サーバーはマルチキャスト ビーコンを送信し続ける必要があります。クライアントが必要な検出を行っているかどうかに関係なく、定期的にビーコンを送信し続けます。
ですから、どちらにもメリットとデメリットがあると思います。#1 は最初は負荷が高くなるように思えますが、最終的には負荷がゼロになります。#2 では、サーバーは永遠にビーコンを送信し続けます。
UDP とマルチキャストは私にとってかなり新しいトピックなので、どちらが好ましいアプローチで、どちらがネットワーク負荷を軽減するかを知りたいと思っています。