IP
IPアドレスを使い、相互接続されたネットワークを通じてパケットを宛先へ届けるためのネットワーク層のプロトコルである。事前に接続を確立しないコネクションレス方式で動作し、到達や到着順を保証しないベストエフォート型の配送を提供する。
イマシルちゃんの解説
Wi-Fiでつながる端末も有線でつながるサーバも、IPという共通の約束を使って通信できるんだ。
送るデータにはIPアドレスという通信先を表す番号などを付けて、パケットと呼ぶまとまりにするよ。
別のネットワークへ送るときは、ルータという中継役が宛先を調べて次の機器へ渡していくんだ。
途中で回線の種類が変わっても、この宛先情報を使って先へ運べるの。
ただしIPだけでは、混雑や故障で届かなかったデータを必ず届け直すところまでは担当しないよ。
そのため確実な受け渡しが必要な通信では、TCPなどの別の仕組みと組み合わせて使うんだ。
この解説はわかりやすかったですか?
より深い解説
複数のネットワークに共通の配送を提供する
IP(Internet Protocol)は、接続方式の異なるネットワークを一つの通信基盤として利用するためのプロトコルである。インターネットに接続していない社内ネットワークでも利用できる。IPアドレスは配送に使う識別情報であり、TCP/IPはIPやTCPなどを含むプロトコル群の名前である。
IPの上にはTCPやUDPなどがあり、下にはイーサネットや無線LANなどがある。送信側は上位のデータにIPヘッダーを付け、そのIPパケットをさらにリンクのフレームに格納する。このように上位のデータを下位の形式で包む処理をカプセル化という。受信側は対応するヘッダーを解釈しながら上位へデータを渡す。
| 役割 | 主に扱う情報 | 担当の例 |
|---|---|---|
| アプリケーションの通信先を区別する | ポート番号 | TCP、UDP |
| ネットワークを越えてパケットを配送する | IPアドレス | IP |
| 一つのリンク上でフレームを届ける | MACアドレスなど | イーサネット、無線LAN |
IPが運ぶものはTCPやUDPに限られない。到達不能などを知らせる制御メッセージもIP上で運ばれる。IPのサービスモデルと階層の関係は、RFC 6250に整理されている。
一つのパケットが届くまで
通常のユニキャスト通信では、送信端末もルータも宛先IPアドレスに対応する経路を調べる。同じリンク上の相手へ直接届けられる経路なら、その相手へ送る。ルータを経由する経路なら、まずそのルータへ渡す。この「次に直接渡す相手」を次ホップという。
例えば端末のアドレスを192.168.10.20/24、デフォルトゲートウェイを192.168.10.1とする。より具体的な経路がない状態で別のネットワークの192.168.20.30へ送る場合、最初のフレームはゲートウェイへ届ける。ただしIPパケットの宛先は通信相手のままである。
イーサネットでIPv4を使う場合、端末はARPによってゲートウェイのMACアドレスを調べる。IPv6ではNDPがリンク上の近隣機器との対応を解決する。遠くの通信相手のMACアドレスを、送信元のLANから直接調べる必要はない。
ルータは受信したフレームからIPパケットを取り出し、送出先のリンクに合ったフレームへ入れ直す。そのためリンク層の宛先は中継のたびに変わる。一方、NATなどによる書換えがない通常の転送では送信元・宛先のIPアドレスを維持する。リンクごとの配送とネットワーク全体での配送を分担する仕組みである。
経路の情報と実際の転送
どのネットワークへどのように到達するかを決め、経路情報を用意する処理をルーティングという。その情報を使って到着したパケットを実際に送り出す処理がフォワーディングである。IPパケットを運ぶことと、ルータ同士で経路情報を交換することは別の役割である。
経路には直接接続されたネットワークのほか、管理者が設定する静的経路や、OSPF・BGPなどから学習する経路がある。実際の転送では経路情報から作られた転送表を参照する。通常の宛先に基づく検索では、該当する経路のうちアドレスの先頭から一致する部分が最も長い経路を選ぶ。これが最長一致である。
| 転送表にある宛先 | 対象範囲 | 10.20.30.40への適合 |
|---|---|---|
10.20.30.0/24 | 先頭24ビットが一致する範囲 | 最も具体的なので選択される |
10.20.0.0/16 | 先頭16ビットが一致する範囲 | 一致するが上の経路を優先する |
0.0.0.0/0 | すべてのIPv4宛先 | より具体的な経路がない場合に使う |
最後のような包括的な経路をデフォルトルートという。IPv6では::/0で表す。適合する経路が一つもなければ、ルータはパケットを先へ転送できない。複数の候補から同じ宛先プレフィックスの経路を採用する判断と、転送表に載った異なる長さのプレフィックスから選ぶ判断は分けて考える。
ここでは一般的な宛先に基づく転送を扱っている。送信元や管理方針を使うポリシールーティングなどもある。基本的な経路選択はRFC 1812の5.2.4節、IPv6でのプレフィックスの扱いはRFC 7608を参照できる。
IPが保証する範囲
IPは個々のパケットを独立して扱う。送信前に相手との接続を確立したり、通過する全ルータへ通信の開始を登録したりする手順はない。ただし端末とルータの設定や、経路情報などの準備は必要である。「接続を確立しない」ことは「何も設定しなくても届く」ことではない。
混雑で待ち行列があふれればパケットは失われる。経路の変更や複数経路の利用によって到着が前後する場合もある。IP自身には失われたデータの再送、到着したデータの順序の復元、重複した配送の排除を保証する機能がない。一定の通信速度や遅延もIPだけでは約束できない。
TCPはこれらのうち信頼性に必要な処理を端末間で実行し、アプリケーションに連続したバイト列を渡す。UDPには同じ仕組みが備わっていないため、必要な処理をアプリケーション側などで用意する。下位の無線LANが一部の送信失敗を回復しても、通信相手までの全区間での到達を保証したことにはならない。配送の限界はRFC 6250の2節・3.1節、TCPの責務はRFC 9293に示されている。
パケットの寿命と大きさ
経路の設定ミスなどでループが生じても、同じパケットが無限に転送されないようにする必要がある。IPv4のTTLとIPv6のホップリミットはこのための値である。転送するルータが値を減らし、転送可能な限度に達したパケットを破棄する。ループそのものを修正する機能ではなく、ループしたパケットが残り続けることを防ぐ機能である。
また、リンクには一度に運べるIPパケットの大きさの上限であるMTUがある。経路上の各リンクのうち最も小さい上限をパスMTUという。送信元のLANで送れる大きさでも、途中のトンネルなどでは大きすぎる場合がある。
大きすぎるパケットを分ける処理がフラグメンテーションである。IPv4では条件により途中のルータも分割できるが、IPv6のルータは分割しない。どちらのバージョンでも、通信経路に合う大きさで送ることが重要になる。分割の詳細はIPv4とフラグメンテーションの記事で扱う。IPv6側の寿命と大きさの規定はRFC 8200の3節・5節にある。
二つのバージョンと周辺の機能
| 項目 | IPv4 | IPv6 |
|---|---|---|
| アドレスの長さ | 32ビット | 128ビット |
| 基本となる配送 | IPアドレスを使うベストエフォート配送 | 同左 |
| ループしたパケットの寿命を制限する情報 | TTL | Hop Limit |
| エラー通知などに使う制御プロトコル | ICMP | ICMPv6 |
両者は同じ役割を持つが、パケットの形式やアドレス体系が異なる。IPv4だけを扱う相手にIPv6パケットをそのまま送っても、IPv4パケットとして受信させることはできない。共存にはデュアルスタック、トンネル、IPv4/IPv6トランスレーションなどの方式を使う。
IPv4で到達不能や時間超過などを通知するのがICMPである。これは通信失敗を調べる手掛かりになるが、配送を保証するための受領確認ではない。DNSは名前からアドレスを調べる役割を持ち、IPが毎回名前を使って経路を選ぶわけではない。またIPアドレスだけでは送信者の本人確認やデータの暗号化は実現しない。
通信を調べるときの着眼点
応答を伴うIP通信では、片方向にパケットを届けられるだけでは足りない。応答を受け取るための戻りの経路も必要である。往路と復路が同じルータを通るとは限らず、片方の経路やフィルタだけに問題があっても通信は失敗する。
調査では端末のIPアドレスとプレフィックス、利用するゲートウェイ、経路表、隣接機器への到達、通過するフィルタを順に確認する。小さいデータでは成功するのに大きいデータで止まるなら、パケット長と経路上の上限も確認する。
pingの応答がない場合は、相手の停止だけでなく制御メッセージの遮断も考えられる。応答があっても、Webサーバの待受けやTCPの通信が成功するとは限らない。配送経路とアプリケーションの動作を別々に確認することが、障害箇所を絞る助けになる。到達性が対称であるとは限らないことや、エラー通知が受信できるとは限らないことはRFC 6250の3.1節でも説明されている。