システム奮闘記:その106

データリンク層



Tweet

(2016年11月14日に掲載)

OSIモデルの中のデータリンク層の位置づけ

 ところで物理層の上にあるデータリンク層。  MACフレームをつくっている所だ。
OSIモデル(TCP/IPの場合)
OSIモデル(TCP/IPの場合)
ネットワークには7つの階層がある。
トランスポート層では、ポート番号の認識を行なう。
ネットワーク層ではIPアドレスの認識を行なう。
データリンク層はMACアドレスの認識を行なう。

 だが、これ以上の知識はないため、調べてみる事にした。

 MAC副層とLLC副層 - ネットワークエンジニアを目指して
 基礎から学ぶWindowsネットワーク:第17回 LLCとNetBEUIプロトコル (2/3) - @IT
 詳説 TCP/IPプロトコル:第6回 イーサネット(その1) - イーサネットの規格とCSMA/CDアクセス制御方式 (2/5) - @IT


 データリンク層には

 LLC副層とMAC副層がある

 というのだ。知らなかった。

 おぼろげながら、LLCという文字は見た事があるのだが
これは知らないという事に変わりはない。

 データリンク層だが、2つの階層にわかれている。
 それを階層の中に、階層を作っているので「副層」と呼んでいるのだ。

2つの副層に分かれているデータリンク層(TCP/IP)
2つの副層に分かれているデータリンク層
データリンク層は、LLC副層とMAC副層の2つにわかれている。

 ところでLLC副層とMAC副層というが・・・

 LLCやMACの意味は何やねん?

 なのだ。
 意味を知らないで、丸暗記だと行き詰まる。
 そこで調べてみると、LLCは

 Logic Link Control(論理結合制御)

 で、MACは

 MACはMedia Access Control(媒体接続制御)

 なのだ。

 LLC副層の役目を見てみる。

LLC副層の役目
(1) 論理アドレスの割り当て
(2) フレームの検査

 これだけだと

 だから、何やねん?

 になる。


 ところで話がややこしいのは、物理層とデータリンク層に
またがっている物があるからだ。

物理層とデータリンク層にまたがっている物
物理層とデータリンク層にまたがっている物
物理層とMAC副層が連携をとっているため上図のような
分類分けになっている。

後述しているが、この図で書いているIEEE802.3 Ethernetとは
IEEE802.3が標準化したEthenerの規格で、現在、主流ではないのだ。

 だが、色々、調べていくと

 現在ではLLC副層を使わへん!

 という記述しているサイトをいくつか見た。
 そうなると・・・

 一体、どないなってんねん?

 で混乱してきた。


MACフレーム

 MACフレームを見てみる。  
MACフレームの構造
MACフレームの構造。IEEE802.3とDIV型がある
IEEE802.3とEthernet II型(DIX型ともいう)がある。

 これを編集している時、いかにも冷静に調べているように思われるが

 Ethernet IIとは何やねん!!

 とか
 サイトの中には、Ethernetでも

 IEEE802.3のフレームという説明していると所があるやん!!

 で大混乱していたのだ。

 あとでわかったのだが、こういう違いがあるのだ。

EthernetとEthernet IIの違い
Ethernet IEEE802.3で標準化されたEthernetの規格
Ethernet II Dec、Intel、Xeroxの3社が標準化したEthernetの規格。
3社の頭文字をとってDIX型とも言う。

 現在では2つは互換性がとれている。
 そしてEthernetで主流なのが

 Ethernet II(DIX)

 なのだ。

2つのEthernetの規格の比較
MACフレームの構造。IEEE802.3とDIX型は、現在では中身は同じになっている
プリアンブルとSFDだが、IEEE802.3ではわけているが
EthernetII(DIX)では、わけていない。
SFDはStart of Frame Delimiterの略だ。
フレーム開始の合図になる部分だ。

EthernetIIでは、SFDをプリアンブルの最後の部分として組み込んでいる。

 プリアンブルの部分を見てみる。

