マスタリングTCP/IP　4章　IP

自分の知識の定着を図るためのアプトプットです。詳しくは実際の本を読んでみて下さい！

https://www.amazon.co.jp/-/en/%E4%BA%95%E4%B8%8A%E7%9B%B4%E4%B9%9F-ebook/dp/B0827QNDNT/ref=sr_1_1?adgrpid=48910594010&dib=eyJ2IjoiMSJ9.kB1wpWesImwGFopOwjS_XQn8hT_FkSmFdM7c9FebnVzCTnUqW6XqRK1pZbTkbZfWpEd6Rg3XGtYJblcXIrmM7QObyT4lJUiNT7ofSaGMpTUvQkCKnKIVuWh49cFwDrEpyR88lJH67Qb9J_Rc_1BIALz9t9PKMUzc66PrSfhN05Pc5v70s7jnFBX46ENK0nBWFfyZ3x2Fmem2-Qbf2V5BMwURHtj2QNhCIlOWPq_8CuUCK7sx3WqZlp0bRVsTRPXM1CCAQITEF8C3iB83nACxNgahDugy1glqM_Lv4DjsBWS-M5M72r6d4UgQKOiYXH7pPZn89JbCnvJEOnr8lHrDhaZCJINyuYH9aXllZhnBHaKLna7oUkar7JsaWNgrdyO6Mda2mBVs5vDmiB8d7ObLVWXwYyPGOj-XQ6J41loTfdR_jH6GMo3RCmQ44h-s2J0F.q__f8x4Emr8t3xOijgAA0Tra7lHLkv7SfLGRiJpdQAI&dib_tag=se&hvadid=679073071879&hvdev=c&hvlocphy=1009307&hvnetw=g&hvqmt=e&hvrand=16804345372684970371&hvtargid=kwd-334746806305&hydadcr=27706_14738821&jp-ad-ap=0&keywords=%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0+tcp%2Fip&qid=1735294326&sr=8-1

（今回はいつもより特に省略気味です）

# 4.1 IPはインターネット層のプロトコル
エンドノード間の通信を実現するもの。ネットワーク層の下位に位置するデータリンク層は同じ種類のデータリンクだけで接続されているノード間のパケット伝送を行う。なので、データリンクを超えて通信するためにはネットワーク層が必要

ネットワーク上でIPアドレスが付けられた機器をノードと呼ぶ
→経路制御を行わないものをホストと呼ぶ
→経路制御を行うものをルータと呼ぶ

# 4.2 IPの基礎知識
IPの役割は主に3つ
- IPアドレス
- 終点ホストまでのパケット配送（ルーティング）
- IPパケットの分割処理と再構築処理

#### IPアドレス
MACアドレス
→同一のデータリンク内にあるコンピュータを識別できれば良い
→MACアドレスは（イーサネットの場合）48 bit

IPアドレス
→インターネットに接続されている全ての機器を識別しなければならない（ホストだけでなくルーターなどにも）
→IPアドレスは (IPv4の場合) 32 bit (IPv6の場合) 128 bit

#### 経路制御（ルーティング）
宛先IPアドレスのを元に、次のルーターやホストまでの経路を決める
レイヤ2スイッチ（スイッチングハブ）ではMACアドレスとホストの対応表が必要（転送表（フォワーディングテーブル））
レイヤ3スイッチ（ルーター）ではIPアドレスとホストの対応表が必要（経路制御表（ルーティングテーブル））

ネットワークの1区間のことを1ホップという。IPの経路制御はホップバイホップルーティングいう方式で行われ、その1区間ごとに次のルートが決定されパケットが転送される
宛先IPアドレス（最終目的ホスト）をルーターに伝えると、次に行くべきIPアドレスを教えてくれるので、そのIPアドレスからMACを知ることで、データリンク層によって次のMACアドレスのあるルーターやホストまで届けてくれる（それぞれのルーターで調べながら進む方法をad hoc（アドホック）というらしい）

全てのホストやルーターは経路制御表（ルーティングテーブル）と呼ばれる情報を持っており、IPパケットを次にどのルーターへ送ればいいかが記されている

#### データリンクの抽象化
IPは複数のデータリンクで接続されたネットワーク間を繋ぐためのプロトコル。しかしデータリンクごとに固有のプロトコル（イーサネット、無線LAN、PPPなど）を使用しており、それらが異なる場合でもきちんと通信を行えるようにしなければならない。なのでIPはデータリンクごとに固有のプロトコルなどを抽象化していると言える
データリンクごとに異なる性質の一つとして、最大転送単位（MTU: Maximum Transimission Unit)というものがあり、データの最大転送量を決めるものである。これはデータリンクごとに異なり、IPの上位層からこのMTUより大きなパケットの送信要求が来たり、運んでいるパケット長よりも小さなMTUのネットワークを通過する必要があるときなどがある。
それらの問題に対処するために分割処理（フラグメンテーション）という処理をしており、大きなIPパケットを小さなIPパケットに分割し直すという行為だ。分割されたパケットは再び宛先のホストで1つにまとめ上げられてIPの上位層に渡される。なので上位層から見たら途中のデータリンクのMTUに関わらず、送信要求した長さのままのパケットが届くことになる

