Internet Protocol

概要

IPは、最も基本的な通信単位であるパケットを相手に送信する役割を担う。
パケットは、発信者、受信者（手紙でいう宛て先）などの情報を持つIPヘッダ（最小20オクテット、最大60オクテット）と、通信内容を格納するペイロードとで構成される。パケットのうちIPが受け持つネットワーク層の部分はデータグラムと呼ばれる。発信者、受信者は、IPアドレスにより特定する。
IPは自己のインタフェース（ネットワークカードやモデムのこと）からパケットを送出するだけであり、相手まで確実にパケットが届くことに責任を持たない（保証しない）。
そのため、不慮の事故でパケットが失われた場合には単に到着しないだけである。確実な送受信を保証する必要がある場合には、IPより上位のトランスポート層のプロトコルであるTCPなどを使用する必要がある。
現在主に利用されているのは32ビットのアドレス空間を持つIPv4であり、IPアドレスの不足が発生することが予測されることから128ビットのアドレス空間を持つIPv6が作られた。
なお、IPv5（ST）、IPv7（TP/IX）、IPv8（PIP）、IPv9（TUBA）というプロトコルも存在するが、いずれも実験的なプロトコルであり実用には至っていない。また、IPのバージョン番号はIETFによる割り振りであり、優劣などの他意はない。

IPの仕組み

IPでは、各々のLANで通信可能な範囲をセグメントと呼び、セグメント内のコンピュータをホストと呼ぶ。同じセグメントに属するホスト同士はそのLANで使用されている通信プロトコルをデータリンク層とし、その上のネットワーク層で稼動する。
つまり同じセグメントに属するホスト同士は、IP以前からそうであったように直接通信する。このため、セグメント内で通信するだけであればIPの存在意義は特にない。IPがその存在意義を発揮するのはセグメントの外と通信することが可能であり、そして何も変更せずに（全く同じ機器／ソフトウェア構成で）セグメント内とセグメント外との区別なく通信が可能となることである。そのため、最近はLAN内の通信なのにわざわざIPを使うイントラネットを採用することで、インターネット用のソフトウェア資産やノウハウをそのままLAN内通信に利用することが多くなってきている。

同じセグメント内の通信

同じセグメント内のホスト同士の通信では、そのLANで使われているプロトコルを使って通信する。そのためIPの各実装では、そのLANで使われているプロトコルから完全に独立することはできない。
まず、送信先となるIPアドレスを持つホストにデータリンク層のデータとして送信するために必要な情報を収集しなければならない。例えばイーサネットであれば、送信先となるIPアドレスを持つホストのインターフェースが持つMACアドレスである。そのためにブロードキャストによって「このIPアドレスの人は返事して！」とメッセージを送る。そのIPアドレスを持っているホストはそれに対して返答する。その返答の送信元が、送信先IPアドレスを持つホストのMACアドレスである。
一般にブロードキャストは負荷が高くLAN内の通信を阻害するため、こうして得られたMACアドレスは今後同じIPアドレスに送信するときにはブロードキャストせずに再利用できるように、キャッシュに控えておく。
IPの実装では、こうしたアドレス解決と実際の送受信部分だけはデータリンク層のプロトコルに依存することになる。しかしこの依存部分は、実際にそのデータリンク層のプロトコル を使うホストでだけ必要になるため、世界中に散らばる各セグメントとの通信の際には問題にならない。異なるデータリンク層のプロトコル を使うセグメントに分かれたホスト同士の通信の場合は、後述するゲートウェイがこれを解決する。

異なるセグメント同士の相互通信

