Pict2.先頭から何番目かで意味が決まる<BR>ヘッダーはコンピュータが解釈するための情報なので,0と1だけで意味を伝えます
Pict2.先頭から何番目かで意味が決まる<BR>ヘッダーはコンピュータが解釈するための情報なので,0と1だけで意味を伝えます
[画像のクリックで拡大表示]
Pict3.意味の持たせ方はいろいろある&lt;BR&gt;ヘッダーのビット列にはいろいろな意味があります
Pict3.意味の持たせ方はいろいろある<BR>ヘッダーのビット列にはいろいろな意味があります
[画像のクリックで拡大表示]

 このようにパケットの先頭にはいろいろなプロトコルのヘッダーが順番に並んでいます。ヘッダーは人間が見るためのものではなく,プロトコルを動作させるコンピュータのプログラムや装置のハードウエアが解釈するための情報です。従って,情報の表現は0と1とが並んだバイナリ表現(ビットの並び)となっています。

 プロトコルを動かすプログラムが正しくヘッダーの意味を理解できるように,先頭から数えて何ビット目の位置にどんな制御情報を書き込むか,あらかじめ決めてあります(pict.2[拡大表示])。こうしたフォーマットはプロトコルの仕様として決められており,プログラムはこの仕様に従って,情報を解釈します。

 例えば,TCP/IPのパケットをイーサネットで運ぶ場合,先頭にはMACヘッダーが付きます。MACヘッダーは長さが112ビットと決まっています。従って,先頭から113ビット目以降はIPヘッダーだとわかります。

 IPヘッダーの先頭から4ビットはプロトコル・バージョンの情報と決まっています。一般に使われているIPでは,ここが「0100」(10進数で4を表す)になります。送信元IPアドレスは97ビット目(96ビット)から128ビット目(127ビット)までに格納されます。

 ヘッダー領域の長さはプロトコルの種類によって異なります。ただ,必ずしも長さが決まっているわけではなく,ヘッダーが可変長のケースもあります。例えば,IPヘッダーであて先アドレスの後に「オプション」と呼ばれる情報が付く場合,ヘッダーの長さは160ビットより長くなります。

 こうした場合,単純に先頭からビット数を数えるだけでは,階層ごとのヘッダーの区切りは見つかりません。そこで可変長のヘッダーを使うプロトコルでは,ヘッダー情報の中にヘッダー自体の長さの情報を入れておきます。例えばIPでは,5ビット目から8ビット目までの4ビットの数値で,ヘッダーの長さを表します。パケットを受け取ったIPプログラムはこれを読みとることで,上位層のヘッダーとの境目を知るわけです。

いくつかの方法を使い分けてビットに意味を持たせる

 IPヘッダーを例に取ると,長さは少なくとも160ビットあります。こうした長いビット列をそのまま横に並べると読みにくいので,プロトコルの仕様書などでは32ビットごとに区切って並べ直した図がよく使われます(pict.3[拡大表示])。こうした図では,1行目が0~31ビット,2行目が32~63ビットとなるわけです。

 こうした仕様書では,8個のビットをまとめて「オクテット」と呼びます。同じような呼び方に「バイト」があります。以前は1バイトが8ビットではないコンピュータがあったので,誤解のないように「オクテット」という呼び方を決めたのです。

 ヘッダーの情報はいくつかの方法を使い分けて格納されています。

 まず,ビット列自体に意味を持たせるケースがあります。例えば,あて先や送信元を示すアドレスはそれ自体で意味を持ちます。

 次がフラグです。フラグは「旗」という意味の英語で,ある特定の位置のビットが0であるか1であるかで意味を伝える方法です。例えば,1であればある機能をオン,0であればオフにするといった使い方をします。1である場合を指して「フラグが立っている」と言うこともあります。IPパケットでは49ビット目(48ビット)から51ビット目(50ビット)までの3ビットがフラグとして割り当てられており,パケットの分割処理の取り扱い方を指示するために使われています。

 また,4ビット,8ビット,16ビットといった領域を使って,数値や数字を表現する方法もあります。例えば,ヘッダー長のフィールドは4ビットの2進数で数値を表しています。単位は4オクテットです。ここが「0110」なら,4オクテットの6倍の24オクテット(192ビット)の長さのヘッダーが付いていることを意味し,ヘッダーにオプションが含まれているとわかります。

 この方式の応用で,数値にあらかじめ意味を持たせておくこともあります。例えば,上位層のプロトコルが何かを示すプロトコル番号フィールドは8ビットあり,10進数で0~255の数字を表せます。このフィールドが「00000110」つまり10進数の「6」なら,上位層はTCPとわかります。なぜならプロトコル番号6はTCPとあらかじめ決めてあるからです。


●筆者:水野 忠則(みずの ただのり)氏
静岡大学創造科学技術大学院 大学院長・教授。情報処理学会フェロー,監事。現在の研究分野はモバイル&ユビキタス・コンピューティング,情報ネットワークなど。
●筆者:佐藤 文明(さとう ふみあき)氏
東邦大学理学部情報科学科教授。東北大学大学院工学研究科修了。現在の研究分野は通信ソフトウエアの開発方法,分散処理システムなど。
●イラストレータ:なかがわ みさこ
日経NETWORK誌掲載のイラストを,創刊号以来担当している。ホームページはhttp://creator-m.com/misako/