ENUM
ENUMとは、インターネット上のドメイン名で公衆交換電話網の電話番号を表現するための規格である。もしくは、プログラミングにおける「列挙型」と呼ばれるデータ型のことである。
電話番号を利用する規格としてのENUMは、ITU-Tが勧告している「E.164番号」に基づく電話番号をドメイン名に変換し、対応するサービスやアプリケーションを取得する仕組みである。ENUMの名称は「E.164 NUmber Mapping」の頭字語である。2009年には、IETFによる技術仕様「RFC 5483」(ENUM Implementation Issues and Experiences)が発表されている。
参照リンク
ENUM Info by JPRS
Enum コンストラクタ
アセンブリ: mscorlib (mscorlib.dll 内)


Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Enum メソッド

名前 | 説明 | |
---|---|---|
![]() | CompareTo | 指定したオブジェクトとこのインスタンスを比較し、これらの相対値を示す値を返します。 |
![]() | Equals | オーバーロードされます。 オーバーライドされます。 対象のインスタンスが、指定したオブジェクトに等しいかどうかを示す値を返します。 |
![]() | Format | 指定した形式に従って、指定した列挙型の指定した値をそれと等価の文字列形式に変換します。 |
![]() | GetHashCode | オーバーライドされます。 このインスタンスの値のハッシュ コードを返します。 |
![]() | GetName | 指定した値を持つ指定した列挙体にある定数の名前を取得します。 |
![]() | GetNames | 指定した列挙体に含まれている定数の名前の配列を取得します。 |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | GetTypeCode | このインスタンスの基になる TypeCode を返します。 |
![]() | GetUnderlyingType | 指定した列挙体の基になる型を返します。 |
![]() | GetValues | 指定した列挙体内の定数の値の配列を取得します。 |
![]() | IsDefined | 指定した値を持つ定数が指定した列挙体に存在するかどうかを示す値を返します。 |
![]() | Parse | オーバーロードされます。 文字列形式での 1 つ以上の列挙定数の名前または数値を、等価の列挙オブジェクトに変換します。 |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | ToObject | オーバーロードされます。 指定した値に設定された、指定の列挙型のインスタンスを返します。 |
![]() | ToString | オーバーロードされます。 オーバーライドされます。 このインスタンスの値を、それと等価の文字列形式に変換します。 |

