LAN技術研究室(LANに関心がある人のために情報を提供しているサイト)
このページでは、IPv4を対象にIP(Internet Protocol)について解説しています。
LANの初歩
ネットワーク層のプロトコル
IP(Internet Protocol)
OSI参照モデルでデータリンク層のすぐ上に位置するのがネットワーク層です。
OSI参照モデルについては、プロトコルの基礎をクリックして参照できます。
ネットワーク層のプロトコルとして代表的なものにIP(Internet Protocol)があります。
IPは、インターネットでもLANでもIPパケットが流れているのをよく見かけます。
ネットワーク階層モデルで見て、MACフレームの上位に相当するIPパケットは以下の図のようになります。
一般的なIPヘッダー(オプションなしのケース)
バージョン【4ビット】 |
ヘッダー長【4ビット】 |
サービスタイプ【8ビット】 |
パケット長【16ビット】 |
識別子【16ビット】 |
フラグ【3ビット】 |
フラグメント・オフセット【13ビット】 |
TTL【8ビット】 |
プロトコル番号【8ビット】 |
ヘッダー・チェックサム【16ビット】 |
送信元IPアドレス【32ビット】 |
宛先IPアドレス【32ビット】 |
(この後にオプションが続いて少し長くなることがありますが必須ではありません) |
- (1) バージョン
このフィールドには、IPのバージョン番号が設定されます。
IPv4なら4、IPv6なら6が設定されます。
- (2) ヘッダー長
このフィールドには、IPヘッダーのサイズを設定します。
ただし、4ビットしかないフィールドなので、このままなら0〜15までしか設定できません。
IPヘッダーは、後続のオプションがなくても最低20オクテットのサイズがあるので、フィールド長が足りません。
そこで、32ビット(4オクテット)単位で値が設定されています。
従って、最低でも5という値が設定されています。
後続のオプションがある場合でも、60オクテットまで設定できます。この場合は最大の15が設定されます。
つまり、実際のIPヘッダー長(単位:オクテット)÷4の計算結果がこのフィールドに設定されます。
例えば、最低の20オクテットのサイズなら、20÷4=5となるので、このフィールドには5という値が設定されます。
ヘッダー長のフィールドに関する説明はこれだけですが、情報を表す単位について、ついでに説明しておきます。
情報を表す最低の単位は皆さん御存知だと思いますが、ビットです。
このビットが8ビット集まればバイトです。
これもLANを学ぼうとしている人ならほとんどの人は御存知でしょう。
このバイトと同じで、8ビット集まった情報で前に出てきたオクテットという単位もあります。
8ビットは、2進数で8桁、16進数で2桁と覚えておいて下さい。
オクテットは、どちらかというとネットワークで使われることが多いです。
他ではあまり見かけないので、オクテットという単位を初めて知った人もいるかもしれませんが、当サイト(LAN技術研究室)ではネットワークに関するサイトなので、バイトを使わずオクテットで統一したいと思います。
また、前述の(1) バージョンや、この(2) ヘッダー長のように、4ビット単位もあります。
これが nibble(ニブル)です。
4ビットで1ニブルと言います。
4ビットは、2進数で4桁、16進数で1桁と覚えておいて下さい。
- (3) サービスタイプ
このフィールドは、ToS(Type of Service)のことでIPパケットが示すサービスの質を示します。
ToSの詳細を以下の表に示しておきます。
サービスタイプの先頭からの相対ビット | 各ビットごとの意味 | 設定する数値とその意味 |
0〜2 | 優先度【3ビット】 |
高い優先度 | 111 |
↑ | 110 |
| | 101 |
| | 100 |
| | 011 |
| | 010 |
↓ | 001 |
低い優先度 | 000 |
|
3 | 遅延【1ビット】 |
|
4 | スループット(単位時間当たりに処理する量)【1ビット】 |
|
5 | 信頼度【1ビット】 |
|
6〜7 | 予約ビット【2ビット】 | 2ビットすべて0 |
- (4) パケット長
このフィールドには、IPパケット全体のサイズが設定されます。
このフィールドの長さが16ビットもあるので、前述のヘッダー長とは異なり、オクテット単位の数値になります。
最大で65535オクテットまでの数値が設定できます。
- (5) 識別子
このフィールドは、送信したい全体のデータを複数のIPパケットに分割して送信する必要がある時に使用されます。
分割された一つ一つのIPパケットを識別するために一意の値が送信元によって設定されます。
- (6) フラグ
この3ビットのフラグ・フィールドに関しては、RFC791に記載されています。
RFC791も含めてRFCの詳細は、以下のサイトで御覧下さい。
IETF RFC Page
JPNIC RFC-JP(社団法人:日本ネットワークインフォメーションセンター)
RFC791(英文)【IETF RFC Page】
この3ビットのフラグ・フィールドが示す意味は以下の表の通りです。
相対ビット | 各ビットごとの意味 | 設定する数値が0の場合 | 設定する数値が1の場合 |
0 | 予約ビット | 0に設定しておく | |
1 | DF(Don't Fragmentの略:断片化禁止フラグ) | IPパケットの分割が可能 | IPパケットの分割不可 |
2 | MF(More Fragmentの略:断片化継続フラグ) | 最後の断片 | 後続断片あり |
- (7) フラグメント・オフセット
Fragment(フラグメント)は断片を意味しています。
断片化されたIPパケットが、全体のデータの内、先頭からの相対的な位置を示す数値が64ビット(8オクテット)単位で設定されます。
従って、このフラグメント・オフセットのフィールドに設定されている値を8倍した値が、全体のデータの先頭からの位置になります。
結果的にこの数値は、このフィールドを含むIPパケットが、最後の断片までの間のどの位置にあるデータなのかを示しています。
- (8) TTL
TTLは、Time To Liveの略で、IPパケットの有効時間というか、生存時間というか、IPパケットの寿命のことを示します。
TTLは、ルーターを通過するたびに1ずつ減らすように決められています。
また、TTLのデフォルト値が64と決まっています。
TTLに関しては、RFC1700に記載されています。
RFC1700も含めてRFCの詳細は、以下のサイトで御覧下さい。
RFC1700(英文)【IETF RFC Page】
IETF RFC Page
JPNIC RFC-JP(社団法人:日本ネットワークインフォメーションセンター)
TTLの数値は、中継するルーターの数または秒数で指定され、IPパケットがインターネットの中で生存できる最大の数または最大時間を示していて、この値が0になるとそのIPパケットは破棄されます。
秒数として指定する場合の最大値は255秒ですが、TTLの値を最大秒数で実装する例はほとんどないようです。
- (9) プロトコル番号
このフィールドには、IPより上位層のプロトコルに対応した番号が設定されます。
以下の表に代表的なプロトコルに対応した番号と示しておきます。
プロトコル番号(10進数表示) | プロトコル | 説明 |
1 | ICMP | 主に通信状態をチェックするのに役立つプロトコル |
2 | IGMP | ホストのマルチキャスト・グループ情報のルーターへの通知 |
6 | TCP | 複雑な伝送制御手順があり、信頼性が高い通信を行える最も良く利用されるプロトコル |
17 | UDP | ポート番号を使用してお互いを認識できる程度しかできないデータグラム通信だけのプロトコル |
41 | IPv6 | IPv4の32ビットアドレス空間を128ビットにまで拡張した次世代IP |
47 | GRE | VPNのPPTPというプロトコルと関係するプロトコル |
89 | OSPF | 大規模ネットワーク向け動的ルーティングプロトコル |
- (10) ヘッダー・チェックサム
このフィールドには、IPヘッダーのみをチェックするチェックサムが設定されます。
前述のように、断片化されたIPパケットが届くことがあるので、IPパケットのヘッダー・チェックサムの場合、IPヘッダーに続くデータまでチェックすることはできません。
従って、IPパケットに含まれるヘッダー・チェックサムでは、IPヘッダーしかチェックしません。
チェックサムとは、簡易的な誤り検出方法の一つで、データを一定の長さで分割し、分割した塊ごとのデータを数値とみなして、その合計を計算した値を言います。
IPパケットのヘッダー・チェックサムでは、以下のようなアルゴリズム(算法)になり、このアルゴリズムに基づいてプログラムが計算を行います。
まず、データを16ビットごとの塊に分割します。
この場合のデータは、IPヘッダーになります。
そして、それぞれの塊を数値とみなし、すべての数値を加算します。
この計算で桁溢れした場合は、桁溢れした分の数値を分離して加算結果に加算すると、また16ビットの数値になります。
この部分の計算を1の補数和と言います。
その後で、すべてのビットを反転し、ヘッダー・チェックサムのフィールドに設定します。
ここまでは、送信側のプログラムが行います。
今度は受信側のプログラムは、以下のように受信したIPヘッダーを検証します。
受信側では、送信側と同じようにIPヘッダーを16ビットごとの塊に分割します。
そして、それぞれの塊を数値とみなし、すべての数値を加算します。
その中には、送信側のプログラムで設定したヘッダー・チェックサムも含まれています。
この加算で桁溢れした場合は、桁溢れした分の数値を分離して加算結果に加算すると、16ビット分の16進数でFFFFになれば通信中のエラーがなかったことを示します。
受信側ではこのように検証します。
ところで、前述の「1の補数とは何ぞや?」と思った方は、以下の項目をクリックすると参照できます。
1の補数と2の補数の計算方法について
また、1の補数和と、実際のIPパケットに含まれるヘッダー・チェックサムの計算方法に関して、以下の項目をクリックすると参照できます。
チェックサムの具体的な計算方法の紹介
ヘッダー・チェックサムに関しては、RFC1071に記載されています。
RFC1071も含めてRFCの詳細は、以下のサイトで御覧下さい。
IETF RFC Page
JPNIC RFC-JP(社団法人:日本ネットワークインフォメーションセンター)
RFC1071(英文)【IETF RFC Page】
また、内容を保証できませんが、RFC1071の日本語訳が以下のサイトにあります。
RFC1071 インターネットチェックサムの計算
- (11) 送信元IPアドレス
送信元を示すIPアドレスがこのフィールドに設定されます。
IPアドレスは、一般に以下のような表記をし、特定の宛先を表します。
192.168.0.1
IPアドレスに関する詳細は、IPアドレスについてという項目で解説します。
通常このIPヘッダーの後にデータが続きます。ただし、上位のプロトコルのヘッダーやデータになることもあります。
プロトコルの階層とパケットの関係は、ちょうどお皿を下から積み上げていくようなイメージになります。
日本ではあまりなじみがありませんが、西洋ではスタックという皿を積み上げておく器具があります。
ちょうどこんな感じなので、プロトコルの階層の集まりをプロトコルスタックと呼びます。
一つ一つのお皿に前述のIPヘッダーのようなヘッダーが書かれていて、どんどん積み重ねていきます。
一番下は、MACヘッダーが書かれたお皿、その上にIPヘッダーが書かれたお皿、その上にTCPヘッダーが書かれたお皿、...というように積み上げてく感じになります。
全部積み上がったら、パケットとしてネットワークに投げてしまいます。
このような説明なら、大変よくわかったと思います。
OSI参照モデルでもTCP/IP階層モデルでも、IPはレイヤ3のネットワーク層を示します。
聞いたことがあるかもしれませんが、レイヤ3スイッチやルーターはこのネットワーク層で中継する装置を意味します。
なんとなくおわかりになれたとは思いますが、実際にIPパケットのデータに含まれるIPよりさらに上位プロトコルのヘッダーやデータも含めて詳しくパソコンで見たいという場合は、プロトコルアナライザーと呼ばれるソフトウェアを使って見ることができます。
LANを流れるパケットやプロトコルの分析に関しては、後述するネットワークを流れるデータの解析についての基礎知識で解説します。
- (12) 宛先IPアドレス
宛先を示すIPアドレスがこのフィールドに設定されます。
IPヘッダーの各フィールドに関する説明はここまでです。
ネットワーク層に位置するIPというプロトコルは、主に以下の二つの機能があります。
- (1) ルーティング機能
IPパケットに含まれる宛先のIPアドレスを見て、送るべき経路を選択し、正しい宛先に届いたIPパケットを転送します。
中継装置としてのルーターがこの機能を実現するために経路選択を担当します。
- (2) フラグメント機能
IPパケットのサイズがMTUのサイズより大きいと、中継装置や送信元でIPパケットのサイズがMTUのサイズ以下になるように分割して、全体のデータのフラグメント(断片)として宛先に送信します。
これがフラグメント機能です。
上記の文中に登場したMTUという用語についてLAN初心者の方のために説明します。
MTUとは、Maximum Transmission Unitの略で、1回で送信可能なフレームの最大値のことを言います。
OSI参照モデルにおけるデータリンク層では、ネットワーク・インターフェイスごとにフレームの最大長が決まっています。
ネットワーク・インターフェイスとは、パソコンではLANカードと1対1で対応します。
例えば、今パソコンに1枚しかLANカードがインストールされていないとします。
この場合、ネットワーク・インターフェイスは1つになります。
このインターフェイスを2つにしたいのなら、LANカードをもう一枚増設します。
ところで、現在のLANではイーサーネット(Ethernet)が主流です。
イーサーネットのフレーム(MACフレーム)の最大長は1500バイトです。
EthernetII(DIX仕様のイーサーネット)の場合、この1500バイトがMTUとなります。
MTUはインターフェイスと1対1で対応しています。
インターフェイスごとにそれぞれフレームの最大長があるということです。
ちなみに、イーサーネット以外のに関しては以下の表のようになっています。
代表的なフレーム | MTUのサイズ(単位:オクテット) |
IP over ATM | 9180 |
FDDI | 4352 |
PPPoAまたはケーブルテレビ(CATV)インターネット ※1 | 1500 |
xDSL,PPPoEなど ※2 | 1492 |
フレッツADSL ※3 | 1454 |
ダイヤルアップ接続 ※4 | 576 |
- ※1 ケーブルモデムなどを使用するCATVインターネットではMTUを1500にしますが、若干小さく調整する必要がある場合もあります。
- ※2 xDSLやPPPoE以外
IEEE802.3仕様のイーサーネットもMTUは1492です。
フレッツADSL以外のADSLの場合、MTUは1492に設定します。
- ※3 PMTUDブラックホール
PMTUDとは、Path Maximum Transmission Unit Discoveryの略で、パス最大転送ユニット・ディスカバリーのことを言います。
PMTUDは、MTUの値が異なるネットワーク間でも問題なくIPパケットの転送が行えるようにした仕組みで、IPパケットを断片化せずに転送します。
PMTUDに関しては、RFC1191に記載されています。
RFC1191も含めてRFCの詳細は、以下のサイトで御覧下さい。
IETF RFC Page
JPNIC RFC-JP(社団法人:日本ネットワークインフォメーションセンター)
RFC1191(英文)【IETF RFC Page】
ところで、NTTのフレッツADSLでは、MTUの値を1500に設定すると、一部のWebサイトのホームページを表示できなくなることがあります。
フレッツADSLでは、上の表で示したとおりMTUの値を1454に設定しています。
1500と1454を比べてみると、1454の方は中途半端で少し小さい数です。
インターネット上には、いたるところにルーターという中継装置があります。
もし、1500バイトのIPパケットを受信すると、これを受け取ったルーターは、NTTのIPネットワーク(NTTの地域IP網)に転送する直前で、1500では大きすぎるので、このIPパケットを分割して転送する必要があります。
この分割対象が、あるユーザーがどこかのWebサーバーのホームページを表示しようとした時に転送されてきたIPパケットだったとします。
このWebサーバーがIPパケットを分割できない設定だった場合、「IPパケットを分割できない」という意味のエラーパケットを返そうとします。
ところが、途中に存在するサーバーが、前述のエラーパケットも含めたICMPというプロトコルに従って送受信されるパケットを破棄する設定になっていた場合、前述のWebサーバーからのIPパケットだけではなく、前述のエラーパケットも受け取れないことになってしまいます。
ユーザーサイドから見ると、ホームページの情報となるIPパケットを受け取れず、エラーの原因を示すエラーパケットも受け取れない状況に陥ります。
この問題の犯人は、前述のルーターというわけではないのですが、あたかもこのルーターが次から次へと来るIPパケットをどんどん飲み込んでは捨ててしまっているように思えます。
これは、まるでルーターがIPパケットをどんどん吸い込んでは消滅させているイメージを抱くので、宇宙にあるブラックホールと似ていることからPMTUDブラックホール(Path Maximum Transmission Unit Discovery Black Hole)と呼ばれています。
PMTUDブラックホールに関しては、RFC2923に記載されています。
RFC2923も含めてRFCの詳細は、以下のサイトで御覧下さい。
IETF RFC Page
JPNIC RFC-JP(社団法人:日本ネットワークインフォメーションセンター)
RFC2923(英文)【IETF RFC Page】
この解決方法として、ホームページを見る方のパソコンでMTUの値を1454に設定します。
設定するためのソフトがあります。
Windows®用のソフトを紹介します。
ダウンロードしてファイルを解凍したら、すぐMTUの値を変更する前に、Windows®ならDOSプロンプトでpingというコマンドを実行して下さい。
スタートボタンをクリックし、「ファイル名を指定して実行」をクリックし、cmdと入力してOKをクリックすればDOSプロンプトが簡単に出ます。
cmdを入力しなくてもマウスだけでDOSプロンプトを起動することができますが、メニューの階層が深いので面倒くさいです。
DOSプロンプトのウィンドーが開いたら、以下のように入力し、Enterキーを押して下さい。
MacOS Xでもターミナルというプログラムを実行すれば、以下とまったく同じコマンドを実行できます。
ping -f -l 1500 xxx.xxx.xxx
xxx.xxx.xxx のところには、インターネットの向こうに存在する見たいホームページがあるWebサーバーのドメイン名かIPアドレスを指定します。
-l は、ICMPパケットの長さを指定するpingコマンドのオプションです。
pingコマンドは、前述のICMPを使用してデータを送信しています。
-f は、IPパケットの断片化を禁止するオプションです。
つまり、「IPパケットを分割して送ることはできないよ」ということでこれに従ってpingコマンドはICMPパケットを送信します。
このオプションが指定されている時は、前述のIPヘッダーの(6) フラグのフィールドで、DF(Don't Fragmentの略:断片化禁止フラグ)に1を設定してIPパケットを送信します。
上記の通りにpingコマンドを実行すると、以下のメッセージが何行か出ると思います。
Packet needs to be fragmented but DF set.
これが出たら、xxx.xxx.xxx のWebサーバーにICMPパケットが届きません。
IPパケットの分割を禁止していて、なおかつ前述のWebサーバーまでICMPパケットが届かなければなりません。
そこで、前述のフリーソフトの出番です。
EditMTUでもNetTuneでもどちらでもかまいません。
これらのツールでMTUの値を1454に設定します。
今度は以下のようにpingコマンドを実行してみます。
ping -f -l 1454 xxx.xxx.xxx
稼動中のWebサーバーなら、今度は以下のようなメッセージが何行か出たと思います。
Reply from xxx.xxx.xxx: bytes=1454〜
xxx.xxx.xxx にはWebサーバーのIPアドレスが表示されていると思います。
これで問題なくブラウザで目的のWebサーバーのホームページが見れると思います。
ちなみに、NetTuneでは、PMTUDの項目があり、この項目でEnableをクリックしておくと、目的のホストまでのMTUを自動的に見つけようとしてくれます。
また、Macintoshをお使いの方は、MTU関連の設定を変更できる以下のツールがあります。
MacOS9 :IPNetTuner
MacOS X:RMAC
ここまでで、IPというプロトコルの二つの機能についておわかり頂けましたでしょうか。
ところで、IPというプロトコルは、IPパケットを宛先に送り届ける小包配達人のような働きをします。
パケットとは小包のことです。
しかし、この配達人はあまり責任感がある者ではなく、よく確認せずにIPパケットを配達してしまいます。
本当に宛先に届いたかどうかのチェックは一切しません。
まるで遠くへ発射した鉄砲玉みたいで、当たったかどうかが不明です。
従って、データ保証はできません。
そのため、正確にデータを送りたい場合は、ネットワーク層より上位層(トランスポート層)にデータ保証を委ねることになります。
そこで、TCP(Transmission Control Protocol)というプロトコルの出番になります。
TCPに関しては、トランスポート層のプロトコルをクリックして参照できます。
ページトップへ
ネットワーク層のプロトコル[メニュー]へ戻る
サイトマップ(LAN技術研究室の案内図)
ネットワーク技術用語集へ行く
LAN技術研究室のトップページへ
© 2007 Toyozi Masuda All rights reserved.