MACフレーム:プリアンブル(EthernetII DIX)
MACフレーム:プリアンブル
「10」が続いているのは、同期をとるためだ。
あと、受信する側が、信号を受信する際、いきなりデータを送ると
同期がとれていないなどの理由で、受信し損ねる事がある。
それを防ぐため、受信し損ねても良いように「10」を繰り返した後
最後の「11」で、データ開始の合図を行なっているのだ。

 次に上の階層(ネットワーク層:IP層)で作られたデータの部分を見てみる。
 この部分のデータの長さは決まっている。

MACフレーム データ長(EthernetII:DIX)
MACフレーム データ長
実際のデータとPadding(パディング:詰め物)と呼ばれる部分がある。
この2つの合計が46オクテットから1500オクテットになるようにするのだ。

 Paddingをする理由は・・・

 CSMA/CDを行なうため

 なのだ。
 データが小さすぎると、衝突検出ができないため、小さいデータ送信の際
意図的にデータに詰め物をしてデータを長くしているのだ。


 次にMACアドレスが格納されている部分を見る。

MACアドレスが格納されている部分
MACフレームで、MACアドレスが格納されている部分
送信元のMACアドレスと、送信先のMACアドレスが格納される場所がある。
LAN内同士の通信の場合、MACアドレスを使って、お互いの通信を行うのだ。

 ところでMACアドレスは、48ビットで構成されている。

MACアドレスの構造(I/GビットとG/Lビット)
MACアドレスの構造(I/GビットとG/Lビット)
先頭のI/Gビットは、「Individual Address(個別アドレス)/Group Address(グループアドレス)」の略だ。
「1」が個別アドレス、「0」がグループアドレスになる。
通常、「0」なのだ。「1」の場合はブロードキャストの場合だ。
要するに、LAN内にパケットを撒き散らす際、「1」を使うのだ。

2ビット目の「G/Lビット」だ。 「0」なら唯一のグローバルアドレスの意味で、「1」はローカルアドレスの意味だ。
「1」は閉じたネットワークで使うらしく、プライベートIPに似たような感じだ。
ただ「1」が使われる事は、まずない。

 次にベンダーIDだ。

MACアドレスの構造(ベンダーID)
MACアドレスの構造(ベンダーID)
3ビット目からある22ビットの部分は、ベンダー(製造メーカ)のIDだ。
国際的な機関から割り当てられている。
そのため、ここの部分を見れば、LANの通信機器の製造メーカがわかるのだ。

ちなみにヤマハは「00-A0-DE」なのだ。(16進数表現に注意)

 そしてステーションIDだ。

MACアドレスの構造(ステーションID)
MACアドレスの構造(ステーションID)
ステーションIDは、製造メーカが任意で決める事ができる部分だ。

 だが、こういう説明をしても、いまいちピンとこないだろうし
ハッキリ書くと

 退屈でオモロナイ

 なのだ。

 私自身、退屈なので、何か良いものがないかと探してみたら
良い無償ソフトを発見したのだ。

Wireshark 無料のパケットキャプチャソフト

 無料のパケットキャプチャのソフト  Wireshark  を見つけた。  以下のサイトからダウンロードできる。  http://www.wireshark.org/  インストールの方法や簡単な使い方は以下のサイトにある。  ネットワーク入門サイト - Wiresharkの使い方  LLC副層を使うか、使わないかで混乱してきたが 実の所、MACフレームの構造を調べている間に気づいたのだ。  さて、実際にパケットの中身を見てみる。  先ほど紹介したWiresharkというソフトを使うのだ。
パケットチャプターソフト「Wireshark」の画面
パケットチャプターソフト「Wireshark」の画面
赤く囲んだ部分は、見たい通信部分だ。
通信プロトコルは「HTTP」なので、外部のWebサイトへの接続要求部分になる。

TCP/IP通信なので、MACフレーム、IPヘッダー、TCPヘッダーを見る事ができる。

そして桃色で囲んだのは、赤く囲んだ部分のパケットの中身だ。
本来なら「0」と「1」なのだが、ここでは16進数で表した物を表示させた。

