【NW】イーサネット② イーサネットのフレームフォーマット
前置き
コンピュータ間で通信を行うとき、その通信はプロトコルと呼ばれる規約に沿ってデータのやり取りを行います。プロトコルの種類は多岐にわたりますが、現代ではほとんどの場合TCP/IP
と呼ばれるプロトコル群の中から利用されます。とはいっても利用されるプロトコルは一つではなく、複数のプロトコルをセットにして採用します。
プロトコルが複数選ばれるのには理由があり、それはTCP/IPが「階層モデル」と呼ばれるプロトコルのモデルを採用しているからです。階層モデルは通信に必要な処理を階層的に分類したモデルで、一番上の層ではアプリケーションに関する情報の受け渡しを担当、その下の層では通信の信頼性に関する情報の受け渡しを担当・・・といったように、通信に必要な処理を層ごとに分担しています(そして各層の処理を実現するプロトコルを決めます)。
この辺の話は以前の記事にもまとめたので、参照していただけると嬉しいです。
この階層モデルでは送信するデータを上位層から下位層へと受け渡していき*1、最終的に電気や光の信号として相手に送信するのですが、下位層にデータを受け渡すタイミングで追加のデータを付加していきます(下記記事参照)。このデータをヘッダと呼び、その階層(のプロトコル)で必要となる情報を含んでいます。ヘッダの含む情報を見ていけば、そのプロトコルが何をしているのかがわかるはずです。
そこで、今回はリンク層における規格の代表格であるイーサネットののヘッダを見ていこうと思います。 イーサネットはプロトコルでこそありませんが、物理媒体の仕様のみならず送受信するデータのフォーマットについてやフレームチェックについても規定しているので、実質プロトコルとして扱われている雰囲気を感じます。
イーサネットの種類
もともと、イーサネットはXerox社によって考え出された通信方式「Ethernet」でした。その後、Xerox社はEthernetの仕様を公開し、旧DEC社とインテル社を開発に加え「DIX」と呼ばれる仕様を策定しました。さらにその後、DIXが普及しIEEEによって規格化がなされました(IEEE802.3)。そのため、後者のイーサネットを「IEEE802.3 Ethernet」と呼ぶ場合があります。
イーサネットのフレームフォーマット
プリアンブル
イーサネットのフレームの先頭には、1/0が交互に並んだビット配列が付きます。これをプリアンブルと呼びます。プリアンブルはイーサネットフレームの開始を示し、末尾が「11」のSFD(Starg Frame Delimiter)と呼ばれるフィールドが来たらそれ以降がフレームデータの内容となります。プリアンブルのサイズは8オクテット(=8ビット×8)からなり、プリアンブルによって送信先ホスト(のNIC)が同期をとることが可能となります。
Ethernet(DIX)フレームフォーマット
Xerox社・旧DEX社・インテル社によるEthernetのフォーマットです。
Eathenetフレームフォーマットはヘッダ、データ本体、FCSからなります。
ヘッダ内部にはあて先MACアドレス、送信元MACアドレス、データ部で採用している上位層プロトコルのタイプの番号が入ります。
タイプ番号はこちらのページにまとめられています。
FCSはイーサネットフレームが壊れていないかどうかをチェックするためのフィールドです。イーサネットフレームがノイズなどの影響で壊れた場合、送信側・受信側で計算したFCSの値が異なってくるため、フレームの破損を検出することができます。
IEEE802.3(+802.2)フレームフォーマット(LLC+SNAP)
IEEEによって規格化されたEthernetのフォーマットです。
ヘッダにはあて先・送信元MACアドレスに加え、フレーム長、LLC、SNAPといった情報が含まれています。
フレーム長はその名の通り、フレームの長さを示しています。
LLCとSNAPは、データリンクに置ける「媒体アクセス制御」と「論理リンク制御」という概念に関わってきます。 データリンク層は、更に細かく分けると「媒体アクセス制御」と「論理リンク制御」の二層に分けることができます。媒体アクセス制御は、データリンクの種別(FDDIやイーサネットなど)によって独自に決まるヘッダ制御を指します。一方、論理リンク制御はデータリンクの種別を問わない、共通するヘッダ制御を指します。LLCやSNAPは、この論理リンク制御情報を含めるヘッダであり、上位層プロトコルなどの情報を含んでいます。
LLC
LLCは
- DSAP
- SSAP
- CTRL
の3つの情報からなります。
DSAP(Destination Service Access Point)
あて先のネットワーク層プロトコルを識別するためのフィールドです。
SSAP(Source Service Access Point)
送信元のネットワーク層プロトコルを識別するためのフィールドです。
CTRL(Controll)
データリンクレベルでのコネクション確立・フロー制御を行うためのフィールドです。
SNAP
SNAPヘッダは3オクテットのベンダコードと、2オクテットのタイプフィールドからなります。
タイプフィールドはDIXのタイプフィールドと同じ扱いをされます。
参考
*1:あくまで主流で、他のやりかたもあるかもしれない