インターネット・ネットワークプロトコル


目次

はじめに
IPとはなにか
UDPとはなにか
TCPとはなにか
タイマによる再送

一つ前へ


はじめに

 
 われわれがTCP/IPと呼んでいるものは、ARPA(現DARPA:Defence Advanced Reserch Projects Agency)がスポンサーになり開発され、ARPANETで使用されたプロトコルを源流にもつネットワークプロトコルの一群を指します。TCPやIPは、その数々のプロトコルの中の代表的な2つのプロトコルを指しているにすぎません。
 ARPANETリファレンスモデル、あるいは単にTCP/IPのリファレンスモデルと言われますが、レイヤの構造は下の図の構造になっています。

IPとはなにか
 IPは、中継する数々のルータを経由した、発信元となるホストから送り先ホストへ、データグラムが送られるメカニズムをもったネットワークに使われるプロトコルのことです。データグラム(datagram) とは、接続を伴わない独立したデータの集まり(塊) を指します。ここでは、ネットワークレベルのサービスとして、宛先アドレスの処理、ルーティングの処理、もし必要ならば、フラグメントの処理もされます。

 IPアドレスのフォーマットについては、こちらをご覧ください。
 さて、大切なIPの役目ですが、IPの最大の役目は、相手に届けるということです。
ただし、送りっぱなしなので、相手に本当に届いたかどうかは、この時点ではわかりません。ついでに言えば送られたデータの整合性もチェックすらしません。IPパケット自身のヘッダのチェックサムのみしかもっていません。
 IPのヘッダには、いろいろな情報がありますが、そこで大切な情報は、<送信アドレス, 宛先アドレス, プロトコル> です。プロトコル種別とは、IPの上位のプロトコルのことです。TCPとかUDPとかのプロトコル種別が入っています。

UDPとはなにか
 UDP(User Datagram Protocol) は、IPの上位レイヤのプロトコルで、2者間での通信を可能にし、データのチェックサムをつけた単純なプロトコルです。UDPヘッダに持っている情報は、<送信元ポート, 宛先ポート, データ長, データのチェックサム> ですべてです。

 ポートとはアプリケーションがデータを取り出すサービス窓口番号だと考えればいいでしょう。どんなサービスが、どんなポートとプロトコルを使っているかは、UNIXであれば /etc/servicesファイルをみればわかります。1024 未満のポートは(アプリケーションの実行権限が)root でなければ使用できません。
 IPの上位プロトコルと呼ぶにはあまりにも単純なUDPのプロトコルでは、送信元の送ったUDPパケットが、宛先に到着したかどうかもわかりません。ただ、送り出すだけです。コネクションレスな通信を可能にしますが、単純すぎるがゆえに用途は限られます。安定した通信に必要とされる複雑な制御は、アプリケーション側で用意しなければいけなくなります。

TCPとはなにか

 TCP(Transmission Control Protocol) は、インターネットプロトコルの代名詞TCP/IPとして知られ広く使われているプロトコルです。転送制御を持ち、コネクション指向のストリーム型トランスポート層プロトコルです。

●明示的な、伝達確認をもつコネクションの確立を切断
●信頼ある、順序の保たれた、重複しないデータ転送
●フロー制御
●緊急データの帯域外指示

 最初の2つの意味は、UNIXのパイプのようにストリームデータだということです。アプリケーションから渡されるデータは、TCPの層でセグメント化(適当なサイズに分割される)されます。1つのIPパケットに1つのセグメントを載せます。

 IP自身は、相手に届くのか保証していませんし、また、順番に送り出したはずの個々のIPパケットが相手に到着したときに、順番通りかも保証していません。そこでTCPでは、それらの処理をします。
 まず、順番通りというところから説明しましょう。TCPは、ヘッダに順番番号を持っていて、この番号を使って到着順や届いたかどうかを確認しています。この順序番号は、0からスタートしているわけでなく、適当な乱数で初期値を決めます。この順序番号は32ビットですので、値が一杯になれば(all"1"-1)になれば0に戻って続けます。TCPはIPの特性により必ずしも順番とうりのセグメントがやってくるとは仮定していません。順番通りにセグメントが届かなかった場合は、バッファにためています。これは、ネットワークのバンド幅をなるべく有効利用するように考えられているためです。
 次に、到着したかどうかのメカニズムですが。転送するセグメントが、消えてなくなってしまったり、あるいは重複してしまった場合、再送をするために確認応答の処理を行います。TCPは、ポジティブ確認応答(Positive Acknowledgement)という手法を使います。これはデータが届いたら、ACKを返す方法です。
 TCPは、ポジティブ確認応答ですが、世の中にはその反対の方法もあります。それはNACKの通知をするネガティブ確認応答(Negative Acknowledgement)という手法です。滅多に通信エラーが発生しないようなネットワークでは、ネガティブ確認応答の方が効率がよいのはいうまでもありません。
 さて、TCPはコネクションが設定されたホスト間で、データを受信するたびにACKを返します。このACKの交換により、送信元は相手にセグメントが正しく届いたかを確認します。もちろん、IPは到着を保証していませんから、このACK自体も本当に届くかどうかわかりません。このACKすら帰ってこない場合は、どうするのでしょうか?

タイマによる再送

 送信元のホストでは、セグメントを送り出した後、一定時間が経過してもACKが戻らない場合、セグメントを再送出します。タイマで時間を計測していて、設定された時間内にACKが戻ってこない場合(タイムアウトした場合)、再送を行います。
 このタイムアウト時間は、固定値ではありません。なぜかというと、TCPが使われているインターネットというネットワークの特性として、伝送遅滞は動的に変化するからです。このようなネットワークで、固定にしてしまうのは得策ではありません。
 EthernetのLAN上では、データのやりとりに、数ミリ秒しかかかりません。ですから、タイムアウトはせいぜい数十ミリ秒程度で十分です。ところが、これが地球の裏側と通信をするとなると事情が違います。タイムアウトは、数秒から数十秒程度の値とすべきでしょう。このような理由から、通信するホスト間でデータを送信してからACKが戻ってくるまでの時間(これをRTT:Round Trip Timeといいます)を計測し、そこから再送のための時間を決めるような実装をしています。

ネットワークプロトコルのまとめ

 ネットワークのプロトコルに関して
  • IPは、宅配の小包のようなものである。
  • しかも、相手に届いたかどうかの保証もないし、先に送ったものが後から着くかもしれない。
  • また、データが壊れているかどうかも保証しない。
  • UDPは、IP上位のプロトコルであるが、ホスト上のどのポートを使うか、データが壊れているかどうかまでは保証するが、あとは何もしない単純なプロトコルである。
  • TCPは、IP上位のプロトコルでTCP/IPといわれるように、いわば代名詞となっているプロトコルである。
  • TCPは、転送制御を持ち、コネクション指向のストリーム型トランスポート層プロトコルである。
  • TCPは、そのために複雑なメカニズムをもつ。

一つ前へ