茶色に塗っている部分は、パソコンのIPアドレスだ。
見られたくないので、塗りつぶしたのだ。

 MACフレームの中身を見てみる。
 まずは、送信先のMACアドレスだ。

送信先のMACアドレスを見る (Wiresharkというソフトを使う)
送信先のMACアドレスを見る (Wiresharkというソフトを使う)
外部のWebサイトへ接続要求した際のパケットだ。

送信先のMACアドレスは桃色で囲んだ部分だ。 「00-A0-DE」が含まれている。ヤマハに割り当てられている部分だ。

外部のサイトにパケットが向かう際、社内LANから外に出る際に
最初に通るのがヤマハのルーターだ。
そのためMACアドレスは、ヤマハのルーターのアドレスになっている。

パケットの中身を見ると、相手の情報まではわかってしまうのだ。

 次に送信元のMACアドレスを見る。

送信元のMACアドレスを見る (Wiresharkというソフトを使う)
送信先のMACアドレスを見る (Wiresharkというソフトを使う)
青色の部分は送信元のMACアドレスになる。
デルのパソコンなのが、バレバレなのだ。

 次のタイプを見てみる。

EthernetIIのMACフレームのTYPE部分とは
EthernetIIのMACフレームのTYPE部分
TYPEとは通信プロトコルの種類を示しているのだ。

 Wiresharkで拾ったパケットを見てみる。

MACフレームのTYPE(タイプ)をWiresharkで見てみる
MACフレームのTYPE(タイプ)をWiresharkで見てみる
MACフレームの上位層がIP層である事を意味する「0800」(16進数)になっている。


誤り検出のFCS

 MACフレームの最後の部分に誤り検出のFCSがある。  Frame Check Sequence  の略だ。直訳すると「フレームの並び検査」なのだ。
フレーム検査を行なう部分
MACフレーム フレーム検査を行なう部分
検査する部分はMACアドレス部分とデータ長、実際のデータ(パディング含む)だ。

 FCSは4oct(32ビット)なのだ。
 どういう風にFCSを求めるのか。

FCSの求めかた
MACフレームのFCS部分の算出の仕方はCRC演算
MACアドレス部分とデータ長、実際のデータ(パディング含む)のビットの並びを
CRC演算を行なって、32ビットのデータにしたのがFCSだ。

 ところで

 CRC演算って何やねん?

 なので調べてみた。

 Cyclic Redundancy Checking

 の略で、直訳すると「巡回冗長の検査」なのだ。

 だから何やねん!!

 なのだ。

 ここで動けなくなっても仕方がないので前に進んでみる。
 検査する範囲のビットの並びを、多項式で割った際の、余りの部分を
使うようだ。

CRC演算では生成多項式が使われる
CRC演算では生成多項式が使われる
検査部分を多項式で割った際の、余りがFCSになるという。

 これだけでは

 よくわからへん

 なのだ。
 そして・・・

 どうやってビットの並びを多項式で割るねん?

 なのだ。
 そこで具体的に見ていくと

ビットの並びを多項式で表現する
ビットの並びを多項式で表現する
生成多項式だが、元々は、ビットの並びだが、それを多項式表現にしている。
xが「1」の意味で、桁は「べき乗の値+1」になっている。

 なんで、こんな表現にするねんと思った。
 あとになって、案外、その方が見やすい事がわかった。


 さて、CRC演算の計算内容を見ていく事にする。

CRC演算の内容
具体的なCRC演算の内容
検査される部分のビットの並びから、生成多項式を割る。
生成多項式だが、1の部分をxに置き換えた物だ。
xの32乗は、1番目のビットが「1」という意味だ。

最初、ビット表現すればわかりやすいと思った。
だが、慣れてくると、xの多項式で表現した方が、わかりやすい。
後になって、情報科学の人が、多項式表現するのも、納得したのだ。

 このまま素直に、2進数の割り算を行なえば良いと思っていた。
 だが、色々調べてみると以下のサイトにたどり着いた。

 誤り検出方法 巡回符号(信州大学)

 普通の2進数演算とは異なる

 modulo2演算

 を使うというのだ。

 modulo2演算の特徴を知るため、信州大学の資料を見ていく事にした。
 modulo2の論理演算回路(信州大学)

