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):
- 優先選択: 到達可能な番号が最小の優先度のターゲットホストへの接続を試みる
- 同一優先度: 同じ優先度のターゲットホストは、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 のレコードは、リストの先頭 (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)
0 と W の間(境界を含む)の一様乱数 (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)
- 削除: 未ソートのSRVリソースレコードセットから選択したSRVリソースレコードを削除
- 追加: 新しいリストの末尾 (tail of the new list) に追加
- 再帰: 残りの未ソートSRV RRに対してアルゴリズムを適用
- 終了条件: 未ソートの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つ以上のアドレスレコードがなければなりません (MUST)
- エイリアスの禁止: この名前はエイリアス (alias) であってはなりません (MUST NOT)
- RFC 1034の意味で
- RFC 2181の意味で
- CNAMEは不可: TargetはCNAMEレコードを指すことはできません
特別な値: "." (ルートドメイン) (Special Value: "." - Root Domain):
Target = "."
意味 (Meaning):
このドメインでサービスが明確に利用不可 (decidedly not available) であることを示します。
本章のまとめ (Chapter Summary)
本章では、SRVレコードの形式仕様を詳しく説明しました。重要なポイントは:
- フィールド定義: 9つのフィールドの完全なセマンティクスと形式要件
- 負荷分散アルゴリズム: 累積重みに基づく加重ランダム選択アルゴリズム
- 数学的基礎: 選択確率が重みに比例することを保証
- 境界ケース: Weight 0と特別なTarget "."の処理
主要な技術ポイント (Key Technical Points):
- ✅ Priorityフィールドは階層的フェイルオーバー (hierarchical failover) を実装
- ✅ Weightフィールドはピアレベルの負荷分散 (peer load balancing) を実装
- ✅ アルゴリズムは数学的公平性 (mathematical fairness) を保証: P(RRᵢ) = wᵢ / W
- ✅ 明示的なサービス拒否 (explicit service denial) をサポート: Target = "."