どうもどうも、えもんだ社長です (๑╹ω╹๑ )
今回から、ネットワーク機器の挙動シリーズを始めます。
過去の記事で、IPアドレスやTCP/IP通信について書きました。
このシリーズでは、間に入るネットワーク機器の挙動を解説します。
- ネットワークエンジニアになりたい人
- インフラエンジニアでネットワーク機器の挙動に詳しくなりたい人
- とにかくITの教養を身につけたい人
こんな人にピッタリの記事です!是非ともお読みください。
※もし、TCP/IPについて全く初心者であれば、最初に下記の記事を読んで概要を把握することをお勧めします。
L2スイッチとは
L2機器とは
ネットワーク機器の種別の一つに、「L2機器」があります。
L2機器の機能を一言でいうと、
ネットワーク内の機器に通信を転送する
です。
イーサネットなどのL2通信(同一ネットワーク内通信)を転送する機器です。
スイッチとは
こんにちのネットワークエンジニアが主に扱うL2機器は、「(L2)スイッチ」と呼ばれるものです。
※「スイッチングハブ」の略ではありますが、通常は「スイッチ」と呼ばれます。
これは「スイッチング」という機能を備えているからです。
スイッチングとは、
L2ヘッダー情報を参照して、必要なポートにのみパケットを転送する
という機能です。
当たり前のことのようですが、スイッチングハブ以前のL2機器は「ハブ」などと呼ばれ、すべての受信フレームをすべてのポートへ送信していたのです。
当然、破棄フレームが大量に出て、通信効率は非常に悪かったのです。
スイッチの挙動(arpとデータ転送)
ここで、スイッチを使った通信を見てみましょう。
スイッチは、MACアドレステーブルという表を持ち、MACアドレスとポートの情報を格納します。
このMACアドレスとポートの情報は、(デフォルト設定では)パケットを受信した際に動的に更新されます。
実際の通信での挙動を見ましょう。
- 初期状態
MACアドレステーブルには何もありません。
- 端末aからarpリクエスト送信(最初の通信)
端末aからのarpですので、
送信元:aaaa.aaaa.aaaa
宛先:ffff.ffff.ffff
のブロードキャストが端末b、端末c、サーバに送信されます。
このとき、スイッチは受信したフレームの送信元MACアドレスを見て、MACアドレステーブルを更新します。
ここでは、ポート①にaaaa.aaaa.aaaa の機器が接続されていると学習しました。
- サーバからのarpリプライ送信
arpリクエストに対するリプライがサーバから送信されると、そのタイミングでスイッチはポート④に1111.2222.3333の機器が接続されていると学習し、MACアドレステーブルを更新します。
スイッチは、MACアドレス:aaaa.aaaa.aaaaの機器がポート①に接続されていることを知っているので、該当フレームをポート①から送信します。
- 端末bから端末cへのユニキャスト通信
その後、端末bから端末cへフレームが送信された場合を考えてみます。
宛先MACアドレスはcccc.cccc.ccccです。
しかし、MACアドレステーブルに該当のMACアドレスはありませんので、スイッチはどこ宛ての通信かわかりません。
この場合には、受信ポート以外のすべてのポートへ宛先:cccc.cccc.ccccのフレームを送信します。(これをフラッディングと言います)
※通常は、ユニキャスト通信に先立って、端末からarp(ブロードキャスト:ffff.ffff.ffff 宛て)が流れてMACアドレステーブルが更新されます。よって、フラッディングされることは珍しいです。
- 端末cから端末bに返信
端末cから端末bへ返信する際には、すでにスイッチは端末bのMACアドレスを学習しているので、ポート②からフレームを送信します。
この際に、ポート③に端末cのMACアドレスを学習します。
VLAN
スイッチング機能を拡張すると、L2機器でネットワークの分割まで行うことができる様になります。
これをVLAN(Virtual LAN、仮想ローカルエリアネットワーク)といいます。
文字通り仮想的なLANです。
VLAN機能は、ポートごとに通信できるVLANを決定することにより、ネットワークを分割できます。
※それぞれ点線枠内の機器間でしか通信できません。
注意点は、VLANはスイッチ内部のスイッチング処理に関わることでフレームに変更は加えていない、ということです。
つまりは、接続しているPCやサーバではVLAN情報は検知できません。
このVLANを利用することにより、かなり柔軟でキメの細かいネットワーク設計ができる様になります。こんにちのネットワーク設計では必ずといっていいほど使われます。
アクセスポート(ポートVLAN)とトランクポート(タグVLAN)
スイッチは端末やサーバから送信されたデータを受信し、適切なポートへ送信します。
この様な端末やサーバと接続するポートを「アクセスポート」といいます。
ただ、スイッチ同士をつなげる場合にはどうでしょうか?
よくよく考えるとわかりますが、同じVLANしか通さない(アクセス)ポートのみでは、それぞれのVLANを通るポートで両スイッチを接続する必要があります。
これではスイッチを接続するポートが大量に必要になります。
すべてのVLANのフレームを送受信できるポートがあると、ポートの数が大幅に節約できます。
そこで出てくるのがトランクポートです。
トランクポートでは「タグ」と呼ばれるデータを、フレームに追加し送信します。
【802.1qタグ付きイーサネットフレーム】
そのタグには、VLAN情報が入っており、対向のスイッチにフレームのVLAN情報を通知できるので、1ポートですべてのVLANのデータを送受信できます。
送信側のスイッチは、トランクポートで送信する際にフレームにタグを付与します。
受信したスイッチは、トランクポートで該当のタグを取り外し、あとは通常のスイッチング処理を行います。
L2通信のループとSTP(スパニングツリープロトコル)
L2通信は、経路がリング状になっていると、ループしてしまいます。
イーサネットでは、フレームの「賞味期限切れ」を判断する機能がありません。(L3のIPv4プロトコルにはあります)
そのため、通信経路がループしているL2ネットワークにブロードキャストを送信すると、同じフレームがグルグル回って何度も処理されてしまいます。
これをブロードキャストストームといいます。
ブロードキャストストームが起こると、ネットワークリソースを大量に浪費してしまい、正常な通信ができなくなってしまいます。
これを防ぐのがSTP(スパニングツリープロトコル)です。
STPでは、特定のアルゴリズムでブロッキングポート(その名の通り通信を通さないポート)を定めて、通信経路がループすることを防ぎます。
スイッチの挙動(VLAN、タグ、STP)
ここで、スイッチでVLANやタグを用いた通信を見てみましょう。
構成図は以下の通りです。
総務部と経理部でサーバを分けてあります。(同じサーバでフォルダ参照権限で分ける方法が一般的かと思いますが、とにかくサーバを分けるというセキュリティ要件があるものとします)
1階と2階に総務部の人と経理部の人がそれぞれいて、3階のサーバにアクセスします。
端末とサーバにはそれぞれIPアドレスが設定されていて、例えば端末aはフォルダのアドレスバーなどで
\\192.168.1.254\
と入力すれば、総務部の共有フォルダにアクセスできます。
その際、まずはarp(宛先MACアドレス:ffff.ffff.ffff)でアドレス解決がなされます。以下の流れです。
- 端末aからスイッチ2へarp送信
- スイッチ2はトランクポート経由でスイッチ1とスイッチ3にarp送信
- スイッチ1はブロッキングポートでarpをブロック
- スイッチ3はトランクポート経由でスイッチ1へ、アクセスポート経由で総務部サーバへarp送信
- スイッチ1はアクセスポート経由で端末bと端末cにarp送信
- 総務部サーバはarpリプライを送信
となります。
arpによるアドレス学習後の通信経路は、
端末a → スイッチ2のアクセスポート -(スイッチング処理)(タグ付与)→ スイッチ2のトランクポート → スイッチ3のトランクポート -(タグ取外し)(スイッチング処理)→ スイッチ3のアクセスポート → 総務部サーバ
となります。
また、この構成なら端末同士でデータのやり取りもできます。経理部の端末xから端末zへアクセスする際の通信経路は、
端末x → スイッチ2のアクセスポート -(スイッチング処理)(タグ付与)→ スイッチ2のトランクポート → スイッチ3のトランクポート -(タグ取外し)(スイッチング処理)(タグ付与)→ スイッチ3のトランクポート -(タグ取外し)(スイッチング処理)→ スイッチ3のトランクポート → - (タグ取外し)(スイッチング処理) → スイッチ1のアクセスポート → 端末z
となります。
なお、当然ながら端末bから端末cへの通信も可能です。
その際には、トランクポートは経由しませんので、タグ付け・取外しは行われません。(arpはブロードキャスト宛なので、トランクポートを介して3台すべてのスイッチを経由し、すべての端末・サーバに届きます)
まとめ
この記事では、L2スイッチの基礎的な挙動を記載しました。
まだまだ掘り下げるとかなりいろいろな機能がありますが、この記事で解説した通信の一つ一つの動きを意識するのはとても大事です。
ここに書いてあることをすべて理解すれば、現場で適切な質問をできるレベルにはなると思っています。
一人前のエンジニアになるのは長い道のりですが、一歩一歩進めていけば必ず到達できます。
是非とも頑張りましょう!
それでは (*゚▽゚)ノ