headerIPパケットは、IPヘッダとIPペイロード(データ部分)から構成されています。Protocol)の制御情報です。IPv4とIPv6のIPヘッダは、以下のように定義されています。†IPv4ヘッダは、12個のフィールド(基本ヘッダ)とオプションから成っています。IPv4ヘッダ長の最小は、20バイトです。=基本ヘッダのみIPv4ヘッダ長の最大は、60バイトです。=基本ヘッダ+40バイトのオプションオプションを追加する場合、4バイト単位で増えるようにパディングを詰めて調整されます。ネットワークエンジニアを目指してIPヘッダの中身は以下のような形式で情報が入っています。TCP/IP入門IPヘッダの基本ヘッダ部分は、20バイト(160bit)で構成されています。オプションは、必ず付けなければならないというものではありません。IPとはIPヘッダのフォーマットは以下の通りです。IPヘッダは20バイトのサイズですが、オプションが追加された場合は最大で60バイトのサイズとなります。オプションやパディングは一般的には使用されることはないのであまり意識する必要はありません。「データ」はIPヘッダではなくIPペイロードと呼ばれる部分です。IPペイロード部分には、TCPやUDPなど上位層プロトコルのヘッダとデータが含まれます。1.IPパケットの構造IPパケットの詳細構造IPパケットの構造は、IPヘッダ部分と、IPパケットによって運ばれるデータ部分(図中の赤の部分)の大きく2つに分けられる。IPヘッダはさらに固定長の部分(図中の青色と緑色の部分。先頭の20bytes)と、オプション部分(図中の黄色の部分。最小0byte)の2つで構成される。図中の小さい1目盛りは1bit幅であり、ここでは32bitずつに区切って表現している。†IPv4ヘッダには、12個のフィールドがあります。†バージョン(Version)フィールドは、IPのバージョンを表します。IPv4は、4(2進数表現では0100)です。IPv6は、6(2進数では0110)です。同じネットワーク媒体上に、IPv4とIPv6のパケットが混在していても、バージョンフィールドによって区別することができます。インターネットヘッダ長)フィールドは、IPヘッダの長さを表しています。ヘッダ長によって、IPヘッダとデータの境目が分かります。4ビット幅しかないので、0から15までしか表現できないが、ヘッダの長さは32ビット(4バイト)単位(つまりヘッダ部分は常に4バイトの倍数)で数えるので、最大長は15×4=60バイトまで表せます。IPヘッダの固定長部分(基本ヘッダ)が常に20バイトあるので、このフィールドの最小値は5(20÷4)であり、最大値は15となります。Service)を指定するために使われます。ある特定の値が指定された場合には、他のパケットよりも優先してルーティング処理などを行う、といった設定ができます。音声トラフィックとデータトラフィックでは、音声トラフィックのデータを優先して送出することができる、などです(いわゆるQoS処理)。現在使われている実際のTCP/IPネットワークでは、このフィールドによるTOS指定はほとんど使用されておらず、意味を持っていないことが多いようです。Length)フィールドは、IPヘッダとデータを含めたパケット全体の長さを表します。ヘッダ長フィールドが「IPヘッダのサイズ」を4バイト単位で数えたのに対し、パケット長フィールドはパケット全体のサイズをバイト単位で数えたものです。このフィールドの幅は16ビットなので、パケットのサイズの最大長、つまり1つのパケットで送信可能なデータ(+ヘッダ部)のサイズは64Kバイト(65,535バイト)までとなります。パケットがフラグメント化(大きなパケットを小さなパケットに分割)されている場合は、このフィールドは、元のパケット全体のサイズではなく、このフラグメントだけのサイズを表します。†ID(Identification)フィールドは、パケットを識別するための数値です。Unit:最大転送単位)サイズに合わせて、送信側のIPでデータを分割(フラグメント)し、受信側のIPで組み立てる機能を持っています。サイズの大きなパケットをフラグメント化(分割)する時に、分割後のパケット全てに同じ識別番号を与えることによって、分割されたパケットを結合して元のパケットに戻すことができます。IPフラグメンテーションとは?IPパケットの最大サイズは64Kバイトですが、このサイズのデータを1回で送信できないネットワーク媒体がほとんどです。そのため、送信可能なサイズにまでパケットを小さく分割(IPフラグメンテーション)してから送信します。最終的なあて先のコンピュータ上で、分割されて届いたパケットを合成し、元のサイズのパケットに再構成します。IPフラグメンテーションの仕組みにより、物理的なネットワーク媒体によらず、パケットを送受信することが可能となっています。各コンピュータは、パケットを送信するたびにランダムな16ビットの数値を、このIDフィールドに設定します。このIDの数値そのものには意味がなく、毎回異なるIDがセットされてからパケットが送信されるということだけが重要です。同じパケットに属するフラグメント化されたパケットは、すべて同じIDを共有するので、後で1つのパケットに再構成する場合の目印となります。†フラグ(Flags)フィールドは、パケットの分割を制御する情報です。3ビットあるうち、後ろの2ビットだけが使われます。Fragment)ビット分割の不許可を表す値です。DF値が0なら、分割可DF値が1なら、分割不可ルータは必要ならばパケットを分割しますが、このDFビットに1がセットされていると「パケットを分割してはいけない」という指示になります。性能の低いコンピュータや、フラグメンテーション・アルゴリズムを実装することが困難な組込み機器などで、DFビットを指定することによって、フラグメンテーション処理を使わずにTCP/IP通信を実現することが可能となります。Fragment)ビット分割されたフラグメントの後続を表す値です。MF値が0なら、最後のフラグメントMF値が1なら、後続のフラグメントが存在1つのパケットを複数に分割した場合、最後部のパケットではこのMFビットを0にし、そのほかのパケットではMFビットを1にします。MFビットが1であれば、フラグメント化されたパケットがさらに後ろに続くという意味になります。Offset)フィールドは、分割されたパケットが、元のパケットのどの位置にあったかを表します。単位は8オクテットで、フラグメント・オフセット・フィールドの最大値は8192です。※単位:1オクテット=8ビット(=1バイト)パケットのフラグメントは、常に8バイト単位で行われるので、この値を8倍してオフセット(位置情報)の数値とします。これなら13ビットしかないフィールドでも、64Kバイトの範囲を表すことができます。生存時間)フィールドは、パケットが通過可能なルータの数を表します。ルータを経由するたびに、TTLが1ずつ減っていき、0になった時点でパケットが破棄されます。†プロトコル(Protcol)フィールドは、IPの上位層(トランスポート層)のプロトコルを表します。この値は、ICANNという組織により「プロトコル名」と「番号」が定義されています。IPの上位層プロトコルでTCPが使用されている場合、このプロトコル番号は「6」になります。Checksum)フィールドは、IPヘッダのチェックサム(整合性を検査するためのデータ)です。IPパケットの伝送エラーがないかチェックするためにあります。IPヘッダ内のTTL値は、ルータを経由するたびに変わるため、各ルータでは転送する前にヘッダチェックサムの再計算を行っています。実際には、下位のネットワーク媒体(および上位プロトコル)でも様々な方法でエラー検査が行われているので、IPプロトコルでエラーを検出しなくても問題が発生する確率は非常に小さいです。Address)フィールドは、32ビット(4バイト)で構成された、送信元のIPアドレスがセットされています。Address)フィールドは、32ビット(4バイト)で構成された、宛先のIPアドレスがセットされています。†オプションは、32ビット(4バイト)単位で追加される、可変長のフィールドです。通常は使用されませんが、デバッグやテストを行う際に使用される情報です。IPパケットの通過のログ(時間の記録)ルーティング経路の強制的指定パケットが通過したルート(ルータのIPアドレス)を記録オプション部分は通常は使用されないので、IPヘッダのサイズは20バイトです。オプションが利用される場合は、4バイト(32ビット)単位で可変であり、最大で40バイト(固定部分の基本ヘッダとあわせると最大で60バイト)にまで拡大します。†パディングは、オプションを使用したとき、サイズを調整のために入れるデータです。オプションを追加して、IPヘッダ長が4バイト(32ビット)の整数倍にならなかった場合、オプションのサイズを4バイトの整数倍にするために、詰め物(Padding)として空データの「0」の値を入れることによって調整します。†IPv6ヘッダのサイズは、固定長で40バイトです。IPv6ヘッダには、基本ヘッダと拡張ヘッダの2種類があります。IPv6の基本ヘッダは、8個のフィールドから成っています。†バージョン(Version)フィールドは、IPのバージョンを表します。IPv6は、6(2進数では0110)です。Class)フィールドは、QoSで使用するパケットのクラスです。Service)フィールドに相当します。このフィールドを使用してパケットの優先度付けを行うことが出来ます。トラフィッククラスフィールドがどのように使われるのかは、RFC2472で定義されています。Label)フィールドは、IPv4には無かったフィールドで、QoSで使用するトラフィック・フロー(データの流れ)につける識別子です。リアルタイム性が要求されるインターネット電話の音声パケット群で、同じ扱いを必要とするパケットを識別します。送信元ノードが中継ルータに対して、自分が送信する特定のトラフィックフローに対して、特別な扱いをさせるような場合に使用します。Length)フィールドは、ヘッダをのぞいたパケットサイズを表します。IPv4のパケット長は、ヘッダ+データの長さでしたが、IPv6ではヘッダをのぞいたデータの長さになっています。Header)フィールドは、IPv4ヘッダでいうところの、プロトコル番号に相当するフィールドです。IPv6ヘッダの次のヘッダという意味で、上位プロトコルのヘッダやIPv6拡張ヘッダを表します。上位プロトコルがTCPであれば、プロトコル番号は「6」、UDPであればプロトコル番号は「17」となるのは、IPv4のプロトコル番号と一緒です。Limit)フィールドは、IPv4ヘッダでいうところの、TTLに相当するフィールドになります。Address)フィールドは、128ビット(32バイト)で構成された送信元のIPv6アドレスがセットされます。Address)フィールドは、128ビット(32バイト)で構成された宛先のIPv6アドレスがセットされます。†IPv6ヘッダは、IPv4のオプションのようなデータを追加するフィールドが無い代わりに、拡張ヘッダを追加できます。http://www.infraexpert.com/study/ipv6.htmシンプルで洗練されたIPv6のヘッダフォーマット基本ヘッダ(緑色)と各種拡張ヘッダ(青色)は数珠つなぎされるIPv6ヘッダは、付加的な情報を別個の「拡張ヘッダ」に再配置する。IPv6の「基本ヘッダ」の後ろに、必要に応じて「拡張ヘッダ」を追加する。†http://www.itbook.info/study/ipv6-4.htmlIPv6拡張ヘッダは、RFC2460で6種類が定義されています。Payload)ヘッダhttp://www.ipv6style.jp/jp/tech/20030425/index.shtmlIPv6では、基本ヘッダと拡張ヘッダを明確に区別し、基本ヘッダの後に拡張ヘッダを続ける構成としている。基本ヘッダは40バイトの固定長で、すべてのIPv6パケットにつけられる。拡張ヘッダはあくまでオプションであり、付加サービスが使われない場合はつけられない。拡張ヘッダは、その役割に応じていくつかの種類がある。複数の付加サービスを使う場合には、それぞれの役割ごとの拡張ヘッダが数珠つなぎでつけられる。Headerという8ビットのフィ—ルドが見られる。これを見ると、次に拡張ヘッダがあるのか、ないのかが分かる。Headerフィールドに示される。拡張ヘッダが使われる場合、どの種類の拡張ヘッダが次にくるのかが示される。Payload)の6種類が用意されている。複数の種類の拡張ヘッダを併用する場合には、この順番でつなげることが望ましいとされている。拡張ヘッダは基本的に終点ノードによってのみ処理されるものと説明したが、その唯一の例外がホップバイホップ・オプション・ヘッダである。文字通り、パケットがルータを通るごとに実行されなければならない処理を指定するために用意されている。用途は特に限定されていない。例としてはJumbogramオプション(RFC2675)がある。Length(IPv6ヘッダを除くパケットの長さ)フィードは16ビットであるため、65536オクテットまでしか指定できないが、これを超えたサイズのパケットを送る必要がある場合に、拡張ヘッダで長さを指定しなおそうというのがJumbogramオプションである。†デスティネーション(宛先)・オプション・ヘッダは、宛先ノードによって実行される処理を指定するために用意されているヘッダである。用途は特に限定されていない。IPv6における拡張ヘッダは、基本的にすべて宛先ノードによってのみ処理されるものということはすでに述べた。その意味では、フラグメント・ヘッダなどもデスティネーション・オプションと同じだと言える。デスティネーション・オプションでは、さまざまな処理を指定できるところに違いがある。†ルーティングヘッダは、ルーティング経路を指定するための情報を埋め込むものである。これにより、プロバイダを選択するなど、特定の用途のためにパフォーマンスを確保することが可能になる。始点ノードは、このパケットが通過しなければならないルータのアドレスを、ルーティングヘッダ内にリストして示す。このリスト内のアドレスは、次々にこのIPv6パケットの宛先アドレスとして割り当てられることによって、バケツリレー式にパケットが転送されていくことになる。MTUよりも大きなパケットを送りたいときに、組み立て方を宛先に指示するためのヘッダである。MTU(最大転送単位)とは文字通り送信パケットの最大サイズのことだ。インターネットのようなネットワークでは、宛先ノードまでの間にどれほど細い経路があるのかが大きな問題となる。細い経路に大きなサイズのパケットを無理やり通そうとしても、溢れてしまうからである。IPv4の世界では、パケットの経路に存在する各ルータが、各インタフェースに設定されるMTU値にしたがって、パケットを分割する作業を実行することができる。この作業はルータに大きな負担となる。したがって、IPv6では、パケットの分割は送信元ノードだけが行うこととしている。Discoveryという作業を行い、特定の経路においてもっとも狭い帯域の部分を検出し、1つひとつのパケットのサイズをその細さに合わせて送る。言い方を変えれば、広い帯域が宛先ノードまで完全に確保されていれば、1つひとつのパケットを大きなサイズで送ることができる。送信元のアプリケーションがこのメカニズムに対応していれば、アプリケーションからのデータが最適なサイズで出てくるため、IPレイヤでは特に処理をする必要がない。Discoveryによって発見されたMTUよりも大きなパケットを吐き出してくることになる。これを適切なMTU値に合わせるためのパケット分割が、送信元ノードのIPレイヤで実行されることになる。この際に使われるのがフラグメント・ヘッダだ。†IPレイヤにおけるセキュリティの仕組みとして知られているのがIPsecである。IPv6ノードは、IPsecを実装していなければならないとされている。実装と利用とは話が別であり、IPsecによる通信を実際に使うかどうかは、時と場合によって異なる。IPsecが利用される場合、パケットの認証と、データ内容の一貫性の保証のための認証ヘッダや、データの暗号化に関する情報を示すESPヘッダは、拡張ヘッダとして組み込まれる。IPsecは、IPv4の世界でも共通に使えるメカニズムとして規定されているが、IPv4ではこれらの情報はOptionsフィールドに入れられていた。