名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 ( Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | System.IConvertible.ToBoolean | 基になる型に基づいて、現在の値をブール値に変換します。 |
![]() | System.IConvertible.ToByte | 基になる型に基づいて、現在の値を 8 ビット符号なし整数に変換します。 |
![]() | System.IConvertible.ToChar | 基になる型に基づいて、現在の値を Unicode 文字に変換します。 |
![]() | System.IConvertible.ToDateTime | 基になる型に基づいて、現在の値を DateTime に変換します。 |
![]() | System.IConvertible.ToDecimal | 基になる型に基づいて、現在の値を Decimal に変換します。 |
![]() | System.IConvertible.ToDouble | 基になる型に基づいて、現在の値を倍精度浮動小数点数に変換します。 |
![]() | System.IConvertible.ToInt16 | 基になる型に基づいて、現在の値を 16 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToInt32 | 基になる型に基づいて、現在の値を 32 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToInt64 | 基になる型に基づいて、現在の値を 64 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToSByte | 基になる型に基づいて、現在の値を 8 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToSingle | 基になる型に基づいて、現在の値を単精度浮動小数点数に変換します。 |
![]() | System.IConvertible.ToType | 基になる型に基づいて、現在の値を指定した型に変換します。 |
![]() | System.IConvertible.ToUInt16 | 基になる型に基づいて、現在の値を 16 ビット符号なし整数に変換します。 |
![]() | System.IConvertible.ToUInt32 | 基になる型に基づいて、現在の値を 32 ビット符号なし整数に変換します。 |
![]() | System.IConvertible.ToUInt64 | 基になる型に基づいて、現在の値を 64 ビット符号なし整数に変換します。 |

Enum メンバ


名前 | 説明 | |
---|---|---|
![]() | CompareTo | 指定したオブジェクトとこのインスタンスを比較し、これらの相対値を示す値を返します。 |
![]() | Equals | オーバーロードされます。 オーバーライドされます。 対象のインスタンスが、指定したオブジェクトに等しいかどうかを示す値を返します。 |
![]() | Format | 指定した形式に従って、指定した列挙型の指定した値をそれと等価の文字列形式に変換します。 |
![]() | GetHashCode | オーバーライドされます。 このインスタンスの値のハッシュ コードを返します。 |
![]() | GetName | 指定した値を持つ指定した列挙体にある定数の名前を取得します。 |
![]() | GetNames | 指定した列挙体に含まれている定数の名前の配列を取得します。 |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | GetTypeCode | このインスタンスの基になる TypeCode を返します。 |
![]() | GetUnderlyingType | 指定した列挙体の基になる型を返します。 |
![]() | GetValues | 指定した列挙体内の定数の値の配列を取得します。 |
![]() | IsDefined | 指定した値を持つ定数が指定した列挙体に存在するかどうかを示す値を返します。 |
![]() | Parse | オーバーロードされます。 文字列形式での 1 つ以上の列挙定数の名前または数値を、等価の列挙オブジェクトに変換します。 |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | ToObject | オーバーロードされます。 指定した値に設定された、指定の列挙型のインスタンスを返します。 |
![]() | ToString | オーバーロードされます。 オーバーライドされます。 このインスタンスの値を、それと等価の文字列形式に変換します。 |

名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | System.IConvertible.ToBoolean | 基になる型に基づいて、現在の値をブール値に変換します。 |
![]() | System.IConvertible.ToByte | 基になる型に基づいて、現在の値を 8 ビット符号なし整数に変換します。 |
![]() | System.IConvertible.ToChar | 基になる型に基づいて、現在の値を Unicode 文字に変換します。 |
![]() | System.IConvertible.ToDateTime | 基になる型に基づいて、現在の値を DateTime に変換します。 |
![]() | System.IConvertible.ToDecimal | 基になる型に基づいて、現在の値を Decimal に変換します。 |
![]() | System.IConvertible.ToDouble | 基になる型に基づいて、現在の値を倍精度浮動小数点数に変換します。 |
![]() | System.IConvertible.ToInt16 | 基になる型に基づいて、現在の値を 16 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToInt32 | 基になる型に基づいて、現在の値を 32 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToInt64 | 基になる型に基づいて、現在の値を 64 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToSByte | 基になる型に基づいて、現在の値を 8 ビット符号付き整数に変換します。 |
![]() | System.IConvertible.ToSingle | 基になる型に基づいて、現在の値を単精度浮動小数点数に変換します。 |
![]() | System.IConvertible.ToType | 基になる型に基づいて、現在の値を指定した型に変換します。 |
![]() | System.IConvertible.ToUInt16 | 基になる型に基づいて、現在の値を 16 ビット符号なし整数に変換します。 |
![]() | System.IConvertible.ToUInt32 | 基になる型に基づいて、現在の値を 32 ビット符号なし整数に変換します。 |
![]() | System.IConvertible.ToUInt64 | 基になる型に基づいて、現在の値を 64 ビット符号なし整数に変換します。 |

Enum 構造体
アセンブリ: mscorlib (mscorlib.dll 内)

<SerializableAttribute> _ <ComVisibleAttribute(True)> _ Public MustInherit Class Enum Inherits ValueType Implements IComparable, IFormattable, IConvertible
[SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
[SerializableAttribute] [ComVisibleAttribute(true)] public ref class Enum abstract : public ValueType, IComparable, IFormattable, IConvertible

列挙体は、基になる型が Char 以外の整数型である名前付き定数です。基になる型が明示的に宣言されない場合は、Int32 が使用されます。通常、プラミング言語には、名前付き定数とその値の組み合わせから成る列挙体を宣言する構文が用意されています。
Enum には、このクラスの複数のインスタンスを比較したり、インスタンスの値を文字列形式に変換したり、数値の文字列形式をこのクラスのインスタンスに変換したり、指定した列挙体および値のインスタンスを作成するためのメソッドが用意されています。
列挙体をビット フィールドとして扱うこともできます。詳細については、「FlagsAttribute」を参照してください。
実装されているインターフェイスこのクラスは、ValueType から継承し、IComparable、IFormattable、IConvertible の各インターフェイスを実装します。このクラスの明示的な IConvertible インターフェイス メンバの実装の代わりに、Convert クラスを変換のために使用します。
-
ビットごとの演算 (AND、OR、EXCLUSIVE OR) が数値で実行される場合のみ、列挙体の FlagsAttribute カスタム属性を使用します。
-
列挙定数を 2 の累乗 (1、2、4、8 など) で定義してください。これは、結合された列挙定数の各フラグが重複しないことを意味します。
-
よく使われるフラグの組み合わせに対して列挙定数を作成することを検討してください。たとえば、列挙定数の Read = 1 および Write = 2 を含むファイル I/O 操作に使用される列挙体を持っている場合は、Read フラグと Write フラグを結合する列挙定数 ReadWrite = Read OR Write を作成することが考えられます。場合によっては、フラグを結合するために使用されるビットごとの OR 演算は、単純なタスクには必要のない高度な概念と見なされます。
-
フラグ列挙定数として負数を定義する場合は、多数のフラグの位置が 1 に設定される場合があるので注意してください。その結果、コードが混乱してコーディング エラーの原因となる可能性があります。
-
フラグが数値で設定されているかどうかをテストする便利な方法は、数値とフラグ列挙定数の間でビットごとの AND 演算を実行することです。これにより、フラグに対応しない数値内のすべてのビットが 0 に設定されます。次に、その演算の結果がフラグ列挙定数に等しいかどうかをテストします。
-
値が 0 であるフラグ列挙定数の名前として None を使用します。フラグをテストするためにビットごとの AND 演算を実行する場合、None 列挙定数は結果が常に 0 になるので使用できません。ただし、数値と None 列挙定数の間で、ビットごとではなく論理的な比較を実行して、数値のビットが設定されているかどうかを判断できます。
フラグ列挙体の代わりに値の列挙体を作成する場合も、None 列挙定数の作成は有用です。列挙体に使用されるメモリが共通言語ランタイムによって既定で 0 に初期化されるからです。その結果、値が 0 である定数を定義しなかった場合、列挙体には作成時に無効な値が含まれます。
アプリケーションで、既定の状態を表す必要がある場合は、値が 0 である列挙定数を使用してその既定の状態を表すことを検討してください。既定の状態がない場合は、他の列挙定数では表現されない状態を表すために、値が 0 の列挙定数の使用を検討してください。
-
列挙体そのものの状態を反映するだけの列挙値を定義しないでください。たとえば、列挙体の末尾をマークするだけの列挙定数は定義しないでください。列挙体の末尾の値を確認する必要がある場合は、その値を明示的にチェックしてください。また、範囲内のすべての値が有効である場合は、先頭と末尾の列挙定数を確認する範囲のチェックを実行できます。
-
列挙定数を値として受け取るメソッドまたはプロパティを定義する場合は、値を検証することを検討してください。数値が列挙体に定義されていない場合も、数値を列挙型にキャストできるからです。

名前付きの値を表す列挙体と、名前付きのビット フィールドを表す別の列挙体を使用するコード例を次に示します。
Imports System Public Class EnumTest Enum Days Saturday Sunday Monday Tuesday Wednesday Thursday Friday End Enum 'Days Enum BoilingPoints Celcius = 100 Fahrenheit = 212 End Enum 'BoilingPoints <FlagsAttribute()> _ Enum Colors Red = 1 Green = 2 Blue = 4 Yellow = 8 End Enum 'Colors Public Shared Sub Main() Dim weekdays As Type = GetType(Days) Dim boiling As Type = GetType(BoilingPoints) Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:") Dim s As String For Each s In [Enum].GetNames(weekdays) Console.WriteLine("{0,-11} = {1}", s, [Enum].Format(weekdays, [Enum].Parse(weekdays, s), "d")) Next s Console.WriteLine() Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.") Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:") For Each s In [Enum].GetNames(boiling) Console.WriteLine("{0,-11} = {1}", s, [Enum].Format(boiling, [Enum].Parse(boiling, s), "d")) Next s Dim myColors As Colors = Colors.Red Or Colors.Blue Or Colors.Yellow Console.WriteLine() Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors) End Sub 'Main End Class 'EnumTest
using System; public class EnumTest { enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum BoilingPoints { Celcius = 100, Fahrenheit = 212 }; [FlagsAttribute] enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; public static void Main() { Type weekdays = typeof(Days); Type boiling = typeof(BoilingPoints); Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:"); foreach ( string s in Enum.GetNames(weekdays) ) Console.WriteLine( "{0,-11}= {1}", s, Enum.Format( weekdays, Enum.Parse(weekdays, s), "d")); Console.WriteLine(); Console.WriteLine("Enums can also be created which have values that represent some meaningful amount."); Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:"); foreach ( string s in Enum.GetNames(boiling) ) Console.WriteLine( "{0,-11}= {1}", s, Enum.Format(boiling, Enum.Parse(boiling, s), "d")); Colors myColors = Colors.Red | Colors.Blue | Colors.Yellow; Console.WriteLine(); Console.WriteLine("myColors holds a combination of colors. Namely: {0}" , myColors); } }
using namespace System; enum class Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum class BoilingPoints { Celcius = 100, Fahrenheit = 212 }; [FlagsAttribute] enum class Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; int main() { Type^ weekdays = Days::typeid; Type^ boiling = BoilingPoints::typeid; Console::WriteLine( "The days of the week, and their corresponding values in the Days Enum are:" ); Array^ a = Enum::GetNames( weekdays ); Int32 i = 0; do { Object^ o = a->GetValue( i ); Console::WriteLine( "{0,-11}= {1}", o->ToString(), Enum::Format( weekdays, Enum::Parse( weekdays, o->ToString() ), "d" ) ); } while ( ++i < a->Length ); Console::WriteLine(); Console::WriteLine( "Enums can also be created which have values that represent some meaningful amount." ); Console::WriteLine( "The BoilingPoints Enum defines the following items, and corresponding values:" ); i = 0; Array^ b = Enum::GetNames( boiling ); do { Object^ o = b->GetValue( i ); Console::WriteLine( "{0,-11}= {1}", o->ToString(), Enum::Format( boiling, Enum::Parse( boiling, o->ToString() ), "d" ) ); } while ( ++i < b->Length ); Array^ c = Enum::GetNames( Colors::typeid ); Colors myColors = Colors::Red | Colors::Blue | Colors::Yellow; Console::WriteLine(); Console::Write( "myColors holds a combination of colors. Namely:" ); for ( i = 0; i < 3; i++ ) Console::Write( " {0}", c->GetValue( i ) ); }
import System.*; public class EnumTest { enum Days { saturday (0), sunday (1), monday (2), tuesday (3), wednesday (4), thursday (5), friday (6); } //Days enum BoilingPoints { celsius (100), fahrenheit (212); } //BoilingPoints /** @attribute FlagsAttribute() */ enum Colors { red (1), green (2), blue (4), yellow (8); } //Colors public static void main(String[] args) { Type weekdays = Days.class.ToType(); Type boiling = BoilingPoints.class.ToType(); Console.WriteLine("The days of the week, and their corresponding" + " values in the Days Enum are:"); String s[] = Enum.GetNames(weekdays); for (int iCtr = 0; iCtr < s.length; iCtr++) { Console.WriteLine("{0,-11}= {1}", s[iCtr], Enum.Format(weekdays, Enum.Parse(weekdays, s[iCtr]), "d")); } Console.WriteLine(); Console.WriteLine("Enums can also be created which have values that" + " represent some meaningful amount."); Console.WriteLine("The BoilingPoints Enum defines the following items ," + " and corresponding values:"); String s1[] = Enum.GetNames(boiling); for (int iCtr = 0; iCtr < s1.length; iCtr++) { Console.WriteLine("{0,-11}= {1}", s1[iCtr], Enum.Format(boiling, Enum.Parse(boiling, s1[iCtr]), "d")); } Colors myColors = Colors.red | Colors.blue | Colors.yellow; Console.WriteLine(); Console.WriteLine("myColors holds a combination of colors. Namely: {0}" , myColors); } //main } //EnumTest
import System; public class EnumTest { enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum BoilingPoints { Celcius = 100, Fahrenheit = 212 }; FlagsAttribute enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; public static function Main() { var weekdays : Type = Days; var boiling : Type = BoilingPoints; Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:"); for( var i : int in Enum.GetNames(weekdays) ) Console.WriteLine( "{0,-11}= {1}", Enum.GetNames(weekdays).GetValue(i), Enum.Format( weekdays, Enum.Parse(weekdays, Enum.GetNames(weekdays).GetValue(i)), "d")); Console.WriteLine(); Console.WriteLine("Enums can also be created which have values that represent some meaningful amount."); Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:"); for ( var j : int in Enum.GetNames(boiling) ) Console.WriteLine( "{0,-11}= {1}", Enum.GetNames(boiling).GetValue(j), Enum.Format(boiling, Enum.Parse(boiling, Enum.GetNames(boiling).GetValue(j)), "d")); var myColors : Colors = Colors.Red | Colors.Blue | Colors.Yellow; Console.WriteLine(); Console.WriteLine("myColors holds a combination of colors. Namely: {0}" , myColors); } }


Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


ENUM
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/03/15 15:54 UTC 版)
ナビゲーションに移動 検索に移動ENUM (E.164 NUmber Mapping) は、公衆交換電話網の電話番号体系をインターネットのIPアドレス体系と統合する電話番号マッピング (telephone number mapping) の代表的な規格。電話番号はE.164規格で体系化されており、インターネットはIPアドレスや他のリソース情報とドメイン名のリンクに Domain Name System (DNS) を用いる。電話番号マッピングシステムは、DNSを単に参照することで与えられた電話番号に対応したサービスを提供するインターネット上のサーバを決定するものである。ENUMでは特別なDNSレコードタイプを使い、電話番号からインターネット通信に使える Uniform Resource Identifier やIPアドレスに変換する。
概要
顧客が期待するような形で電話番号をダイヤルできることは、従来の電話サービス(PSTN)とIP電話(VoIP)の集中・収斂にとって重要であり、新たなIPマルチメディアサービスの開発にとっても重要である。複数の通信サービスでの単一の汎用個人識別子の問題は、様々な手法で解決できる。1つの単純な手法としてENUMがある。これはIETFが既存のE.164電話番号体系、プロトコル、基盤を使って策定したもので、単一の個人識別子を使って各種サービスに間接的にアクセスできるようにしている。ENUMはまた、IP側から電話網にシームレスに接続する手段も提供する。
システム詳細
ENUM加入者がENUMサービスを活性化して使うには、登録者から以下の3つの要素を得る必要がある。
- 個人の Uniform Resource Identifier (URI) - ネットワークのIP部分で使用(後述)
- 個人URIと対応したE.164の通常の電話番号 - ネットワークのPSTN部分で使用
- 権限のある者が、その個人URIでアクセスできるNAPTRレコードに、呼の転送/終端設定を書き込む。
動作手順は次の通りである。登録者は加入者(被登録者)にドメイン名とURIを提供し、それをDNSサーバに渡すことでNAPTRレコードとE.164の電話番号(ENUM番号)をフェッチする。そのURIのドメイン名と加入者のENUM番号は1対1に対応している。このとき加入者のURIに対応したNAPTRレコードには、その加入者の呼の転送/終端の設定が含まれている。
したがって、発呼側がPSTN網で着呼側のENUM番号をダイヤルすると、その番号はENUMゲートウェイが対応するURIに変換する。このURIはNAPTRレコードを参照しフェッチするのに使われ、それによって被呼加入者が呼を転送したいのか着信したいのかを知ることができる。これをアクセス情報と呼び、被登録者(被呼加入者)がNAPTRレコードに自身の選択を書いて指定する。NAPTRレコードとは、RFC 2915 に定義された "Naming Authority Pointer Resource Records" であり、電子メールアドレス、FAX番号、個人ウェブサイト、VoIP番号、携帯電話番号、ボイスメールシステム、IP電話アドレス、ウェブページ、GPS座標、転送、インスタントメッセージなどが指定できる。一方、発呼側がIP側にいるとき、ダイヤラーソフトウェアの一部であるユーザエージェント (UA) がE.164番号をダイヤルするが、ダイヤラーUAがそれをURIに変換し、ENUMゲートウェイのDNSを参照してNAPTRレコードを取得して被呼加入者が呼を転送したいのか着信したいのかを知る。なお、被呼加入者はPSTN側でもIP側でも構わない。
新たな個人用E.164番号(ENUM番号)を使ってデータベースを参照する場合、これを indirect calling support service と呼ぶ。
ITU ENUM には特別なゾーン "e164.arpa" がIP側ネットワークでの ENUM E.164番号用に割り当てられている。RFC 3761 には任意のENUM番号をURIに変換する方法が定義されている。それは番号を逆に綴り、各桁の間にドットを挟み、e164.arpa を最後尾につけるというものである。例えば、+1 555 42 42 なら 2.4.2.4.5.5.5.1.e164.arpa となる。
このURIをつかってDNSを参照すると、SIP VoIP 電話などのサービスのインターネットアドレスが得られる。また、NAPTRレコードで加入者の転送/着信設定がわかる。したがって、システム全体でE.164アドレスからSIPアドレスへの変換が可能である。NAPTRレコードは例えば次のようになっている。
$ORIGIN 2.4.2.4.5.5.5.1.e164.arpa. IN NAPTR 100 10 "u" "E2U+sip" "!^.*$!sip:phoneme@example.net!" . IN NAPTR 102 10 "u" "E2U+mailto" "!^.*$!mailto:myemail@example.com!" .
この例では、"E2U+sip" サービスを使いたい場合、アドレスとして sip:phoneme@example.net を使うべきであることがわかる。正規表現部分は電話会社が全顧客のアドレスを容易に割り当てられるようにしている。例えば、番号が +15554242 なら、SIPアドレスは sip:4242@555telco.example.net、+15551234 なら sip:1234@555telco.example.net となる。
次の図はENUMの動作例を示したものである。加入者Aが加入者Bに発呼する場合である。
- ENUMが使える加入者端末装置やPBXやゲートウェイのユーザエージェントが +34 98 765 4321 という番号を RFC 3761 にある規則に従い、ENUMドメイン 1.2.3.4.5.6.7.8.9.4.3.e164.arpa に変換する。
- DNSに要求を送り、ENUMドメイン 1.2.3.4.5.6.7.8.9.4.3.e164.arpa を参照する。
- クエリ結果として RFC 3403 にある Naming Authority Pointer Resource レコード (NAPTR) が得られる。この例では、VoIPプロトコルとして RFC 3261 のSIP を使いインターネット内で到達可能なアドレスが返ってきたとする。
- 端末アプリケーションが通信リンクを設定し、インターネット上で呼がルーティングされる。
これらは全てユーザエージェントが自動的に行うため、ENUMユーザーはDNS参照が行われていることには気づかない。実際、ENUM対応エージェントを持つウェブブラウザで電話番号を入力した場合、探している情報の種類(電子メールアドレス、電話番号、ウェブアドレスなど)をPCや端末上で示せば、番号がドメイン名に変換される。これがインターネット上のENUMサーバに送られ、そのドメイン名に対応したNAPTRレコードが返ってくる。このようにENUMは電話番号を要求したアドレスや番号に対応したドメイン名に変換する機構だが、ユーザー自身には見えないところでDNSを使っている。
利用
ENUMによる呼の転送
ENUMによる呼の転送の一方式を次の図に示す。発信者は別の加入者の番号を電話機でダイヤルする。するとENUM参照が行われる。DNSはVoIP通信、電話番号、電子メールアドレスなどについてのNAPTRレコードを返す。そして、VoIPについてのレコードを使い、通話相手との接続を確立しようとする。相手がオンラインでない場合、PSTNや携帯電話への接続が選択されることになる。これらも失敗した場合、電子メールアドレスにボイスメールを送ることになる。
e164.arpa のサブドメインはITUにより国番号ごとに割り当てられている。通常、各国の政府機関がその範囲の管理を分担しており、どう運営するかは各国に任されている。通常、一般的なDNSレジストリ-登録者モデルを使う。国単位のENUMレジストリは 国番号.e164.arpa というサブドメインのDNS基盤を管理運営する。エンドユーザーの依頼を受けて登録者がENUMの登録を行う。登録者はVoIP事業者や通信事業者であり、VoIPサービスに一環としてENUM登録を行う。ENUMを使ったVoIPサービスでは、被登録者の既存の電話番号をダイヤルすると、PSTNではなくインターネットを使った(被登録者の)IP電話に着信する。ENUMを使っていない人の番号をダイヤルすると、通常通りPSTN内で呼が完結する。
ENUM相当の他のサービスとして E164.org などもある。それらのサービスはPSTN番号を照合する場合もあり、e164.arpa に加えて使うことができる。しかし、このために複雑となり混乱が生じる。複数のDNS参照が必要となり、E.164番号がどのENUM相当のツリーに登録されているかを知ることは決して単純ではない。あるE.164番号が複数のツリーに登録されている場合、返ってくる情報が相互に矛盾している可能性もある。さらに、あるE.164番号を「所有」している加入者が、その番号がどのENUMツリーにどのように登録されているかを知らないという状況もありうる。
被呼加入者機能
ENUMは被呼加入者 (called party) 機能と見ることもできる。基本的にPSTNとVoIPがシームレスに機能するよう設計された間接ダイヤルサービスであり、E.164番号が広く採用され認知されているという事実に基づいている。
電話をする相手がENUMを使うと決めた場合、ENUM番号を公開していて、呼をどのように着信したいかをNAPTR経由で入力しているだろう。それは単なるVoIP識別子かもしれないが、固定電話、携帯電話、ボイスメールサービスなどIP側かPSTN側のいずれかにある一連の転送先を示すことが多い。ENUMを使い、着信方法の希望を電話してくる人に知らせるかどうかは被呼加入者の自由である。
今日、普通に電話をかけるとき、相手とどういう方法で接続するかを決める必要がある。VoIPなのか、固定電話なのか、携帯電話なのか、URI入力や番号のダイヤルでそれらを選択している。ENUMを使った間接ダイヤル方式では、どの手段で接続するかは被呼加入者が選択することになる。間接ダイヤル方式のもう1つの利点は、被呼加入者が電話会社、ウェブページ、電子メールなどの通信サービスを変えても、関係者にそれをいちいち知らせる必要がないという点である。
プレゼンス情報とENUMを組み合わせると、個人の居場所に合わせて転送/着信の設定を自動的に変更することも考えられる。VoIPと携帯電話の自動的な切り替えという意味では、これが最も便利な着信設定方法と言える。
様々なENUM
ENUMを語る際に混乱の元になるのは、今日のENUMの実装として様々なものが存在している点である。ENUMと言った場合、以下のいずれかを指していることがほとんどである。
- パブリックENUM
- 汎用かつ公共のディレクトリ型データベースという元々のENUMの考え方であり、加入者の登録機能と e164.arpa ドメイン内の国番号レベルでの委譲がある。これを「ユーザーENUM」とも呼ぶ。
- プライベートENUM
- 通信事業者、VoIP運用者、ISPなどが自身のネットワーク内でENUMの技術を使うことがある。この場合DNSもそのネットワーク内で同様に使われる。
- キャリアENUM
- 通信事業者のグループが加入者情報をENUMで共有するもの。加入者個人ではなく、事業者が加入者情報を制御する。これを「インフラストラクチャENUM」とも呼び、音声ピアリングをサポートしようとしている新たなIETF勧告の主題になっている。
参考文献
- RFC 2915 - The Naming Authority Pointer (NAPTR) DNS Resource Record
- RFC 3761 - The E.164 to Uniform Resource Identifiers (URI) Dynamic Delegation Discovery System (DDDS) Application (ENUM)
- RFC 2168 - Resolution of Uniform Resource Identifiers using the Domain Name System
- ENUM - The bridge between telephony and internet
- ENUM - It's All in the Numbers
- ENUM ITU
- Telephone Number Mapping (enum) IETF
外部リンク
ENUM
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/16 02:16 UTC 版)
E.164電話番号は、DNSのなかのe164.arpaのENUMで使用される。例えば、+1 555 42 42 は、ドットでそれらを切り離して、e164.arpa接尾語を加えて、数を逆にすることによってホストネームに変換できる。 2.4.2.4.5.5.5.1.e164.arpa そして、SIPのIP電話などのサービスのためのIPアドレスを調べるためにDNSを使用することができる。 代替方法はDUNDiである。(DUNDiはENUM(のP2P実装)。 DUNDiはIETFによってまだ規格化されていない。 E.163は、公衆交換電話網の電話番号について勧告した古いITU-T規格であった。アメリカ合衆国では、これが以前、ディレクトリ番号と呼ばれていた。E.163は削除されて、1997年のE.164の改定1版に組み入れた。
※この「ENUM」の解説は、「E.164」の解説の一部です。
「ENUM」を含む「E.164」の記事については、「E.164」の概要を参照ください。
- ENUMのページへのリンク