セグメントとセグメントの間、あるいはセグメントとWANの間にはルーティングを行なうための特別なホストであるルータがある。ルータにはあらかじめ、自身が繋がれているそれぞれのセグメントにいるホストのIPアドレスを教えてある。これはルーティングテーブルと呼ばれる。ルータは、一方のセグメントのホストから他方のセグメントのホストにパケットが送られようとしていると、一旦後者のホストの代わりにパケットを（前者のLANのプロトコルで）受け取り、ルーティングテーブルを参照してどのセグメントに送ればいいかを選択し、そのパケットを後者のLANのプロトコルで後者のホストに送る。ルータはルーティングテーブルによって、あるIPアドレスに送るにはどのセグメントに送ればよいかを把握している。一部が破壊されても、このルーティングテーブルを書き換えるだけで破壊箇所を迂回することが可能になる。
ルータと似ているが、ルーティングテーブルを持たず、異なるLANのプロトコルを変換して互いに中継するブリッジと呼ばれるものがある。しかしブリッジはIPより下位の層（OSI参照モデルのデータリンク層）の機器であり、IPとは関係なく動作する。
また特に、異なるプロトコルを用いるセグメント同士の間をつなぐルータはゲートウェイ（門）と呼ばれる。本来ゲートウェイはOSI参照モデルのネットワーク層におけるブリッジに相当するルータの基本機能の一部なのだが、セグメントのほとんどがイーサネットになっているため、特にセグメントとWANとの間にあるルータだけがゲートウェイであることが多い。またルータが知らないIPアドレスは（ルーティング処理の一環として）全てデフォルトゲートウェイと呼ばれる特別なゲートウェイに送られる。デフォルトゲートウェイは通常WANとの接続部分にあるため、未知のIPアドレスへのパケットは全てWAN側（外の世界）のルータにパケットを送信することになる。そしてWANのルータが送信先となるIPアドレスの存在するセグメントのゲートウェイにパケットを送信し、ゲートウェイが送信先となるIPアドレスを持つホストにパケットを送信することで世界中のホストと通信が行なわれる。

機能

Internet Protocol は、ホストのアドレッシングとデータグラム（パケット）の送信元ホストから宛先ホストまでの1つまたは複数のIPネットワークをまたいだルーティングを担当する。このために、ホストの識別と論理的位置サービスの提供という2つの機能を持つアドレッシング体系を定義している。これは、標準データグラムと標準アドレッシング体系を定義することでなされる。

データグラムの構成

データグラムはヘッダとペイロードで構成される。IPヘッダには、送信元IPアドレス、宛先IPアドレス、データグラムのルーティングや転送に必要なメタデータが含まれる。ペイロードは転送すべきデータである。このようにデータ・ペイロードにパケットのヘッダを付与して入れ子状に構成していくことをカプセル化と呼ぶ。

IPアドレッシングとルーティング

IPの最も複雑な部分がIPアドレッシングとルーティングである。アドレッシングとは、各ホストにIPアドレスを割り当てる方法であり、IPホストアドレス群を分割・グループ化してサブネットワークを形成する方法である。IPルーティングは全てのホストが行うが、最も重要な部分はルータが担っており、経路を決定するのに Interior Gateway Protocol (IGP) または Exterior Gateway Protocol (EGP) を使用する。

信頼性

