開発ノート【通信の共通言語:TCP/IPモデル(Internet Protocol)】
開発ノート【通信の共通言語:TCP/IPモデル(Internet Protocol)】です。
当サイトは、Bootstrap5で製作しています。
TCP/IPモデル(Internet Protocol)
IPの概要
- IPは、インターネット層に相当するプロトコルで、ホスト間のエンドツーエンドの通信を実現する。
- IPには、ホスト同士が通信するために使うIPアドレスがある。
- IPには、2つのバージョンがある。
・IPv4(IP Version4):IPと言えば、通常はIPv4を指す。
・IPv6(IP Version6):IPv4の後継プロトコル
通信方法
- EthernetがMACアドレスを使うのと同様に、IPはIPアドレスを使ってホストと通信する。
- IPにも送信元アドレス(Sourceアドレス)や送信先アドレス(宛先アドレス、Destinationアドレス)がある。
- IPヘッダに書かれた送信先IPアドレスに向けてIPパケットを転送していき、通常は目的のホストにのみ届くため、無関係のホストにIPパケットが転送されることはない。
(Ethernetは、送信先MACアドレスに対して関係のないホストに届いた場合は、無視して破棄) - インターネット層(ネットワーク層)プロトコルには、どのネットワーク機器を経由して、最終的な目的地に到達するのがベストかを判断するための仕組みがあり、IPパケットはこの仕組みを使って送信先アドレスの方向にのみ進んでいく。
IPパケット
IPヘッダ

・トランスポート層から渡されたデータはIPヘッダが付与されるが、そのIPヘッダの詳細が上図。
(Ethernetフレームと比べるとフィールドが多い)
・IPヘッダは通常20バイトなので160ビットだが、Ethernetフレームのように横一列では書ききれない。
(そのため、内訳を書くときは上図のように32ビットずつ縦に書いていくことがある)
・Option&Padding:使用しなくてもよいが、使うときは32ビット単位になるので、不足部分に長さを調節するためのデータを付加する。
これを、Paddingという。
・PAYLOAD:ヘッダを除いたデータ部分のこと。
- Version(4ビット):IPのバージョン。IP Version4なら4が入る。
- IHL(4ビット):Internet Header Lengthの略。
ヘッダの長さを32ビット単位で示す。
IPヘッダは、オプションを使用しなければ160ビットなので、通常は5が入る。 - Type of Service:略してトスと呼ぶこともある。
IPパケットの重要度に応じて優先度を付けるときに使用する。
これと似たものがIEEE 802.1QのVLANタグ。
通信では、データの中身に応じて他のパケットよりも優先的に処理して欲しいときに重要度を設定して、アプリケーションの品質を確保することができる。
このような機能を、Quality of Serviceといい、QoSと略す。 - Total Length:IPヘッダ及びデータ部分で、IPパケット全体の長さをオクテット単位で示す。
※オクテット:8ビットのこと - Identification:フラグメントされたIPパケットを戻すときの識別子で、同じであれば同じIPパケットと判断する。
※フラグメント(断片化):
ネットワークで送信するデータは、いくらでも送信できる訳ではなく、リンク層で運べるデータサイズというものが決まっている。
メールやWebブラウザなど、アプリケーションが扱うデータ(=PAYLOAD)サイズが大きいとき、リンク層プロトコルで運べるサイズを超えている場合には、PAYLOADを運べるサイズまで小さく分割する必要がある。
この分割を、フラグメント(断片化)という。

