連載第8回
TCP/IPアレルギー撲滅ドリル【下位レイヤ編】

不確実なIP通信をカバーする
うまい方法とは

福永勇二
インタラクティブリサーチ
2004/12/21


素朴な疑問
実は前回がヤマでした
1 IPはTCPくらい難しい?
2 IPパケットって何ですか?
3 通信を始めるときの手順は?
IPパケットはこうなっている
4 IPパケットはどんな構造?
5 パケット長って何ですか?
6 識別子は何のために使う?
7 フラグメントって何ですか?
8 フラグ、フラグメントオフセットについて教えてください
9 生存時間って何ですか?
10 プロトコル番号って何?
11 データ部分にはどんなデータが入るのですか?
 IPパケットはこうなっている

IPパケットはどんな構造なんですか?

 実際のIPパケットの構造を図1に示します。緑の部分は絶対必要な情報です。ピンクはオプションで、あってもなくても構いません。黄色の部分が実際に送り届けたいデータです。図1で1バイトと示した大きさが、実際のデータの1バイト分になります。また図では4バイトのデータを積み重ねた形になっていますが、実際のネットワークでは左上から右方向に、端にたどり着いたら1つ下の段の左端から右方向へと、順次データを送信します。 

図1 IPパケットの中身はこうなっている

 IPパケットの中の各部分に入っている情報には、それぞれきちんと役割があり、IPを完全に理解するには、それらを詳細に知っておく必要があります。しかしこの記事はそれが目的ではありませんので、特に大切なものをピックアップして次から説明します。

パケット長って何ですか?

 「パケット長」には、IPパケット全体の大きさがバイト単位で入ります。

 IPパケットのオプション部分やデータ部分の大きさは、送信するコンピュータが自由に決めることができます。そのため、そのままでは、受信側のコンピュータはデータの終わりがどこなのか判断できません。

 もし、データの終わりに「データ終了」のマークが付いていれば、それを見つけたら全部受信と見なすことができます。でも、「データ終了」マークと同じ内容のデータがあったらどうするかなど面倒な問題もあって、IPではそのやり方はしていません。

 その代わりにあるのが「パケット長」の情報です。この情報を使うことで、データを受信するコンピュータはデータ部分を含めて、全体の大きさを先に知ることができます。そのため、どこまでがデータなのかを判断できるようになります。またデータが途中で欠落してしまった場合には、それが足りないことを発見することも可能になります。

 ちなみに、「ヘッダ長」には、データ部を除いたサイズが入っています。そのため「パケット長」から「ヘッダ長」を差し引くことでデータ部分のサイズが分かります。また図で緑の部分は20バイトに決まっていますから、「ヘッダ長」から20を引くとオプション部の大きさも分かります。

識別子は何のために使うんですか?

 「識別子」は、そのパケットを特定できる情報が入ります。どんな情報を入れるかは、データを送信する人が決めて構いません。例えば、情報として数値を入れ、IPパケットを1つ送るごとに、その値を1つずつ増やしていく、といったやり方があります。

 TCPでは、これと似たようなシーケンス番号を使って、データの再送や並べ替えをしています。しかしIPではそういった処理はしていません。「識別子」は、主に次に触れる「フラグメント」をうまく処理するために使います。

フラグメントって何ですか?

 「フラグメント」は、もともと1つのIPパケットに入っていたデータを、いくつかの小さいデータに分割したときの、1つ1つの断片を表しています。

 それにしても、せっかく1つのパケットとしてまとめてあるのに、どうして複数に分けなければいけないのでしょうか? その秘密は、そのネットワークが一度に送ることができるデータの最大サイズに隠されています。

 例えば普通のLANに使うEthernetでは、1回の送信動作で1500バイトのデータを送ることができます。IPパケットは、このサイズに収まるように作られます。

 ところが、このIPパケットを送ろうとする通信路は、ずっとEthernetのままとは限りません。もし通信路の途中に、1回の送信動作でもっと少ない量しか送れない部分が出てくることも十分にあり得ます。そのときにはどうすればいいでしょうか?

 ここで登場するのが「フラグメント」です。図2を例に説明しましょう。なお、この説明は、フラグメントの仕組みを分かりやすく説明するものですので、実際のネットワークで必ずこのような分割のされ方をするとは限らない点に注意してください。

図2 フラグメントが起こるわけ

 PC1はPC2にデータを送ろうとしています。データ部分が1200バイト、ヘッダ情報20バイトを加えると、全体で1220バイトのIPパケットです。PC1はそのIPパケットをまずルータXに渡します。PC1とルータXを結ぶネットワークAは、1回の送信動作で1500バイト送ることができます。そのためIPパケットはそのままの形でルータXに届きます。

 パケットを受け取ったルータXは、それをルータYに送ろうとします。しかしルータXとYの間のネットワークBは、1回の送信動作で700バイトしか送れません。そこでルータXは、このパケットのデータ部分DをD1とD2の2つに分けて、それにヘッダを付けて2つの620バイトのIPパケットに作り替えました。ルータXは、この2つのIPパケットを、2回の送信動作でルータYに送ります。

 無事にルータYまで届いたIPパケットは、次にPC2に届けられます。その間にあるネットワークCは1回の送信動作で1500バイトまで送れますから、2つのパケットはそのままでPC2に届きます。そして、最後にPC2の中で、それが分割されていることを検出して、あらためて元のパケットの形に組み立てられることになります。

 このように1つのIPパケットに含まれるデータを、2つ以上のフラグメントに分けることを「フラグメント化」と呼びます。