modulo2の加算
modulo2の加算は排他的論理和
排他的論理和が使われている。
1+1=0になるのだ。

 桁上げが無視される。

modulo2では加算の際の桁上げは行なわない
modulo2では加算の際の桁上げは無視
加算の場合、桁上げは行なわない。
凄く違和感があるが、そういう方法なので慣れるしかない・・・。

 そして逆元だが・・・

 どんな物か忘れてしもた・・・

 20世紀は理系だったが、21世紀になってからは理系でない私。
 どんどん数学を忘れているのだ。
 そこで調べてみる。

逆元とは
加算の場合。a+b=0の時、aの逆元はb=-aになる。
乗算の場合。a・b=1の時、aの逆元はb=1/aになる。

わかったような、わからんような書き方になったが
打ち消し合う要素の事を逆元という。

加算の場合、1の逆元は-1になる。1+(-1)=0で打ち消し合うから。
乗算の場合、3の逆元は1/3になる。3・(1/3)=1で打ち消し合うから

 modulo2の場合、以下のようになる。

modulo2での逆元
modulo2での逆元
0の逆元は0
1の逆元は(-1)

 打ち消し合う要素なので、納得できるし、驚かない。

 乗算なのだが、論理積を使っている。

modulo2の乗算は論理積
modulo2の乗算は論理積

 modulo2の乗算の場合、逆元だが以下のようになる。

modulo2の乗算の逆元
modulo2の乗算の逆元

 これらの演算方法を頭にいれた上で、次のような演算を考えてみる。
 というよりも

 どこまで信州大学の資料の丸写ししているねん!!

 というツッコミが来そうだ。
 リンクを張って、丸写しを宣言しているのだから、盗作でも何でもないのだ。

modulo2を使ったビット演算
情報科学では、ビットの並びを多項式表現するので上図のようになる。
多項式の方がすっきりした感じがする。

 生成多項式で演算しているのを簡単に再現してみた。

CRC演算をやってみた
CRC演算をやってみた
桁下げを考えなくても良いので、案外、手計算もしやすい。

 ふと気づいた。

 EthernetII(DIX)では使われなくなったLLC副層の役目だ。

LLC副層の役目
(1) 論理アドレスの割り当て
(2) フレームの検査

 CRC演算でフレームの検査を行なっていたのはLLC副層というわけだ。
 だが、現在ではEthernetII(DIX)が行なっているのだ。

IEEE802.3のEthernetと、EthernetII(DIX)との比較
IEEE802.3のEthernetと、EthernetII(DIX)との比較<
IEEE802.3ではLLC副層が行なっていた事を
EthernetII(DIX)では、それ自身が行なっているのだ。

 データの誤り検出だが、物理層だけでなくデータリンク層でも行っている。


ARPプロトコル

 ところでLAN同士の通信は、MACアドレスを使って行っている。
LAN内のパソコン同士はMACアドレスを使ってお互いを認識している
LAN内のパソコンは、お互いをMACアドレスで識別して通信をしている。

 だが、ここで疑問が浮かぶ。
 TCP/IP通信だと、相手のIPアドレスを知っていると通信ができる。
 名前解決で、DNSサーバーを使えば、相手のホスト名などから
相手のIPアドレスがわかる。

 だが、MACアドレスの場合、どうやって知る事ができるのか。

 全く考えた事、あらへん!!

 なのだ。

 LANについて、基本的な事を知らない上、疑問に思わなかったのが
見事に露呈してしまった。
 でも、事務員なので、それで良いのだと勝手に開き直る。


 さて、どうやって相手のMACアドレスを知るのかを調べてみる。
 以下のサイトを発見。
 基礎から学ぶWindowsネットワーク:第11回 MACアドレスを解決するARPプロトコル(@IT)

 たどり着いたのは・・・

 ARPプロトコル

 なのだ。

 仕組みは単純。

