このページの本文へ

前へ 1 2 3 4 次へ

TCP/IPまるわかり 第5回

論理的な伝送路で信頼性を上げる技術を知ろう

TCPのキモはコネクションとポート番号

2009年07月13日 09時00分更新

文● 伊藤玄蕃

  • この記事をはてなブックマークに追加
  • 本文印刷

シーケンス番号を用いて正しい順序で受信

 TCPではセグメントの順番の狂いを検出し、受信側アプリケーションに順番通りに渡すため、「順序番号(シーケンス番号)」を用いる(図4)。TCPの順序番号は、初期値は次のパートで説明するように不定値だが、データを送信するたびに、送信されたデータのオクテット数(=バイト数)を加算した値になる。たとえば、送信するデータをTCPが100オクテットずつに分割して送信するときを考えてみよう。最初のセグメントの順序番号が“123”であった場合、2番目のセグメントの順序番号は“223”、3番目のセグメントの順序番号は“323”、……となる。この順序番号は、送信ホストがTCPヘッダの中の順序番号フィールドに記入する。

図4 TCPの順序制御

 一方、セグメントを正しく受信したホストは、確認応答(ACK)を送信ホストに返す。受信ホストは送信ホストに「データをどこまで受け取ったか」を通知するため、ACKの中に“受信したセグメントの順序番号+受信したデータのオクテット数”を「応答番号」として記入する。この値は、次に受信する予定のセグメントの順序番号と一致する。送信ホストはACKの中に含まれるこの値と、自分が次に送信する予定のセグメントの順序番号を比較し、先に送ったセグメントが正しく処理されたかどうかを判断する。つまり、上の例では以下のような処理が行なわれる。

  1. 送信ホストは、順序番号“123”のセグメントを送信する
  2. 受信ホストは、順序番号“123”のセグメントから100オクテットのデータを取り出す
  3. 受信ホストは、次に受け取る予定の順序番号“223”を応答番号に記入して、ACKを送信する。
  4. 送信ホストは、ACKの応答番号が予想通りであることを確認する
  5. 送信ホストは、順序番号“223”のセグメントを送信する(以下、くり返し)

 受信ホストまでセグメントが正しく到着しているのに、ACKがネットワーク内で失われてしまった場合(パケットロス)や、タイマが切れる前に届かなかった場合(タイムアウト)には、上述の通り、送信ホストはセグメントを再送する。この場合、受信ホストは同じセグメントを重複して受信することになるため、順序番号で重複を検出して、遅れて到着したほうを廃棄する。

 かつて、パケット従量課金の回線サービスが主流だった頃は、再送による通信費の増加はきわめて切実な問題であった。そのため、再送信タイマの設定値は重要である。時間が短すぎる場合はタイムアウトによる再送が頻発し、トラフィックが増えてしまう。逆に、時間が長すぎるとタイムアウトによる再送が行なわれるまでに時間がかかり、1つのセグメントの損失がデータ転送の全体スループットを悪化させる。そのため現在のTCPでは、セグメントの送信からそれに対するACKの到着まで時間(ラウンドトリップ時間、RTT)などを基に、タイマの値を自動的に調整する手法が採用されている。

Column:UDP

 UDP(User Datagram Protocol)は、TCPと同じトランスポート層のプロトコルである。TCPがコネクション型であるのに対しUDPはコネクションレス型のプロトコルで、TCPのように信頼性の高い通信サービスを提供するものではない。しかし、コネクションを確立したり終了したりする処理が不要なため、短時間で完結する処理に向いている。

 UDPのメッセージ単位は「データグラム」と呼び、データグラムの順序制御・エラー訂正・フロー制御などはいっさい行なわれない。信頼性に関する唯一の機能は、チェックサムだけである。そのため、通信に高度な信頼性が必要であれば、上位アプリケーションで制御しなければならない。

 一方UDPの利点には、TCPに比べて処理が高速であったり、組み込みが容易といったものがある。このため、通信回線の信頼性が高くパケットの損傷や紛失をほとんど考慮する必要がない場合、メリットのほうが大きい。

 またUDPを使えば、下位層のIPの機能を上位アプリケーションから操作することが可能である。たとえば、IPのオプションデータを操作するアプリケーションは、UDPを利用すれば簡単に作成できる。このため、ネットワーク監視のプログラムはUDPを利用することが多い。

前へ 1 2 3 4 次へ

カテゴリートップへ

この連載の記事
  • 角川アスキー総合研究所
  • アスキーカード