IPの設計原理は、ネットワーク基盤はどのネットワーク要素や伝送媒体をとっても本質的に信頼できないと仮定しており、リンクやノードの可用性の面でも一定でないと仮定している。ネットワークの状態を追跡し維持する集中監視機能や性能測定機能は存在しない。ネットワークを単純化するため、知的な部分は意図的に各データ転送の端点であるノードに担わせ、これをエンドツーエンド原理と呼ぶ。転送経路の途中に位置するルーターは、宛先アドレスのルーティングプレフィックスにマッチする最も近いゲートウェイにパケットを転送するだけである。
このような設計の結果、IPはベストエフォート式配送のみを提供し、「信頼できない」と見なされている。ネットワークアーキテクチャとしては「コネクションレス」プロトコルであり、コネクション指向の転送モードとは対照的である。信頼性がないため、データが壊れたり、パケットを消失したり、パケットが複製されたり、パケットの順序が入れ替わって受信されたりする。ルーティングはパケット毎に動的に行われ、ネットワークは以前のパケットが通った経路についても状態情報を保持しない。そのため一部のパケットが他より長い経路を通ることがあり、受信側でパケットを受信する順序がおかしくなる可能性がある。
信頼性のないIPv4で唯一確かなのは、IPパケットのヘッダには誤りがないという点である。ルーティングするノードは、パケットのチェックサムを計算する。もしチェックサムが合わない場合、そのノードはそのパケットを捨てる。そのノードは送信元にも宛先にも捨てたことを通知しないが、Internet Control Message Protocol (ICMP) でそのような通知をすることも可能である。一方、IPv6ではルーティングの高速化を優先してチェックサム計算をやめた。
上位層プロトコルは、この信頼性問題への対処を担う。例えば、アプリケーションにデータを渡す前にデータをキャッシュして正しい順序に並べ替えたりする。
信頼性問題に加え、動的性質とインターネットおよびその構成要素の多様性に関連し、データ転送経路のうちどれが適当かは全く保証できない。技術的制約の1つとして、リンクごとにデータパケットのサイズ上限が異なる。アプリケーションは適切な伝送特性を使うことを保証しなければならない。この責任の一端は、IPとアプリケーションの中間に位置する上位層プロトコル群にもある。ローカルなリンクにおける Maximum Transmission Unit (MTU) のサイズを調べるファシリティがあり、IPv6の場合は宛先までの経路全体を考慮したMTUサイズを調べるファシリティもある。IPv4には元のデータグラムを自動的に断片化する機能がある。この場合、IPは断片化されたパケット群の到着順序を正しく保つ必要がある。
例えば Transmission Control Protocol (TCP) はセグメントサイズをMTUより小さく調整するプロトコルである。User Datagram Protocol (UDP) と Internet Control Message Protocol (ICMP) はMTUサイズを無視するので、必要ならIPが断片化を行う。

バージョンと歴史

1974年5月、Institute of Electrical and Electronic Engineers (IEEE) が "A Protocol for Packet Network Intercommunication" と題した論文を公表した。この論文で筆者ヴィントン・サーフとロバート・カーンは、ノード間のパケット交換を使ってリソースを共有するインターネットワーキング・プロトコルを記述した。このモデルの中心となる制御コンポーネントが "Transmission Control Program" (TCP) で、コネクション指向のリンクとデータグラムサービスの両方を含んでいた。モノリシックな Transmission Control Program は後にモジュール化され、コネクション指向層の Transmission Control Protocol とインターネットワーキング（データグラム）層の Internet Protocol に分けられた。このモデルが一般に TCP/IP と呼ばれ、正式にはインターネット・プロトコル・スイートと呼ばれている。
Internet Protocol はインターネットを定義する要素の1つである。インターネット層におけるインターネットワーキング・プロトコルで2012年現在主に使われているのはIPv4である。この4という番号はプロトコルのバージョン番号で、全てのIPデータグラムの先頭に書かれている。IPv4は RFC 791 (1981) で記述されている。
IPv4の後継がIPv6である。バージョン4からの最大の変更点はアドレッシング体系である。IPv4は32ビットのアドレス（約40億、4.3×10⁹）を使っていたが、IPv6では128ビットのアドレス（約 3.4×10³⁸）を使っている。IPv6の採用はゆっくりとしていたが、2008年6月、アメリカ合衆国連邦政府がバックボーンレベルのみではあるが全システムでIPv6をサポートしてみせた。
IPのバージョン0から3まではIPv4の開発途中のバージョンで、1977年から1979年までに使われた。バージョン5は実験的なストリーミング用プロトコル Internet Stream Protocol で使われた。バージョン6から9までは、IPv4の後継として提案された各種プロトコルである。このうちバージョン6とされた SIPP (Simple Internet Protocol Plus) が IPv6 として採用されることになった。7から9は IP/IX (RFC 1475)、PIP (RFC 1621)、TUBA (TCP and UDP with Bigger Addresses, RFC 1347) である。
他にも IPv9 や IPv8 を名乗ったプロトコルが提案されたことがあるが、全く支持されていない。
1994年4月1日、IETFはエイプリルフールのジョークとしてIPv9を発表したことがある。

脆弱性

IPは様々な攻撃に対して脆弱である。網羅的な脆弱性アセスメントが対策の提案と共に2008年に公表され、その後IETF内で対策を検討中である。