コンテンツにスキップ

High-Level Data Link Control

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。TXiKiBoT (会話 | 投稿記録) による 2011年1月12日 (水) 18:52個人設定で未設定ならUTC)時点の版 (ロボットによる 追加: mk:HDLC)であり、現在の版とは大きく異なる場合があります。

High-Level Data Link Control(ハイレベルデータリンク制御手順、以下HDLCと略す)は国際標準化機構(ISO)によって標準化された、ビットオリエンテッドなフレーム同期型のデータリンク層プロトコルである。最初のHDLCはISOによって以下のように定義された。

  • ISO 3309 — フレーム構造
  • ISO 4335 — 処理手順の要素
  • ISO 6159 — 非平衡型処理手順
  • ISO 6256 — 平衡型処理手順

これらの定義はISO 13239に取りまとめられ、現在のHDLCの定義となっている。HDLCはコネクションオリエンテッド型通信にもコネクションレス型通信にも対応できる。

HDLCはポイント・ツー・マルチポイントでの通信を行うことができるが、現在はほとんど Asynchronous Balanced Mode(ABM)を使ったポイント・ツー・ポイントでの通信でしか使われていない。HDLCにはABMの他にNormal Response Mode(NRM)とAsynchronous Response Mode(ARM)の2つがある。

歴史

HDLCはIBMが開発したSystems Network Architecture(SNA)のレイヤ2プロトコルであるSDLCが大元になっている。それを国際電気通信連合(ITU)が、LAPBとしてX.25プロトコル・スタックに持ち込みHDLCの誕生となった。現在、これは同期型のPPPとして、インターネットのようなWANにサーバなどを繋ぐのに用いられている。これと一部異なるバージョンのものがISDNの制御チャンネルやSDH多重電話回線で使用されている。またシスコなど一部のベンダではシスコHDLCのように、下位のHDLCのフレーミング技術のみを導入し、ヘッダ部分は独自といったプロトコルを開発したりもしている。

フレーミング

HDLCのフレームは同期リンク、非同期リンクに関わらず送信することが可能である。これらのリンクにはフレームの始めと終わりを見分けるメカニズムはないので、通信を行うには各フレームの始めと終わりを認識するメカニズムが必要である。フレームの始まりと終わりを認識するには「フレームデリミタ」(「フラグシーケンス」とも言う)を使用する。どのように使用するかと言うと、特定のビット配列(=フレームデリミタ)が存在する=その部分はフレームではない、という具合でフレームを認識する。そのビット配列は”01111110”で16進数で表示すると”7E”である。

同期リンク上でフレームの通信がない場合、連続してフレームデリミタが送信され続け、以下のような連続したビット配列を示す。

01111110011111100111111001111110
 ______  ______  ______  ______ 
_      __      __      __      _

これを利用しモデム位相同期回路を経由して時計をシンクロさせる。手順の実装によってはフレームデリミタの先頭ビットと最終ビットの兼用を認める('011111101111110')ものもある。

実際に送受信されるバイナリデータはフラグシーケンスと同じビット列を含む可能性がある。そのまま送信した場合、受信する側はそのままフラグシーケンスと解釈し問題を生じ得るため、別のビット列に変換する必要がある。

同期リンク上での場合、その変換方法としてbit stuffingを使う。これはどういった変換を行うかというと、送信デバイスにおいて0の後ろに1が連続して5つ続いたのを検知すると、ハードウェア側でその後ろに0を挿入するといった変換を行う。受信デバイスにおいては0の後に1が5つ続きさらにその後ろに0があった場合、データと判断し0を取り除く。1が6つ続いた場合はフラグシーケンスと判断して対応を行う。

bit stuffing
元・受信データ:01111110 01111110 01111110 01111110 …
送信データ  :01111101 00111110 10011111 01001111 1010…

シリアルポートやUniversal Asynchronous Receiver Transmitter(UART)のように8ビット(オクテット)単位で送出する非同期リンクにおいては、bit stuffingを行うと半端が出てしまうため別の変換を行う必要がある。代わりの変換方法は”byte stuffing”もしくは”octet stuffing”と呼ばれる。どのような方法かと言うと、送信デバイスでデータ内のオクテットがフレームデリミタの”01111110”(16進数で7E)か、もしくはエスケープオクテットの”01111101”(16進数で7D)と同じであるものを検知するとそのオクテットの前にエスケープオクテット”01111101”を挿入し、そのオクテットの先頭(最上位)から3番目のビット(16進数で20)の0と1を入れ替える。受信デバイスはエスケープオクテットを検知するとエスケープオクテットを削除し、次のオクテットの3番目のビットの0と1を入れ替える。その他の予約ビット列(XONやXOFFなど)やエスケープオクテット自体についても、必要であれば同様にしてエスケープできる。

octet stuffing
元・受信データ:01111110 01010101 01111101 01011110 …
送信データ  :01111101 01011110 01010101 01111101 01011101 01011110 …

フレーム構造

フラグを含むHDLCのフレーム構造は以下のようになっている。

フラグ アドレス コントロール 情報 FCS (オプショナルのフラグ)
8ビット 8ビット 8ビット もしくは 16ビット 可変長, 0もしくは8の倍数ビット 16ビット 8ビット

後のフラグは次のフレームの始めのフラグを兼ねている(なくても大丈夫)。

伝送される情報は8の倍数ビットになる。これは電話テレタイプの長距離デジタル伝送装置が8ビットずつ伝送しているのにHDLCが適応した結果である。これによりHDLCは効率的にバイナリデータを送受信できる。

FCSは(Frame Check Sequence:フレームチェックシーケンス)の略でパリティチェックより洗練された方法であり、CRCによるデータのエラー検出と訂正を行う。

関連項目

外部リンク