バッカス・ナウア記法(BNF)の読み方
BNF(Backus-Naur Form)は、プログラミング言語やプロトコルフォーマットの構文記述に用いられるメタ言語である。RFCでもABNF(Augmented Backus-Naur Form)と呼ばれる拡張BNFが用いられているため、RFC読解には理解する必要がある。
以下にABNFを中心として、BNFの概要をまとめた。
●BNF(バッカス・ナウア記法)
BNFはプログラミング言語「ALGOL60」の構文定義を行うために考案されたメタ言語である。John Backus氏が提案して、Peter Naur氏により修正された言語であるため、両氏の名前を冠し、Backus-Naur Form(バッカス・ナウア形式)と呼ばれている。
BNFは、拡張性に富み、簡易であるという理由から、拡張が行われ、ISO、IETF等の標準仕様においてプロトコルのフォーマット記述に用いられるようになった。BNFは拡張が容易であることから、独自にさまざまな拡張が行われることになった。ISO、IETFではそれぞれ、EBNF、ABNFと呼ばれるBNF拡張体系が標準化されている。
●ABNF(Augmented BNF for Syntax Specification)
IETFの仕様書で使われている拡張BNF。初期のRFCでは、RFCの中で使うBNFの拡張内容をそのRFCの中で記述するということが行われていたが、1997年11月にRFC2234(Augmented BNF for Syntax Specifications: ABNF)が制定され、RFCで利用するABNFの標準が規定された。その後、2005年10月にABNFの標準仕様の改版が行われている。改版された仕様書はRFC4234として発行されている。
●SIPのBNF
RFC3261(Session Initiation Protocol)をはじめとしたIETFのSIP仕様でも、プロトコルフォーマットの記述にABNFが用いられている。RFC3261は、RFC2234のABNFが用いられている。RFC3261は2002年6月に制定されており、RFC4234の発行前の制定であるため。
以下にABNFの文法について、SIPのABNFを例にひきながら解説する。解説は特に注釈のない限り、ABNFの標準仕様の最新版であるRFC4234に基づいて行う。
●ABNFの全体像
RFC4234に規定されるABNFの規定は、大きく「規則定義」「演算子」「ABNFコア規則」の3つの部分に分けられる。「規則定義」は、規則を記述する基本的な書式、規則名の命名規則、終端値という概念、拡張エンコーディングについて規定している。「演算子」では、並列、選択、追加、範囲指定、グループ指定、繰り返し指定、オプション指定、コメント記述方法について規定している。「ABNFコア規則」では、「SP(スペース)」「ALPHA(アルファベット)」「DIGIT(数字)」などの規則が定義されている。
以下にそれぞれの規則の概要を説明していく。
●規則定義
1.基本的な書式
ABNFは、以下の書式で記述する。
<規則名> = <仕様>
nameという規則名は、"Hitokuchi"という文字列であると定義する場合には、下記のように記述する。なお、""の中に記載された英文字は大文字と小文字を区別しないので、"hiToKuChi"なども、nameに含まれる。
name = "Hitokuchi"
さらに仕様の中に、別の規則名を記述することもできる。
2.規則名の命名規則(作成中)
3.終端値(作成中)
4.拡張エンコーディング(作成中)
●演算子
並列、選択、追加、範囲指定、グループ指定、繰り返し指定、オプション指定、コメント記述方法という8つの演算子が定義されている。
1.並列(作成中)
2.選択(作成中)
3.追加(作成中)
4.範囲指定(作成中)
5.グループ指定(作成中)
6. 繰返し指定(Repetition)
同じ表現を複数繰り返す場合には、仕様の前に数字を付ける。
7DIGIT ; 7桁の数字
1*3DIGIT ; 1桁~3桁の数字列
2*ALPHA ; 2文字以上の英文字
*5SP ; 0~5つ以内のスペース
*DIGIT ; 0桁以上の数字
RFC3261に記載されているIPv4アドレスの形式を以下に示す。このABNFは、IPv4Addressは、1桁から3桁の数字列4つを、"."(ピリオド)で結んだ形であるということを示している。
IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
7. オプション指定(Optional Sequence)
オプションの要素を表現する場合には、[]で囲む。
下記は、RFC3261に記載される、Request要素の例である。Requestには、Request-Lineと0個以上のメッセージヘッダ(message-header)と改行文字(CRLF)が含まれるが、メッセージボディ(message-body)は任意であり、あってもなくてもよい。
Request = Request-Line
*( message-header )
CRLF
[ message-body ]
8. コメント記述方法(作成中)
●ABNFコア規則(CORE ABNF)
RFC4234 Appendix B. の CORE ABNF のうち RFC3261 で使われているものを以下に抜粋した。
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z、英文字を示す
CRLF = CR LF ; 改行文字
CR = %x0D ; cariiage retuan
LF = %x0A ; linefeed
WSP = SP / HTAB ; スペースか、水平タブ
SP = %x20 ; スペース
HTAB = %x09 ; 水平タブ
DIGIT = %x30-39 ; 0-9の数字を示す
(以下作成中)
1 件のコメント:
こんにちは
こちらにSIPサーバについてのホワイトペーパーがありますので、どうぞご覧ください。
http://www.radvision.com/Resources/WhitePapers/b2bua.htm
コメントを投稿