TCP / IP の基本〜インターネット層・ネットワークインターフェース層編〜

# はじめに
この記事は TCP / IP のインターネット層とネットワークインターフェース層について簡潔に説明した内容となっております。
上位層であるアプリケーション層とトランスポート層の解説については、以下の記事をご覧いただければ幸いです。

https://qiita.com/yukitkns/items/208170b5eeff8d846cee

# インターネット層
TCP / IP において、インターネット層は下位層のネットワークインターフェース層と協力して他のコンピュータにデータを届ける役割を担っている。
ハードウェアに依存する部分はネットワークインターフェース層が担当するので、インターネット層は「**IPアドレス**」を識別してデータを届ける仕組みを提供している。

## IP アドレス
IP アドレスとは、現在主に使用されているインターネット層のプロトコルで、32 ビットの IP アドレスで各コンピュータの識別を行っている。
IP アドレスは 2 進数であるが、人間が理解しやすくするために 10 進数で表記される。

## IP アドレスヘッダ
IP パケットのヘッダには、送信元と宛先の IP アドレスの他に、パケット長などのデータが含まれる。
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/a115706e-98df-efd7-3cb8-d785ced75a2d.jpeg)
| フィールド | サイズ | 説明 |
|:-:|:-:|:-:|
| バージョン   | 4ビット  | ヘッダのバージョン情報 例）IPv4：4  |
| ヘッダ長  | 4ビット  | IPヘッダの長さ  |
| サービスタイプ  | 1バイト  | IPパケットの優先度  |
| パケット長  | 2バイト  | IPパケット（IPヘッダ＋データ）の長さ（1バイト単位）  |
| 識別子  | 2バイト  | パケットを識別するための値。受信側は識別子やIPアドレスを手掛かりに、分散されたデータの復元を行う  |
| フラグ  | 3ビット  | IPパケットをフラグメント※に分割する際に使用される値  |
| フラグメントオフセット  | 13ビット  | IPパケットが複数のフラグメントに分割された場合、そのフラグメントの順序を表す値  |
| 生存期間（TTL）  | 1バイト  | パケットが生存できる最大時間  |
| プロトコル  | 1バイト  | 上位層（トランスポート層）のプロトコルを表す値　例）TCP：6、UDP：17  |
| チェックサム  | 2バイト  | パケットにエラーがないかをチェックするための値  |
| 送信元IPアドレス  | 4バイト  | 送信元のIPアドレス  |
| 宛先IPアドレス  | 4バイト  | 宛先のIPアドレス  |
| オプション  | 可変長  | 追加のデータ（4バイト単位で、最大40バイト）  |

※細分化された小さなデータのことで、送信できる最大サイズよりも大きい IP パケットはルータによって細分化される。
　ルータの負荷が高くなることが考慮されるため、通常は TCP の MSS のすり合わせによってサイズが決定される。


## ネットワーク部とホスト部
IP アドレスは「**ネットワーク部**」と「**ホスト部**」で構成されている。
ホストとは、ネットワークに参加しているコンピュータや機器のことで、ルータは宛先 IP アドレスのネットワーク部を見て、ネットワーク外に送るべきデータかネットワーク内に送るべきデータかを判断している。

初期のインターネットでは、何ビットまでがネットワーク部で、残り何ビットまでがホスト部かは「**アドレスクラス**」によって固定的に決定されてた。
![qiita-アドレスクラス.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/c119dc94-27f9-b634-4976-4c13df4a3e2f.png)

クラスAのアドレスでは、1 つのネットワークで約 1,677万台分のホストにアドレスを割り当てることができる。
しかし、現実には多くのホストを 1 つのネットワークに所属させることができないので、多くのアドレスが無駄になってしまう。

そこで、「**サブネットマスク**」を指定することで、アドレスクラスで決められたネットワークをビット単位で柔軟に変更することができる。
![qiita-サブネットマスク.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/818a3517-ea8a-616e-37a8-b25b195fcad7.jpeg)