フラグ、フラグメントオフセットについて教えてください

 IPパケットの中の「フラグ」には、そのパケットが分割されたもの、つまりフラグメントであることを表す情報が入ります。また「フラグメントオフセット」には、それが元のデータのどの位置にあったかを表す情報が入ります。

 これらの情報は、フラグメント化されたデータを組み立てるときに、とても重要な働きをします。2つ以上に分けられたデータは、もともと1つのIPパケットに含まれていたものですから、識別子はどれも同じ値になっています。そこで「識別子が同じで、分割されたことを示す情報がセットされているIPパケットを抜き出して、それをフラグメントオフセットの順番で並べる」ことによって、元のIPパケットが復元できるわけです。

生存時間って何ですか?

 「生存時間」というと何だか仰々しいのですが、これはそのIPパケットがネットワークの中で何秒間存在することができるかを表しています。単位は秒で、IPパケットを送信するコンピュータがセットします。ただ、これは原則的な意味合いであって、実際に正確な時間を計っているわけではありません。一般に次のような便宜的な処理をします。

 ルータがIPパケットを中継するときには、この値を必ず1つは減らします。ルータの中継処理にかかる時間は、普通、長くてもミリ秒単位ですが、それにかかわらず、1回中継されるたびに1つずつ減らします。この辺りが便宜的な処理といわれる部分です。また、ルータの負荷が高くなるなどして中継時間が非常に長くなると、その待ち時間に応じた秒数だけ減らされることもあります。

 このようにして中継するたびに、また実際の時間に応じて値を減らしてゆき、その値が0になってしまうと、そのIPパケットは捨てられます。生存時間という考え方を使うことで、IPパケットがネットワークの中を無限にループするようなことがなくなります。なお生存時間(Time to Live)は簡単に「TTL」と呼ぶこともあります。

プロトコル番号って何ですか?

 「プロトコル番号」には、そのIPパケットで運ぶ上位プロトコルの番号が入ります。具体的には、TCPと一緒に使う場合は6が、UDPと一緒に使うときは17が入ることになります。

 一般に、IPパケットを受信したコンピュータは、ここに入った番号を見て、データ部分の処理の仕方を決めます。例えば、ここが6であれば、データ部分にTCPの情報が入っていることが分かります。そこでデータ部分からTCPのフィールド構成に従って情報を取り出し、実際のTCPの処理をするわけです。なお上位プロトコルがない場合は0になります。

データ部分にはどんなデータが入るのですか?

 IPパケットの「データ」にどんなデータが入るのか? それは確かにあらためて聞きたくなる質問かもしれません。答えを先にいえば、ここに入るのは「TCPパケット」です。本連載のTCPの説明では、具体的なTCPパケットの構造を説明しませんでしたが、IPパケットの場合と同じように、どの部分にどういった情報が入るか、具体的な構造が決まっています。このように決められているTCPパケット全体がこの「データ」部分に入ります。

 といっても、ピンと来にくいと思うので、もう少し全体が見えるよう図3を用意しました。一番上にあるのがネットワークを流れているデータです。

図3 TCPやEthernetとIPの関係

 この中には、通信をコントロールするEthernetヘッダと呼ばれる情報と、それに続いてデータ部分があります。Ethernetは、このうちデータ部分だけをコンピュータプログラムに引き渡します。

 IPを使うネットワークでは、こうして受け取ったものがIPパケットです。その中には、通信をコントロールするIPヘッダ(オプション)とデータがあります。IPを処理するプログラムは、このうちデータ部分を通信結果として引き渡します。

 IPと一緒にTCPを使うネットワークでは、こうして受け取ったものがTCPパケットです。その中には、再送などの通信をコントロールする情報を含んだTCPヘッダ(オプション)とデータがあります。この中のデータ部分が、最終的にネットワークから受信したかったデータになるわけです。
 なお、データを送信する場合は、これと逆の手順をたどってゆき、最終的にネットワークを流れる情報が作られてゆきます。

 ところで、この図3を別の視点から見ると、TCPの情報は、IPの仕組みの中で送られていることが分かると思います。IPは直接つながっていないコンピュータ同士の通信を行うための基盤的な仕組みであり、その仕組みのうえで、より正確な通信をするためにTCPを使っている。その2つのプロトコルの関係が、ここにしっかり表れているわけです。

前回(「 アイピー」ってなんですか?)と今回とで、IPについて説明しました。いかがでしたでしょうか。ベースの考え方がTCPよりシンプルなため、割と理解しやすかったのではないかと思います。ただ、シンプルだとはいっても、まだ説明し切れていない部分が残っています。専門の解説書などを参照して、IPのより深い部分を学んでみてください。

実は前回がヤマでした

TCP/IPアレルギー撲滅ドリル【下位レイヤ編】(8)目次
1  実は前回がヤマでした
2  IPパケットはこうなっている

関連リンク
  連載:TCP/IPアレルギー撲滅ドリル【超実践編】(上位レイヤ編)
連載:インターネット・プロトコル詳説

連載:ルータの仕組みを学ぼう
ホストのネット接続は正しく行われているか? 〜netstatによるネットワーク設定の確認〜


「Master of IP Network総合インデックス」


Master of IP Network フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Master of IP Network 記事ランキング

本日 月間