本地サービスの検出機構(LSD)は、SSDP に似たメカニズムを提供し、特定のグループ内での存在をローカルな近隣に宣言します(UDP マルチキャストを介した HTTP プロトコル)。これにより、他のローカルデバイスがどのサービスを提供しているかを知ることができ、相互間の通信とデータ転送を容易にすることができます。このメカニズムは、ローカル転送の主要な対等なソースとして機能するだけでなく、グローバルユニキャストアドレスでのみ実行される他のソースを補完するためにも使用できます。
プロトコル#
LSD は次のマルチキャストグループを使用します:A) 239.192.152.143:6771 (org-local)
および B) [ff15::efc0:988f]:6771 (site-local)
。
実装の注記:マルチキャストグループはローカルネットワークよりも広範囲であるため、IP_MULTICAST_TTL ソケットオプションをデフォルト値よりも大きな値に設定する必要がある場合があります。
LSD プロトコルのアナウンスメッセージの形式:
BT-SEARCH * HTTP/1.1\r\n
Host: <host>\r\n
Port: <port>\r\n
Infohash: <hash>\r\n
cookie: <cookie (optional)>\r\n
\r\n
\r\n
host#
Host は、RFC 2616 セクション 14.23 および RFC 2732 の仕様要件を満たす必要があります。これは、アナウンスメッセージを送信するマルチキャストグループアドレスを指定するために使用されます。
RFC 2616 は HTTP/1.1 の仕様書であり、HTTP プロトコルに関する情報を定義しています。その中で、セクション 14.23 は Host ヘッダーの形式を説明しています。 Host ヘッダーは、リクエストの対象サーバーのホスト名とポート番号を指定するために使用されます。一方、RFC 2732 は URL の標準です。これにより、IPv6 アドレスを使用して URL のホスト名を表すことができます。つまり、LSD プロトコルの Host ヘッダーでは、マルチキャストグループのアドレスを表すために IPv6 アドレスを使用できます。
port#
このフィールドは、bittorrent クライアントがリッスンしているポート番号を 10 進 ASCII コードで指定します。
hash#
このフィールドは、40 桁の 16 進数で表される infohash 値であり、トレントファイルを一意に識別するために使用されます。
複数の infohashes を送信する場合、データパケットの長さが 1400 バイトを超えないようにするために注意する必要があります。これは、ネットワーク転送中にデータパケットの長さが最大転送単位(MTU)のサイズを超えると、IP フラグメンテーションが発生し、ネットワーク転送効率が低下し、データパケットの損失のリスクが増加するためです。
cookie#
透過的な値であり、クライアントにとっては完全に未知で見えない値であるため、クライアントに送信するだけで十分であり、さらなる説明は必要ありません。この値の目的は、クライアントが自分自身が送信したアナウンスリクエストを受け取ったときに重複処理を避けるために、クライアントが送信する際にフィルタリングすることを許可することです。
クライアントが理解しない追加のヘッダ情報は無視する必要があり、前方互換性を確保するためです。
実装#
まず、クライアントがスワームに参加している場合、他のクライアントがその存在を知り、それに接続できるようにするために、クライアントは各インターフェースで 5 分ごとに LSD アナウンスを送信する必要があります。大規模なネットワークでマルチキャストストームを引き起こすのを避けるために、クライアントは 1 分あたり最大 1 回のアナウンスしか送信できません。
次に、クライアントが同時に 5 つ以上のトレントのダウンロードまたはアップロードを行っている場合、クライアントは各トレントで順番にアナウンスを送信するか、単一のアナウンスに複数の infohashes(異なるトレントのハッシュ値)を含めることができます。これにより、他のクライアントはこれらの情報を使用してクライアントとの接続を確立できます。
クライアントが他のクライアントの LSD アナウンスを受信した場合、UDP ソースアドレスに基づいてリモートクライアントの IP アドレスに連絡する必要があります。
まとめ#
BitTorrent プロトコルでは、Local Service Discovery(LSD)は、ローカルネットワーク内の他の BitTorrent クライアントを検出するためのローカルサービスディスカバリメカニズムです。BitTorrent クライアントが起動すると、LSD を介して自身の存在をブロードキャストし、他のクライアントからのブロードキャストメッセージを受信してピア間の接続を確立します。
LSD は、UDP マルチキャストを使用してローカルネットワーク内で他のクライアントを迅速に検出します。同時に、LSD は他のローカルサービスディスカバリプロトコル(例:mDNS)と組み合わせて使用することもでき、ローカルネットワーク内のデバイスの検出効率をさらに向上させることができます。
LSD は、BitTorrent プロトコルの重要な構成要素であり、ノードの検出を加速し、ファイルのダウンロード速度と安定性を向上させることができます。