> フラグメンテーションは経路上にある最も小さなMTUを探索し、最初からその大きさに分割している
> 最小MTUの探索方法（Path MTU Discovery (PMTUD)）としては、まず最初に通常のMTUサイズ（1500byte)でパケットを送信する。その際にヘッダーのDon't Fragement(DF)ビットをセットしておく。こうすることで、途中のルーターはそのパケットを分割せずに送信しなくてはならなくなる
> その後、もし途中のルーターでパケットを送信できなくなった場合（MTUがそのパケットより小さい場合）、そのルーターはICMP "Destination Unreachable - Fragmentation Needed" メッセージを送信元に返す。ここにはそのルーターのMTUサイズも含まれている
> そしたら再度パケットサイズを調整して同様の操作を行い、最小MTUを探索する

#### IPはコネクションレス型
インターネットのスケールでは輻輳制御や堅牢性が一番要重。コネクションレス型にすることで、宛先ホストの電源が切れている場合や、存在しない場合でも送信できてしまうが、コネクション型にすると処理が複雑になり、また、通信の度にコネクションを確立しなければならなくなるので処理速度の低下に繋がってしまう
- コネクション型
  - 長所：信頼性、認証
  - 短所：高速、堅牢性（ネットワークの障害などに強いかどうか）、経路制御
- コネクションレス型
  - 長所；高速、堅牢性、経路制御
  - 短所：信頼性、認証

> IPはベストエフォート型であり、宛先まで届いたかは保証しない

# 4.3 IPアドレスの基礎知識
IPアドレスは32bit(IPv4)
2進数の8ビットをその境に.を打って4つの組に分けているが、読みにくいので、10進数で表記したりもする。約43億しか割り当てられず全然足りないのでIPv6がその後に登場。IPアドレスはNICごとに割り当てている。ルーターなどは基本的に2つ以上のNICを持つので（それじゃないとインターネットと繋げない）使う人全てに普及させるには全然足りない。NATとかNAPTでなんとかしようともしている

IPアドレスはネットワーク部とホスト部に分けられる。ルーティングはネットワーク部を見て行われ、ネットワーク内でホスト部が被らないように割り振る。ネットワーク部はセグメントごとに異なるようにする。こうすることでユニークなIPアドレスができる。

#### IPアドレスのクラス
- クラスA
  - ネットワーク部 8bit
  - 先頭1bitが0
- クラスB
  - ネットワーク部 16bit
  - 先頭2bitが10
- クラスC
  - ネットワーク部 24bit
  - 先頭3bitが110
- クラスD
  - ネットワーク部 32bit
  - 先頭4bitが1110
  - IPマルチキャスト通信として現在も使用されている

多くの組織はクラスBとクラスCが欲しかったが、仕方なくクラスCを割り当てているうちに足りなくなった（ホスト部が500個欲しいときなどもクラスCでは254個までしか使用できないので（全てのbitを0や1にすることはできない。0はアドレスがわからない場合、1はブロードキャストアドレスとして使用される）クラスCでは対応できず、クラスBを使用するしかなかった）

ホスト部のビットを全て1にするとブロードキャストアドレスとなる。ブロードキャストアドレスとは、同一リンクに接続されたホスト全てにパケットを送信するためのアドレス
- ローカルブロードキャスト
  - 自分が属しているリンク内のブロードキャスト
- ダイレクトブロードキャスト
  - 自分が属していないネットワークへのブロードキャスト

#### マルチキャスト
特定のグループに属している全てのホストにパケットを送信する。今まではブロードキャストで全端末にパケットを送信し、受信したホストのIPより上の層で自分に必要なデータかいなかの判断を行い必要でなければ破棄していたが、それだと関係のないネットワークなどに影響を及ぼしトラフィックが渋滞してしまったり、ブロードキャストだとルーターを超えられないので別の仕組みを使用しなければならず問題だった
そこでマルチキャストが生まれ、クラスDのIPアドレスを使用する。つまり、先頭から4bitが1110であればマルチキャストとして認識する。そして残りの28bitがグループ番号になる。また、マルチキャストアドレスの中には用途が決められているものもある（実用的な通信をするにはIGMPなどの仕組みが必要）