分割したものを元に戻すときに、元が同じIPパケットかどうかを判断するための識別子が、Identification。
- Flags(3ビット):フラグメントに関する制御情報。
先頭の1ビットは、使用せず0がセットされている。
2ビット目は、DF(Don't Fragment)ビットといい、0ならフラグメント可能、1ならフラグメント禁止を意味している。
3ビット目は、MF(More Fragment)ビットといい、2ビット目が0のときに3ビット目が0なら、これがフラグメントされた最後のIPパケットであることを意味する。
3ビット目が1なら、フラグメントされたIPパケットが続くことを意味している。 - Fragment Offset:フラグメントされたIPパケットの位置を示している。
フラグメントされた場合は、Identificationで元が同じかを判断し、Fragment Offsetから正しい配置を知ることで、元のIPパケットに戻すことができる。 - TTL(Time to Live):IPパケットの寿命を示し、0~255の値がセットされる。
ネットワーク機器で、IPパケットを転送する際には、この値を1減らす必要があり、0になったIPパケットは破棄される。
このTTLがあることで、Ethernetのブロードキャストストームのように、延々とIPパケットが転送され続けることを防げる。 - Protocol:IPパケットが運ぶ、上位レイヤーで使われるプロトコルの種類を示す番号がセットされる。
代表的なものに、
1:ICMP
6:TCP
17:UDP
がある。 - Header Checksum:IPヘッダの誤り検査に使われる。
EthernetフレームにもあったFCSに似ているが、IPパケットではヘッダ部分のみが検査の対象になる。 - Source Address,Destination Address:それぞれ、送信元,送信先(宛先)を示すIPアドレスがセットされる。
- オプションを使わなければ、Version~Destination Addressまで、32ビットが5行あるので160ビットとなり、20バイトとなる。
IPアドレスの概要
IPアドレスは、インターネット層で通信を行うホストやネットワーク機器が持つアドレス。
- IPアドレスによって、ネットワーク全体の中で自分の居場所を示すことができる。
- IPアドレスは、32ビットで構成され、8ビットずつドットで区切り、10進数で表す。
- 8桁ずつ区切るのでIPアドレスの範囲は、0.0.0.0~255.255.255.255となる。
- IPアドレスのドットで区切られた塊を、順に第一オクテット、第二オクテットと呼ぶ。
- IPアドレスは自分の存在を表すため、基本的にはユニークとなる。
- IPアドレスは32ビットであることから、約42億以上のIPアドレスを使うことができる。
しかし、42億ものIPアドレスを一つずつ扱うのは大変なため、IPアドレスを2階層に分けて扱うことになっている。
32ビットの中で、グループを表す部分と、グループの中で自分自身を表す部分の2階層構成になっている。
ネットワーク部:グループを表す部分。
ホスト部:グループの中で自分自身を表す部分。
クラス
IPアドレスは2階層に分けて考えるが、その階層とは別に大きなグループに分けて考えるようにしたのが、クラス。
- 約42億ものアドレスを、扱いやすいように5つのクラス(グループ)に分けている。

※クラスDは、マルチキャストという用途で使うことが決められている。
※クラスEは、将来に備えて予約されているため、私たちが使うことはできない。 - ネットワーク部とホスト部は、それぞれのクラスで決められている。

クラスA:前半8ビットと後半24ビット。
クラスB:前半16ビットと後半16ビット。
クラスC:前半24ビットと後半8ビット。 - 192.168.0.1は、下記のようになる。

クラス:クラスC(ネットワーク部24ビットとホスト部8ビット)。
グループ:192.168.0のグループに所属。
アドレス:1のアドレス。 - 8ビットずつの区切りでネットワーク部とホスト部を分ける使い方を、クラスフルという。
- クラスの見分け方
第一オクテットを2進数に変換して、先頭の4ビットを見る。
クラスの問題点
- 下表の通り、クラスフルは、8ビットずつ境目がずれている。
- これを分かりやすく10進数に変換してみると、
・クラスA:約1,600万のホストが所属するグループを128個作れる。
・クラスB:約65,000のホストが所属するグループを約16,000個作れる。
・クラスC:約250のホストが所属するグループを約200万個作れる。
-
・企業や学校でクラスAを使うと仮定した場合、社員数1,600万人の会社とか、教員学生1,600万人の学校というのは、あまりない。
・企業や学校でクラスCを使うと仮定した場合、社員数250人の会社とか、教員学生250人の学校というのは、ありそうだが、むしろ250人では足りない。
・結果、このクラスフルの使い方では、IPアドレスが無駄に余るか、まったく足りない状態になる。
・そのため、クラスBのニーズが高くなり、そこに集中してしまう。 - そこで、IPアドレスのネットワーク部とホスト部の境目を柔軟に変更できるようにして、効率的に使えるようにするため、クラスという考え方をやめた。(=クラスレス)
クラスレス(CIDR)
効率的なIPアドレスの使い方のひとつが、Classless Inter-Domain Routing(CIDR:サイダー)。
- 簡単に言ってしまえば、複数のネットワークを一つにまとめて大きなネットワークにしようというもの。
- 今、4つのアドレスを2進数に変換して、従来のクラスフルの考え方でみた場合、ホスト部は8ビットなので、それぞれ約250のIPアドレスがある。
※青色の部分がホスト部。
- これを共通する数字の部分をまとめて、残りの部分をくっつけてしまおうという考え方がクラスレス。
上図4つのIPアドレスの共通部分は、先頭から22ビットまで(下図桃色の部分)。

この共通部分をネットワーク部として使い、残った2ビット(点線の部分)はホスト部として使う。
- 気を付けることは、
・連続した共通部分は、まとめる。
・2、4、8のように、2のべき乗でまとめる。
ということ。 - 大事なことは、
・クラスフルの考え方では、先頭の4ビットを見ればどのクラスかが分かり、クラスが分かればネットワーク部とホスト部の境界は固定で決まっているので簡単にわかった。
・しかし、クラスレスになると一律で同じ場所が境目にはならないため、ネットワーク部とホスト部の境界を示すための情報が必要になってくる。
これは、先頭から何ビットまでがネットワーク部なのかを数え、スラッシュと共に表記する。(192.168.0.0/22)
- スラッシュで表記することを、プレフィックス表記といい、略してスラ22ということもある。
- クラスフルの考えでは、1,000個のIPアドレスが必要となった場合、クラスCでは足りないのでクラスBを使う必要があるが、クラスレスの考えならクラスCを4個用意すれば、効率的にIPアドレスを使うことができる。
クラスレス(FLSM)
***
***
***