ARP要求を行う
パソコンがLAN内にある全パソコンなどに対して、arp要求を行う
あるパソコンが、通信したい相手のMACアドレスを知りたい場合
LAN上にある全パソコンなどに対して、arp要求を行う。

ARP要求とは、通信したいパソコンのIPアドレスを提示して
そのIPを持つパソコンに対して応答を求める事なのだ。

 実際、ARP要求の様子を、Wiresharkで見てみる。

ARP要求の様子を、Wiresharkで見てみる
ARP要求の様子を、Wiresharkで見てみる
WiresharkをインストールしているパソコンからARP要求をしている様子だ。
デルのパソコンである事がバレバレだ。

 ARP要求のパケットはブロードキャストと呼ばれる物で、
同じLAN内のパソコンやルーターにパケットを撒き散らすのだ。

 そのため送信先はブロードキャストになっている。

ARP要求の場合、送信先のMACアドレスはブロードキャスト
RP要求の場合、送信先のMACアドレスはブロードキャスト
送信先のMACアドレスが「ff:ff:ff:ff:ff」になっている。

 そしてMACフレームにはTYPEがある。

EthernetIIのMACフレームのTYPE部分とは
EthernetIIのMACフレームのTYPE部分
TYPEとは通信プロトコルの種類を示しているのだ。

 ARP要求なのでTYPEは「0806」になるはず。

MACフレームのTYPEは「0806」
MACフレームのTYPEは「0806」
ARP要求のパケットなので、TYPEは「0806」になっている。

 そしてARP要求の場合、相手のIPアドレスに合致したMACアドレスを見つけるの目的だ。
 そのためARP要求のパケットの中身は、知りたいパソコンやルーターなどの通信機器の
IPアドレスを含ませているのだ。

ARP要求のパケットの中身
ARP要求のパケットの中身
senderは、ARP要求の送り手なので、自分自身になる。
自分自身のIPアドレスと、MACアドレスが記述されている。

Targetとは、相手の事を指す。
相手のIPアドレスが記述されている。
MACアドレスは、この段階ではわからないので「00:00:00:00:00」になっている。

(紫と茶色の塗りつぶしの部分について)
社内LANなのでプライベートIPを使っているのだが、社外に見せるわけにいかない。
そのため茶色と紫で塗りつぶしている。 「192.168」は、どこでも使っている部分なので「c0 a8」は見せている。
でも、その下の部分は隠しているのだ。


 さて次に、ARP要求に対するARP応答は、該当のIPアドレスを持ったパソコンが応答を行う。

該当のIPアドレスを持ったパソコンが応答を行う
該当のIPアドレスを持ったパソコンが応答を行う
該当のIPアドレスを持ったパソコンが応答をする。
その際、MACアドレスを伝えるのだ。

 実際に、Wiresharkで捕らえたパケットで見てみる。

ARP応答のパケット
ARP応答のパケット
相手から送られたARP応答なので、発信元は相手のパソコンや通信機器になる。
キャノン(ネットワークコピー機)から送られた応答なのだ。

 そしてキャノンから送られたARP応答のパケットの送信先を見てみる。

ARP応答のパケットの送信先
ARP応答のパケットの送信先
送信先は、ARP要求を行ったパソコンになる。
デルのパソコンなのがバレバレだ。

 そして相手から送られてきたMACアドレス(応答)を見る事ができる。

相手から送られてきたMACアドレス(応答)
相手から送られてきたMACアドレス(応答)
デルのパソコンからキャノンの複合機へARP要求をした際の応答だ。
ARP応答の送り手のキャノンの複合機のIPアドレスとMACアドレスが記述されている。
これによって、デルのパソコンは、キャノンの複合機のMACアドレスを知る事ができるのだ。

 このような形で、LAN上にあるパソコンや通信機器のMACアドレスを収集しているのだ。

 各パソコンや通信機器のMACアドレスを集めて記憶させると・・・

 IPアドレスからMACアドレスへの変換表ができる

 というのだ。