例えば IP アドレスが 10.1.1.1 でネットワーク部が 24 ビットの場合の IP アドレスは以下の表記となる。
![qiita-サブネット表記.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/bf2030ff-ff0a-e5cf-431c-4d15759a30a0.png)

## プライベート IP アドレス
「**プライベート IP アドレス**」は、家庭や組織で自由に使えるアドレスである。
直接つながっていなければ、他のネットワークと重複しても問題ないが、インターネットと通信を行う場合は NAT※等のアドレス変換技術を使用してグローバル IP アドレス※後述 に変換を行う必要がある。

![qiita-プライベートIP.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/e265b9e6-85b9-09fd-a68e-7b6da786de64.png)

※送信元 IP アドレスをグローバル IP アドレスに変換して通信を行う仕組み

## グローバル IP アドレス
「**グローバル IP アドレス（パブリック IP アドレス）**」は、インターネット上で一意で世界的に識別される IP アドレスを指す。
グローバル IP アドレスは ICANN や JPNIC などの組織（「**インターネットレジストリ**」）によって管理されている。
グローバル IP アドレスが必要な場合は、各組織に申請して割り当ててもらう必要がある。

### インターネットレジストリ
インターネットレジストリからプロバイダ（インターネットサービスプロバイダ：ISP）にグローバル IP アドレスが割り当てられ、企業や家庭などはプロバイダから貸し出されて使用する、といった仕組みとなっている。
![qiita-インターネットレジストリ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/9216bee3-3d80-6e43-d317-c0578c061730.png)

## ICMP
「**ICMP（Internet Control Message Protocol）**」は、データ転送中のトラブルの通知などに使われるプロトコルである。
![qiita-ICMP.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/943ba098-f0e9-193b-ebe3-f3567dbedde8.png)

ICMP メッセージを送信する際の ICMP ヘッダは以下のようになっており、既存のIP ヘッダに付加される形となっている。
![qiita-ICMPヘッダ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/01de0af3-072d-432a-677a-8f0f8cc5470f.png)
| タイプ | 意味 |
|:-:|:-:|
| 0  | エコー応答。宛先の存在確認に使われる  |
| 3  | データが到達できなかった  |
| 4  | 回線が混雑している  |
| 5  | 経路が最適ではない  |
| 8  | エコー要求。宛先の存在確認に使われる  |
| 9  | 所属ネットワークのルータの通知に使われる  |
| 10  | 所属ネットワークのルータを探す際に使われる  |
| 11  | 生存期間を超えたのでパケットが消滅  |

## DNS
IPアドレスは数字の羅列のため覚えにくく、よりわかりやすくするために「**ホスト名**」が作られ、それを管理するために「**DNS（Domain Name System）**」とドメイン名が作られた。
![qiita-DNS.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/a2984e48-a120-6c33-26e7-021e70591654.png)

### ドメイン名の階層構造
DNS は「.（ピリオド）」で階層に区切られており、一番最後に来る「jp」や「com」などのドメインが最上位となり、「**トップレベルドメイン**」と呼ぶ。
トップレベルドメイン以降のドメインは「**第2レベルドメイン**」、「**第3レベルドメイン**」、...と続く。
![qiita-DNSの階層構造.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/6521aad4-1cae-8a59-19b6-1aead2db8d6d.png)

### DNS サーバの階層構造
DNSサーバもまた階層構造を持っており、自分が担当するゾーンに属するドメイン名を管理している。
また、ドメイン名を管理する DNS サーバを **DNS コンテンツサーバ** とも呼ぶ。
![qiita-DNSの階層構造.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/6133f804-729a-eed4-0e88-9e156f532dcb.png)

