みなさんこんにちは!
(スキルアップIT講座)です。
今回は、ネットワーク層について学びましょう。
今回は、ネットワーク層プロトコルである、IP・ICMPについて学びます。
また、ネットワーク層のアドレスである、IPアドレスとマスク・IPルーティング、について学びます。
前提として、
・ ネットワーク階層モデルの知識
・ イーサネットの知識
・ イーサネットフレームの構造とデータリンク層アドレスの知識
を必要とします。「インターネットワーキング」及び「イーサネット」・「イーサネットフレームの構造とデータリンク層アドレス」を未受講の方はそちらから受講した方が良いでしょう。
ICMPもネットワーク層のプロトコルです。ICMPは通信を試みた時にシステムの状態情報とエラー情報を通知します。この通知情報を上位レベルのプロトコルが伝送に関する問題の修復に利用します。主にネットワーク上のトラブルの検出に利用するプロトコルです。
ICMPを利用した代表的なアプリケーションとして、
ICMP ECHO Request ECHO Replyを利用しているping(ピング)コマンドとtraceroute(トレースルート)コマンドがあります。
Pingは「IPホストの接続確認」に利用します。
Tracerouteは「宛先までの経路確認・接続確認」に利用します。Microsoft OSの場合tracert(トレサート)とタイプします。
主なICMPメッセージの種類に、
• 宛先到達不能メッセージ
• エコー要求/応答メッセージ
• 経路変更を通知するリダイレクトメッセージ
• 時間超過メッセージ
• ルータアドバタイズメッセージ ルータ要求メッセージ
があります。しばらくはこの程度を押さえておけば良いでしょう。
ICMPメッセージは、要求/応答メッセージとエラーメッセージに大別できます。
宛先到達不能メッセージはよくお目にかかると思います。
宛先到達不能メッセージは、ルータが最終宛先にパケットを届けられない場合に発生します。この時にルータはオリジナルのパケットを廃棄します。
全16タイプある宛先到達不能メッセージの基本タイプは次の4つです。
· ネットワーク到達不能network unreachableはルーティングあるいはパケットのアドレッシング障害発生を意味します。
· ホスト到達不能host unreachableは間違ったサブネットマスクを指定した時など、配信障害を意味します。
· プロトコル到達不能protocol unreachableは、宛先ホストにIPパケットは届いているものの、パケットに指定されている上位層プロトコルが宛先でサポートされていない場合に発生します。
· ポート到達不能port unreachableも、宛先ホストにIPパケットは届いているものの、サービスが停止しているなどTCP/UDPポートが使用できない場合に発生します。
経路変更を通知するリダイレクトメッセージを見てみましょう。
送信元IPホストの経路情報には、デフォルトゲートウェイR1のみの登録であり、R1は通信相手の属するネットワークへの経路情報を持っているとします。
送信元は通信相手がローカルネットワークに属さない事を宛先IPアドレスから理解しています。
送信元が通信相手と通信を試みると、送信したIPパケットはR1に到達します。なぜならば、送信元にとって全てのリモートネットワークへの出入り口はデフォルトゲートウェイであるR1のみなのです。
R1は通信相手の属するネットワークを知っていますから、R2へIPパケットを転送できます。
そこでR1は「通信相手の属するネットワークへの出入り口はR2である。」というICMPリダイレクトメッセージを送信元に通知します。
R1からリダイレクトメッセージを受けた送信元は、経路情報に「通信相手の属するネットワークへの出入り口はR2である。」というエントリを追加し、二回目以降の通信ではR1を経由せずに直接R2を経由して通信相手と通信します。
pingコマンドは宛先IPホストの接続性を検証します。送信元はICMP ECHO Requestを送信し、それを受け取った宛先はICMP ECHO replyを返します。
pingが成功しない場合、
ICMP ECHO Requestが宛先に届かなかったのか
ICMP ECHO Replyが送信元に届かなかったのか
を検証する必要があります。送信元が宛先までの経路を知っていても宛先が送信元までの経路を知らないとreplyパケットは戻ってこられません。
上の画面は時間超過メッセージの例です。IPパケットは無限ループを防止するためTTL Time to liveという値を持っています。この値はルータを1台経る毎に1つ減ります。この例ではIPアドレス192.168.5.60を持つホストに到達する前にTTLを消費しました。
下の画面はRequest Time Outです。送信元が期待する時間内に応答がない場合に発生します。
tracertコマンドは宛先までの経路確認と宛先の接続性確認が検証できるMicrosoft OSのコマンドです。
tracertコマンドは宛先までのICMP ECHO RequestをTTL値1から始め、TTL値を1つずつ増加し、宛先と宛先までの経路上の全ルータからの応答を表示します。宛先に到達する前にTTLを消費すると、ルータはICMP Time Exceededエラーを応答します。この応答をreplyとみなすことで結果を得ています。宛先に到達するとICMP ECHO Replyを得ます。
宛先と通信できない場合に、宛先が応答しないのか、経路上のどのルータから先が応答しないのか、障害切り分けに利用します。
セキュリティ上の理由でICMPトラフィックをフィルタしているネットワーク機器も多いので、tracertコマンドで結果が得られない・Request time outが表示される、からと言ってネットワークに障害が有るとはいえません。
tracerouteはUNIX互換OSのコマンドです。存在目的・機能はMicrosoft OSのtracertと同じです。
標準で名前解決をして結果表示をします。
利用するプロトコルは標準でUDPを使用します。サービスとして公開していないUDPポート番号宛にRequestを送信し、port unreachableメッセージを応答として利用します。-Iオプションを引数として設定するとICMPを利用します。
IPネットワークではデータは「パケット」と呼ばれる単位に分割して流れます。IPパケットはIPヘッダとL3データで構成します。IPヘッダには送信元と宛先を含む情報が格納してあります。
IPパケットはルータ経由して相手先ホストに送られます。ルータはIPヘッダ内の宛先アドレスをみて最適と判定したネットワークへ送り出します。
IPの通信は信頼性のない通信です。IPパケットの通信経路は不定です。その時点で1番最適と判定した経路を利用します。
パケットの受信順序も無保証です。後から送信したパケットが先に送り出されたパケットとは別の経路を利用して、先に宛先に到達する事も有り得ます。パケット消失する可能性もあります。パケットを確実に届けたい場合、TCPプロトコルを利用するとか、アプリケーションで再送機能を用意するなど、上位層で対応します。
IPパケットの流れをイメージしてみましょう。送信元と宛先の間には複数の経路と複数のルータが存在するネットワークがあります。
ここで「あいうえお」というストリームをIPパケット「あ」「い」「う」「え」「お」に分割して送信しました。
「あ」はその時点で最適と判定されて経路に送り出されました。つづいて「い」も同様にネットワーク上へ送られました。
「い」があるネットワークを通過中、そのネットワークで障害が発生しました。「い」は消失してしまいました。
続いて、「う」が送り出されます。障害を起こしているネットワークがあるので「あ」が送り出された時とは最適な経路が異なっています。
通信断のような障害が更に発生していなくても、混雑状況によっても最適経路判定は変化します。後から送り出された「え」は「う」とは異なる経路を利用しました。ネットワークの最適経路は時々刻々と変化していますので、このような事が起こります。
「う」は「え」よりも後に宛先に到達しましまた。どうやら、「お」は「え」と同じ経路を辿ったようです。
「あ」「え」「う」「お」の順でパケットは宛先に届きました。この後、パケットは順番を整え再びひとつのデータストリームに組み立てられるのでしょう。
現実のほとんどのアプリケーションデータでは、パケット「い」が消失したことで元のデータストリームに再構築できませんから、IPにはない「信頼性」を何らかの方法で実装し、パケット「い」を再送して元のデータストリームを再構築するでしょう。
既に述べたように、インターネット内では障害や遅延など回線状況は刻々と変化しています。パケットは、その利用する回線状況に応じて別の回線に進むこともあります。様々な経路を通じて最終的に相手に到着します。
ルーティングとは、任意のネットワークから別のネットワークへパケットを転送する事です。
IPパケットのルーティングをIPルーティングといいます。
ルーティングを行う機器をルータといいます。ルータは複数のネットワークインターフェースを持ちます。それぞれのインターフェースに届くIPパケットのヘッダにある宛先アドレスを見て、自分の持っているルーティングテーブルに従い、適切なインターフェースにパケットを送出します。
ルーティングテーブルとは、別のネットワーク上のIPホストと通信する時に、自分がパケットを転送する直接の転送先となるルータと宛先ネットワークを対応させた一覧表です。
IPネットワーク上のホストは全てルーティングテーブルを持ちます。送信ホストは自分のルーティングテーブルを見て、「宛先が属するネットワークは自分が属するローカルネットワークと同一ネットワークなのか別ネットワークなのか」を判断します。別ネットワークと判断した場合、そのローカルネットワークから外部への接続を持つルータへパケットを転送します。
IPアドレスを持っているホストはルータでなくてもルーティングテーブル 経路情報を必ず持っていることを忘れないようにしましょう。
ルータは自分のルーティングテーブルと、受取ったパケットのIPヘッダに記述された宛先IPアドレスを見て、適切な送出インターフェースを決定します。ルータのインターフェースが属するローカルネットワーク内のコンピュータが宛先であれば、直接パケットを転送します。宛先が別ネットワークならばその別ネットワークへの接続を持つルータに転送します。
それではここでルーティングをイメージしてみましょう。
IPアドレス192.168.1.1のホストは、
宛先192.168.1.0へはIPアドレス192.168.1.1のホストから送る
それ以外(0.0.0.0)のパケットは192.168.1.20から送る
という経路情報を持っています。
IPアドレス192.168.4.4のホストは、
宛先192.168.4.0へはIPアドレス192.168.4.4のホストから送る
それ以外(0.0.0.0)のパケットは192.168.4.20から送る
という経路情報を持っています。
IPアドレス192.168.1.20とIPアドレス192.168.4.20のルータは、
宛先192.168.1.0へはIPアドレス192.168.1.20のホストから送る
宛先192.168.4.0へはIPアドレス192.168.4.20のホストから送る
という経路情報を持っています。
IPアドレス192.168.1.1のホストからIPアドレス192.168.4.4のホストへ通信を試みました。
IPアドレス192.168.1.1のホストは、
宛先192.168.1.0へはIPアドレス192.168.1.1のホストから送る
それ以外(0.0.0.0)のパケットは192.168.1.20から送る
という経路情報を持っていますから、パケットはIPアドレス192.168.1.20に送られます。
パケットを受け取ったルータはパケットの宛先IPアドレス192.168.4.4を見て、宛先は192.168.4.0ネットワーク内であることを理解します。ルータは、
宛先192.168.1.0へはIPアドレス192.168.1.20のホストから送る
宛先192.168.4.0へはIPアドレス192.168.4.20のホストから送る
という経路情報を持っていますから、IPアドレス192.168.4.20のインターフェースからパケット送出します。
IPアドレス192.168.4.20とIPアドレス192.168.4.4は同一ネットワークに属しますから、ルータは宛先ホストへパケットを直接転送します。
IPアドレス192.168.4.4のホストは、受け取ったパケットの送信元アドレスを見て応答先をIPアドレス192.168.1.1に決定します。自分自身の持っている
宛先192.168.4.0へはIPアドレス192.168.4.4のホストから送る
それ以外(0.0.0.0)のパケットは192.168.4.20から送る
という経路情報から応答パケットをIPアドレス192.168.4.20に転送します。
パケットを受け取ったルータはパケットの宛先IPアドレス192.168.1.1を見て、宛先は192.168.1.0ネットワーク内であることを理解します。ルータは自分自身の持つ、
宛先192.168.1.0へはIPアドレス192.168.1.20のホストから送る
宛先192.168.4.0へはIPアドレス192.168.4.20のホストから送る
という経路情報から、IPアドレス192.168.1.20のインターフェースからパケット送出します。
IPアドレス192.168.1.20とIPアドレス192.168.1.1は同一ネットワークに属しますから、ルータは宛先ホストへパケットを直接転送します。
IPホストの持つ経路情報 ルーティングテーブルを確認してみましょう。
Microsoft OSの場合、routeコマンド・netststコマンドでも確認できます。
routeコマンドでは文字列printを引数にします。netstatコマンドでは、-rnを引数にします。
IPv6をenbaleにしてあれば、netshコマンドでも表示できます。
現在主流のIPv4アドレスは32ビット長でアドレス表示します。
次世代プロトコルのIPv6アドレスは128ビット長でアドレス表示をします。
マスクはIPネットワークの区別に利用します。ネットワークの分割に使用するサブネットマスクはマスクの一種です。マスクはIPアドレスのネットワークアドレスとして利用している範囲を指定します。連続してビットが立っている部分がネットワーク部分を表します。
任意のIPホストを比較し、IPアドレスのネットワークアドレス部分が同じだと同一ネットワークに属し、異なると別ネットワークに属すると判定できます。
別のネットワークに属しているIPホストと通信するにはIPルーティングを行うルータが必要です。
IPv4アドレスの表記方法は、
172.16.0.254
の様に、32ビット(4バイト)を1バイトずつドットで区切ります。この1バイトずつの区切りをオクテットと呼びます。左の始まりが第1オクテット、右の終りが第4オクテットです。人間が判り易いように10進数で表記していますが、コンピュータの中では2進数で処理しています。
IPv4でのマスクの表記は2通りあります。
255.255.255.128
の様に、IPv4アドレスと同様の、32ビットを1バイトずつドットで区切り10進数で表記する方法です。IPアドレスと対になって利用します。
もう一つは /25(スラ25)と、ネットワーク部分を表すビット数で表記する方法です。
例では、いずれの表記方法も、IPv4アドレス32ビットのうち先頭25ビットがネットワークアドレスであることを表しています。
それでは第4オクテットの値のみ異なる簡単なIPアドレスで、所属するネットワークを判定してみましょう。
172.16.0.60/25と172.16.0.120/25と172.16.0.129/25というIPホストがいます。
それぞれの第4オクテットの値を2進数に変換します。
マスク値は/25ですから第4オクテットの先頭1ビット目までがネットワークアドレスで使用しているのが判ります。
2進数に変換した3つのIPアドレス・第4オクテットのネットワーク部分のみを残しホスト部分を0にします。なぜならば、同一ネットワークで使用するIPアドレス範囲の先頭値がネットワークアドレスであり、ホスト部分がオールゼロだからです。
比較すると、172.16.0.60/25と172.16.0.120/25が172.16.0.0/25というネットワークに属すること、172.16.0.129/25は172.16.0.128/25というネットワークに属することが判りました。
ネットワーク構成を図にして見ました。同一ネットワークに属するIPアドレスのうち、先頭はネットワークアドレスです。最後はブロードキャストアドレスです。この2個のアドレスはホストで使用できません。
赤文字のネットワークでは
ネットワークアドレスは172.16.0.0/25
ブロードキャストアドレスは172.16.0.127/25
です。青文字のネットワークでは
ネットワークアドレスは172.16.0.128/25
ブロードキャストアドレスは172.16.0.255/25
です。
属するネットワークが異なるIPアドレス172.16.0.60とIPアドレス172.16.0.129というホスト同士の通信にはルータが必要です。
IPv6アドレスでは、2001:610:240:0:53::4のように、128ビット(16バイト)を16ビット(2バイト)ずつコロンで区切り16進数で表します。16進数ですから、二千四ころ、六百十ころ、とは読みません。ニゼロゼロイチ コロ ロクイチゼロ コロ のように読みます。0の連続は一箇所のみ省略可能です。
上位64ビットがネットワークアドレスを表します。この部分をPrefixプレフィックスと呼びます。
下位64ビットがホストアドレスを表します。この部分をInterface IDと呼びます。
ネットワークアドレスを表すPrefixはIPv4のマスクの表記と同様に、/bit長(スラ ビット長)で表示します。
通常、ISPはホストには/64でPrefixを払い出します。
通常、ISPはネットワークには/48でPrefixを払い出します。ローカルネットワークの管理者は16ビットを補完して使用します。
現在、インターネットではまだIPv6で通信できる範囲はわずかです。まだrootサーバが対応していません。しかし、jpドメインを管理するDNSサーバやGTLDサーバのうちAとBはIPv6に対応しています。また、ヨーロッパ・アフリカにおける地域インターネットレジストラ・IPアドレス管理組織のRIPE NCCのDNSサーバはIPv6に対応しています。
本講義は以上です。
次回は「トランスポート層」を受講する事をお勧めします。
またお会いしましょう。それでは!