#### サブネットマスク
クラスだと無駄なものが多すぎるので無駄を減らそうというのでサブネットマスクが誕生した
どこまでがネットワーク部なのかをビットマスクを指定して示す。そのうち2種類の表記方法がある
- IPアドレスのように書く方法
  - ネットワーク部を表すbitを1にして、ホスト部のビットを0にするという方法
  - 例えば上位26bitがネットワーク部の場合
  - ```IPアドレス表記
    IPアドレス      172.20.100.52 (10101100.00010100.01100100.00110100)
    サブネットマスク 255.255.255.192 (11111111.11111111.11111111.11000000)
    ```
  このようにして二つアドレスを表記して判断する
- そのまま記述する方法（この表記方法をプレフィックスと呼ぶ）
  - ```  
    IPアドレス 172.20.100.52 /26
    ```
  - また、この表記方法の場合はネットワークアドレスを記述するときに最後の0を省略することができる`172.20.0.0 /16`→ `172.20 /16`

#### CIDRとVLSM

CIDR（Classless Inter-Domain Routing)とは、クラスに縛れられない組織間の経路制御を意味し、サブネットマスクとほぼ同様のもので、サブネットマスクのプレフィックス表記を使用する。そのうち、IPv4のアドレス空間をより効率的に利用しようというのがCIDRで、例えばクラスCを割り当てられた会社が一つの大きなネットワーク（クラスC)を組織ごとにCIDRによってサブネットワークに分割し、クラスCのネットワークを複数のサブネットワークの集まりとして見ることができる。これがCIDRである
しかし、インターネットがCIDRに対応したばかりの頃は、組織のネットワーク内ではネットワークアドレスの長さを統一しなければならなかった。そのため部署によってホストが500台の場合も50台の場合も同じネットワークアドレス帳にしなければならず無駄なホスト部ができてしまっていた。それを解決するために組織内の部署ごとにネットワークアドレス長を変えられるようにする仕組みが可変長サブネットマスク、VLSM(Variable Length Subnet Mask)である。これによりIPアドレスの使用率を上げることができ（以前はクラスで分けてたのでとても無駄なホストがたくさんあった）、少しはアドレスの不足が解消されたが、やはり根本的には増えてないのでIPv6が必要になった

#### グローバルアドレスとプライベートアドレス

元々は全てのホストやルーターにユニークなIPアドレスを設定していたが足りなさそうなのでやめた。そこでインターネットに接続していないネトワーク内であれば、そのネットワーク内でIPアドレスが一意であればいいので、プライベートIPアドレスというものが誕生した。しかし、個々のネットワークがそれぞれIPを振り当てていると問題が引き起こる可能性があるので、私的なネットワークで利用できるプライベートアドレスの範囲が定められた。
```プライベートIPアドレスの範囲
大きいものでは 10.0.0.0/8
中くらいのものでは 172.16.0.0/12
小さいものでは 192.168.0.0/16
```

この範囲に含まれるアドレスがプライベートIPアドレスで、そのほかはグローバルIPアドレスという

プライベートIPアドレスは当初、インターネットとのつながりを考えないネットワークで利用されていたが、その後プライベートアドレスをグローバルアドレスの間でアドレス変換をするNATという技術が登場してプライベートアドレスを割り当てたネットワーク上のホストからグローバルアドレスを割り当てたインターネット上のホストと通信できるようになった。（ポート番号は基本的にそのまま。NAPTというポート番号も変更する技術ものちに登場）

#### グローバルIPアドレスは誰が決める？
グローバルIPアドレスはICANN（Internet Corporation for Assigned Names and Numbers)という機関が一元的に決めて管理している。日本ではJPNIC(Japan Network Information Cneter)というところが決めている。ISPを利用している場合はISPに申請して、ISPがJPNICに問い合わせる場合や、JPNICの負荷を減らすために特定のグローバルIPアドレスの割り当ての処理を代行しているISPなどに問い合わせたりする。
Linuxのコマンドwhoisを使うとIPアドレスの管理者の情報を見ることができる

# 4.4 経路制御（ルーティング）
ルーターに経路制御表があることを前提としてIPは成立している。つまり、IP自体には経路制御表を作る機能はなく、ルーティングプロトコルという、IPとは別のプロトコルが作成している。経路制御表の作り方は2種類あって、静的経路制御（スタティックルーティング）と動的経路制御（ダイナミックルーティング）と呼ばれる。静的経路制御は管理者が事前に経路を設定する方法で、動的経路制御はルーターが他のルーターと情報を交換して自動的に作成する方法である。その際ルーター間で経路制御情報（ルーティングインフォメーション）を正しくやり取りできるようにきちんとルーティングプロトコルを設定しなければならない（RIP：Routing Information Protocol）