### DNS サーバへの問い合わせの流れ
DNS サーバはドメイン名を管理するコンテンツサーバと、外部からの問い合わせに対応する「**キャッシュサーバ**」の2種類に分かれている。
ャッシュサーバはルート DNS サーバから順に問い合わせを行い、IP アドレスがわかったら、その IP アドレスを返す仕組みとなっている。
1回調べた名前はキャッシュサーバに保管されるので、次回からはルート DNS サーバなどに問い合わせることなく IP アドレスを返せるようになる。
![qiita-DNSの問い合わせ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/5c3d3313-1f8c-be8d-fcd5-c5e01c308aa7.png)

### DNS への登録
ドメイン名は、グローバル IP アドレスと同じく ICANN が管理しており、新しいドメイン名が必要な場合は申請が必要となる。
ドメイン事業者に申請を依頼した場合、通常は事業者が所有している DNS サーバにドメインが登録される。
DNS サーバに登録する情報を「**リソースレコード**」と呼ばれ、リソースレコードが記述されたファイルを「**ゾーンファイル**」と呼ぶ。

| レコード名 | 説明 | 記載例 |
|:-:|:-:|:-:|
| SOAレコード  | ドメイン名を管轄する DNS サーバを記述  | example.com. IN SOA ns1.example.com. admin.example.com. ( ) |
| NSレコード   | プライマリ、セカンダリの DNS サーバを記述  | example.com. IN NS ns1.example.com.　example.com. IN NS ns2.example.com.  |
| Aレコード  | ホスト名と IP アドレスを対応付ける  | example.com. IN A 192.168.1.1 |
| CNAMEレコード  | Aレコードに指定済みのホスト名に別名を付ける  | www IN CNAME example.com.（www.example.comとexample.comを同じ IP アドレスと関連付けたい場合）  |
| MXレコード  | 「xxx＠ドメイン名」という形式のメールアドレスとメールサーバを対応付ける  | example.com. IN MX 10 mail.example.com.  |

# ネットワークインターフェース層
「**ネットワークインターフェース層**」はネットワークのハードウェアを制御する層である。
ネットワークのハードウェアには、ネットワークインターフェースカード（NIC)や LAN ケーブル、光ケーブルなどが含まれる。
ネットワークインターフェース層はこれらの要素を効果的に制御して、インターネット層など上位の層がハードウェアの違いを意識せず、同様に機能できるようにする役割を果たしている。
ちなみに OSI 参照モデルでは、プロトコルなどソフトウェア仕様の部分をデータリンク層、ハードウェア部分を物理層と呼ぶ。

ネットワークインターフェース層は多くの構成要素から成り立っており、ここでは MAC アドレスのみを紹介する。
詳細については、以下の参考文献で確認することをお勧めする。

## MAC アドレス
ネットワークインターフェース層でデータを通信する際には、主に「**MAC アドレス**」が使用される。
MAC(Media Access Control）アドレスとは NIC に割り当てられた識別番号のことである。
これは製造段階でメーカーによって付与され、グローバル IP アドレス同様、全世界で重複しないように設定されている。
![qiita-MACアドレス.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/f17627c1-7ffb-868a-da75-f0b00e7a44ad.png)

MAC アドレスは、有線 LAN のイーサネットや無線 LAN の他、短距離通信の Bluetooth など、様々なデータ通信で利用されている。
ネットワークインターフェース層が送信するデータを「**フレーム**」と呼び、フレーム内には宛先と送信先の MAC アドレスが含まれている。
![qiita-フレーム.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/ba811796-c483-2d98-97b9-f867502f4e85.png)

MAC アドレスの役割は IP アドレスに類似しているが、IP アドレスは最終的な宛先を指すのに対して、MAC アドレスは途中の装置間の通信に使用される。

![qiita-MACアドレス2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/3b11128c-842b-e015-3288-1c33e55538e3.png)

## 参考文献

https://www.sbcr.jp/product/4815623333/

https://www.shoeisha.co.jp/book/detail/9784798165776