IPアドレスからMACアドレスへの変換表ができる
IPアドレスからMACアドレスへの変換表ができる
arp要求と応答を繰り返す事で、IPアドレスとMACアドレスの変換表ができるのだ。
これは、各パソコンがもっているのだ。(パソコンだけでなく、ルーターなども持っている)

 MACアドレス版の名前解決

 という感じだ。


 実際に、Windowsパソコンが取得したMACアドレスを表示させたい場合は
DOSプロンプトで以下のコマンドを打てば良いのだ。

ARPテーブルの確認(Windows7)
C:\>arp -a

インターフェイス: 192.168.A.Z --- 0xb
  インターネット アドレス      物理アドレス      種類
  192.168.A.B          00-0b-97-bf-cc-c2     動的
  192.168.A.C          ec-b1-d7-36-2c-8e     動的
  192.168.A.D          00-0c-29-6a-7e-39     動的
  192.168.A.E          98-ee-cb-30-f8-5c     動的
  192.168.A.F          24-26-42-06-d8-a3     動的

C:\>
パソコンが記憶しているMACアドレスの一覧を見るには
arpコマンドに「-a」のオプションをつける。

 Linuxだと以下のようになる。

ARPテーブルの確認(Linux)
[suga@linux]$ arp -a
naochan.example.co.jp (192.168.A.K) at 48:0F:CF:82:2B:45 [ether] on eth0
minamizawa.example.co.jp (192.168.A.L) at 00:C0:29:9F:EE:62 [ether] on eth0
nagasawa.example.co.jp (192.168.A.M) at 01:0C:29:03:DE:4C [ether] on eth0
[suga@linux]$
パソコンが記憶しているMACアドレスの一覧を見るには
Windows同様、arpコマンドに「-a」のオプションをつける。

 単なる説明や、MACアドレス一覧表の表示だけでなく
ARP要求とARP応答のパケットの中身を見る事で、実際の動きが見えるので
わかりやすいのだ。


LAN入門:目次
ストレートケーブルとクロスケーブル LANケーブルのストレートタイプとクロスタイプの違いを書きました。
リピーターハブとスイッチングハブ リピーターハブとスイッチングハブの違いと、全二重通信と半二重通信の話です。
10Base-T以降では、パケット衝突は、実は擬似衝突などを書いています。
社内LANの調査 2005年に、ブラックボックス化した社内LANを解明した話です。
オートネゴーシエーション 10Base-T、100Base-TX、1000Base-Tなどが混在する環境で
どうやって通信制御を行っているのか
その仕組みを書きました。
LANケーブルの規格 CAT(カテゴリー) LANケーブルの規格のCAT(カテゴリー)の違いを書きました。
データ送信とデジタル信号の符号化 LANケーブルを信号が伝わる際、どうやってデータ送信をしているのか。
デジタル信号の周波数を抑えながら、高速で信号送信する技術を書きました。
10Base-T、100Base-TX、1000Base-Tについて書きました。
データリンク層 LAN内のパソコンや通信機器同士の通信はMACアドレスが使われています。
それを司るデータリンク層について書きました。
表皮効果と近接作用 LANケーブル内で起こっている信号減衰の原因が
表皮効果と近接作用である事と
LANケーブルの撚り線が、ノイズ対策なのを書きました。
ツイストペアとノイズ対策 LANケーブルがツイストペア(撚り線)なのはノイズ対策のためです。
その話を書きました。
差動回路とノイズ対策 LANケーブルは8本あり、データ通信は複線で行っています。
差動回路を使ったノイズ対策の話を書きました。
同軸ケーブルの仕組み 昔のLANに使われていた同軸ケーブル。
現在でもテレビのアンテナに接続する線として使われたりしています。
同軸ケーブルの仕組みや特性インピーダンスの話を軽く触れました。
発振回路 クロック信号を作る発振回路の説明です。
簡単なLC型コルピッツ発振回路を使って説明しました。


目次:「LAN入門 LANの基礎」に戻る
前章:「電磁気学入門」を読む
目次:システム奮闘記に戻る