メインコンテンツまでスキップ

2. SRV RRの形式 (The Format of the SRV RR)

2.1 基本形式定義 (Basic Format Definition)

SRVリソースレコードの DNSタイプコード (DNS type code)33 です。

ABNF形式 (ABNF Format)

_Service._Proto.Name TTL Class SRV Priority Weight Port Target

形式の説明 (Format Description):

_Service._Proto.Name  TTL  Class  SRV  Priority  Weight  Port  Target
| | | | | | | |
クエリ名 生存 クラス レコード 優先度 重み ポート ターゲットホスト
(Query Name) 時間 タイプ
(TTL) (Class) (Type)

2.2 フィールドの詳細仕様 (Field Specifications)

2.2.1 Service (サービス)

定義 (Definition):

必要なサービスのシンボリック名 (symbolic name)。Assigned Numbers [STD 2] で定義されているか、ローカルで定義されます。

形式ルール (Format Rules):

  • プレフィックス要件: サービス識別子の前にアンダースコア (_) を追加
  • 目的: 自然に発生するDNSラベルとの衝突を回避
  • 大文字小文字: 大文字小文字を区別しない (case insensitive)

命名の注意事項 (Naming Considerations):

サービス名の規範

一部の広く使用されているサービス、特に POP は、単一の普遍的な名前を持っていません。

Assigned Numbersが示されたサービスに名前を付けている場合、その名前はSRVルックアップの唯一の合法的な名前です。

例 (Examples):

_ldap    (LDAPサービス)
_http (HTTPサービス)
_xmpp (XMPPサービス)
_kerberos (Kerberosサービス)

2.2.2 Proto (プロトコル)

定義 (Definition):

必要なプロトコルのシンボリック名 (symbolic name of the desired protocol)。

形式ルール (Format Rules):

  • プレフィックス要件: 前にアンダースコア (_) を追加
  • 目的: 自然に発生するDNSラベルとの衝突を防ぐ
  • 大文字小文字: 大文字小文字を区別しない (case insensitive)

一般的な値 (Common Values):

  • _TCP: TCPプロトコル
  • _UDP: UDPプロトコル
  • Assigned Numbersで定義されているか、ローカルで定義された任意のプロトコル名

2.2.3 Priority (優先度)

定義 (Definition):

このターゲットホストの優先度 (priority of this target host)。

データ型 (Data Type):

  • 範囲: 0-65535
  • 形式: 16ビット符号なし整数 (16 bit unsigned integer)
  • バイト順: ネットワークバイト順 (network byte order)

選択ルール (Selection Rules):

優先度処理ロジック

クライアントは、以下のルールに従って優先度を処理しなければなりません (MUST)

  1. 優先選択: 到達可能な番号が最小の優先度のターゲットホストへの接続を試みる
  2. 同一優先度: 同じ優先度のターゲットホストは、weightフィールドで定義された順序で試行すべきです (SHOULD)

2.2.4 Weight (重み) - 負荷分散のコアメカニズム

定義 (Definition):

サーバー選択メカニズム (server selection mechanism)。weightフィールドは、同じ優先度のエントリの相対的な重みを指定します。

データ型 (Data Type):

  • 範囲: 0-65535
  • 形式: 16ビット符号なし整数
  • バイト順: ネットワークバイト順

選択確率 (Selection Probability):

重みの原則

より大きな重みは、比例して高い選択確率を与えられるべきです (SHOULD)


2.3 負荷分散アルゴリズム (Load Balancing Algorithm)

2.3.1 アルゴリズムの適用シナリオ

他の重み情報の使用を要求するプロトコル仕様がない場合、クライアントは、SRV RRで指定されたターゲットホストが接続される順序で、同じPriorityのSRV RRを配置します。

以下のアルゴリズムは、同じ優先度のSRV RRを順序付けるために使用されるべきです (SHOULD)


2.3.2 加重ランダム選択アルゴリズム (Weighted Random Selection Algorithm)

アルゴリズムの説明 (Algorithm Description):

ステップ1: 初期配置 (Step 1: Initial Arrangement)

入力: すべての未ソートのSRV RRs (同じPriority)
出力: 初期候補リスト

すべてのSRVリソースレコード(まだソートされていないもの)を任意の順序で配置しますが、1つの例外があります:

Weight 0の特別な位置

すべての weight 0 のレコードは、リストの先頭 (beginning of the list) に配置されます。

ステップ2: 累積重みの計算 (Step 2: Compute Running Sum)

n個のSRVレコードがあり、重みがそれぞれ w₁, w₂, ..., wₙ の場合

総重み W = Σ wᵢ (i=1 to n)