経路制御表にはネットワークアドレスと次に配送するべきルーターのアドレスが書かれている。IPパケットを送信する時にはIPアドレスの宛先アドレスを調べて経路制御表から一致するネットワークを検索し、対応する次のルーターへデータを配送する。経路制御表に一致するネットワークが複数ある場合には（例えば、172.20.100.52が宛先アドレスの場合、172.20/16と172.20.100/24のどちらにもマッチする）、一致するビット列が長い方を選択する。これを最長一致という

IPアドレスのいくつかは特別な用途のために予約されている

- デフォルトルート
  - 経路制御表のどのアドレスにもマッチしないときの経路
  - 0.0.0.0/0またはdefaultと記述する（0.0.0.0/0はIPアドレスを表しているわけではない。もしIPアドレスならば0.0.0.0/32となるはず）
　　
- ホストルート
  - IPアドレスの全てのビットを使って経路制御を行うとき
  - IPアドレス/32
　　
- ループバックアドレス
  - 同じコンピュータ内部のプログラム間で通信したい場合に利用される。パケットを自分に送る
  - 127.0.0.1, localhost
　　
#### 経路制御表の集約
ネットワークアドレスのビットのパターンを考えて、階層的に配置すると、内部的には複数のサブネットワークから構成されていたとしても、外部的には代表する一つのネットワークアドレスで経路制御を行うことができる。（サブネットワークなどをうまく駆使し、ネットワークアドレスでうまく包含することで各ルーターの経路制御表を小さくすることができる）この経路制御を小さくすることを、経路アグリゲーションともいう

# 4.5 IPの分割処理と再構築処理
MTUはデータリンクごとに異なる。なので、MTUを超えたデータはデータリンクの入り口で分割処理され、受信ホストで再構築処理される
分割処理の短所
- ルーターが重くなる
- 一つ失われると全部再送

経路に存在するデータリンクの最小MTUが経路MTU

MTUの大きなデータリンクから小さなデータリンクへ繋ぐ。ルーターでは最初のパケットが失われる。失われたパケットの再送要求とともにICMPによって経路MTUが送信ホストに通知される

# 4.6 IPv6 (IP version 6)
IPv4のIPアドレス：32bit (10進数 8bit * 4) → 枯渇
IPv6のIPアドレス：128bit (16進数 16bit * 8)

- ヘッダ長の長さを固定し、チェックサムを省くなどしてルーターの負荷を減らす
- 経路MTU探索を利用して、送信元のホストが分割処理を行う
- DHCPサーバーがない環境でもIPアドレスを自動的に割り当てる
- IPSecによる認証機能や暗号化機能が必須
- マルチキャストやMobile IPを拡張機能として定義

アドレスのアーキテクチャ
- グローバルユニキャストアドレス：インターネット全体で固有の1対1通信用のアドレス
- ユニークローカルアドレス：インターネットに接続されない（制御系のネットワークなど）プライベートなネットワークで使用する
- リンクローカルユニキャストアドレス：ルーターがないネットワークなど、イーサネットの同一セグメントないだけで通信する時に使用する

IPv6では一つのNICに複数のアドレスを割り当てることができる

ネットワーク部：64 bit
ホスト部：64 bit

# 4.7 IPv4ヘッダ
多少省略しながら説明する
- DSCP(Differentiated Services Codepoint)フィールド：DiffServと呼ばれる品質制御で利用される
- DCN(Explicit Congestion Notification)フィールド：ネットワークが輻輳していることを通知するためのフィールド
- フラグ(Flags)：分割に関するフラグ。3bitあり、0bit目は未使用で0にする必要がある。1bit目は分割して良いかを指示する。2bit目は分割されたパケットの場合、最後のパケットか否かを示す
- TTL(Time To Live)：最初は255になっており、ルーターを通過するたびに1ずつ減る。これはパケットがネットワークの中を永遠に回り続けることを防ぐための仕組み
- プロトコル：IPヘッダに続くヘッダのプロトコルを示す
  - 1:ICMP
  - 6:TCP
  - 17:UDP
  - 41:IPv6
- ヘッダチェックサム：1の補数の和を求め、IPヘッダが壊れていないことを保証する

# 4.8 IPv6ヘッダ
IPv4との主な違い
- ヘッダのチェックサムがなくなった
- 分割処理のための識別子（フラグ）はオプション

#### IPv6拡張ヘッダ
IPv6ではオプションはすべて拡張ヘッダとして、IPv6のヘッダとTCPなどのヘッダの間に挿入する。これによって、いくらでもオプションをつけることが可能となった

プロトコル番号
- 50:ペイロードの暗号化
- 51:認証ヘッダ
などはIPSecで使用される

- 44:フラグメントヘッダ
これがパケット分割の際に使用される