累積重み:
RR₁の累積重み: S₁ = w₁
RR₂の累積重み: S₂ = w₁ + w₂
RR₃の累積重み: S₃ = w₁ + w₂ + w₃
...
RRₙの累積重み: Sₙ = W

数学的表現 (Mathematical Expression):

i番目のリソースレコードの累積重みは:

Sᵢ = Σ wⱼ  (j=1 to i)

ステップ3: 一様乱数の生成 (Step 3: Generate Uniform Random Number)

R ∈ [0, W]  (境界を含む、inclusive)
乱数分布の要件

0W の間(境界を含む)の一様乱数 (uniform random number) を選択します。

ここでの「一様」は、各値が選択される確率が等しいことを意味します。

ステップ4: ターゲットレコードの選択 (Step 4: Select Target Record)

選択ルール (Selection Rule):

選択された順序で、累積重み値 (running sum value) が乱数Rよりも大きいか等しい最初のリソースレコードを選択します。

数学的表現 (Mathematical Expression):

RRᵢを選択します、ただし:
Sᵢ₋₁ < R ≤ Sᵢ

ここで S₀ = 0

ステップ5: 選択したレコードを削除して反復 (Step 5: Remove and Iterate)

  1. 削除: 未ソートのSRVリソースレコードセットから選択したSRVリソースレコードを削除
  2. 追加: 新しいリストの末尾 (tail of the new list) に追加
  3. 再帰: 残りの未ソートSRV RRに対してアルゴリズムを適用
  4. 終了条件: 未ソートのSRV RRがなくなるまで続ける
重要な説明

Priority に対してこのプロセスを繰り返します。


2.3.3 アルゴリズムの例 (Algorithm Example)

シナリオ例:

同じPriorityの3つのSRVレコードがあるとします:

RR₁: Priority=0, Weight=1, Target=server1.example.com
RR₂: Priority=0, Weight=3, Target=server2.example.com
RR₃: Priority=0, Weight=6, Target=server3.example.com

計算プロセス (Calculation Process):

総重み W = 1 + 3 + 6 = 10

累積重み:
S₁ = 1
S₂ = 1 + 3 = 4
S₃ = 1 + 3 + 6 = 10

乱数Rの選択確率分布 (Probability Distribution):

R ∈ [0, 1]:   RR₁を選択 (server1) → 確率 = 1/10 = 10%
R ∈ (1, 4]: RR₂を選択 (server2) → 確率 = 3/10 = 30%
R ∈ (4, 10]: RR₃を選択 (server3) → 確率 = 6/10 = 60%

数学的検証 (Mathematical Verification):

各サーバーが選択される確率は、その重みが総重みに占める割合に等しくなります:

P(RRᵢ) = wᵢ / W

これにより、負荷分散が重みに比例することが保証されます。


2.4 その他のフィールド (Other Fields)

2.4.1 Port (ポート)

定義 (Definition):

このターゲットホストでのこのサービスのポート番号 (port number)。

データ型 (Data Type):

  • 範囲: 0-65535
  • 形式: 16ビット符号なし整数
  • バイト順: ネットワークバイト順

2.4.2 Target (ターゲット)

定義 (Definition):

ターゲットホストのドメイン名 (domain name of the target host)。

必須要件 (Mandatory Requirements):

重要な制約
  1. アドレスレコード要件: この名前に1つ以上のアドレスレコードがなければなりません (MUST)
  2. エイリアスの禁止: この名前はエイリアス (alias) であってはなりません (MUST NOT)
    • RFC 1034の意味で
    • RFC 2181の意味で
  3. CNAMEは不可: TargetはCNAMEレコードを指すことはできません

特別な値: "." (ルートドメイン) (Special Value: "." - Root Domain):

Target = "."

意味 (Meaning):

このドメインでサービスが明確に利用不可 (decidedly not available) であることを示します。


本章のまとめ (Chapter Summary)

本章では、SRVレコードの形式仕様を詳しく説明しました。重要なポイントは:

  1. フィールド定義: 9つのフィールドの完全なセマンティクスと形式要件
  2. 負荷分散アルゴリズム: 累積重みに基づく加重ランダム選択アルゴリズム
  3. 数学的基礎: 選択確率が重みに比例することを保証
  4. 境界ケース: Weight 0と特別なTarget "."の処理

主要な技術ポイント (Key Technical Points):

  • ✅ Priorityフィールドは階層的フェイルオーバー (hierarchical failover) を実装
  • ✅ Weightフィールドはピアレベルの負荷分散 (peer load balancing) を実装
  • ✅ アルゴリズムは数学的公平性 (mathematical fairness) を保証: P(RRᵢ) = wᵢ / W
  • 明示的なサービス拒否 (explicit service denial) をサポート: Target = "."

ナビゲーション (Navigation)