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

それでも不正確なデータを受け取ったらどうするの?

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


素朴な疑問
正確な通信のための確信
  1. 不正確なデータを受け取ったらどうするの
通信中のトラブルを解明しよう
  1. 通信の様子を見せて
  2. 通信の失敗の種類は?
  3. でも、到着しなかったものを無視してOK?
  4. データが化けたら?

通信データが消えてしまうケースを追う

  1. ここが難関! 分かりやすく説明して
  2. 要点を簡単にまとめて

肯定確認応答が届かないケースを追う

  1. こちらもステップバイステップで説明して
  2. ポイントを簡単にまとめてください
 正確な通信のための核心

 これまで4回「TCPの迷宮をさまよってみませんか? 」「ITオンチにTCPのセボネを見る」「分かるスライディングウィンドウ、見えるEhtereal」「ウィンドウは主導権と良心のはざまで」に渡って、TCPが正確な通信をするための、いろいろな工夫を紹介してきました。でも、1つまだ抜けている部分があります。それは「なんだかんだいっても、実際、不正確なデータを受け取ったらどうすんの?」というお話です。今回はそのお話を取り上げたいと思います。

●不正確なデータを受け取ったらどうするんですか?

 受信したデータが不正確だったり、来るはずのデータが来ないときには、受信側から送信側にそれを知らせて、送信側がもう一度送ってあげます。これを「再送」といいます。不正確なデータになっている場合も、足りないデータがある場合も、再送することによって、本来の正しいデータに立ち直ることができます。

 TCPの再送はちょっと複雑です。なぜかというと、受け取り確認をしなくてもウィンドウサイズまでは連続して送る、この連載でいう「連続送り」の仕組みがあるためです。でも、決して理解が難しいものではありませんので、一緒にトライしてみましょう。

 通信中のトラブルを解明しよう

●通信の様子を分かりやすく見せてください

 正確な通信をするため、TCPがどんなことをしているか。それを分かりやすく見てゆくためのアニメーションを用意しました。まずその見方を説明します。

アニメーション TCPの動き詳しくは肯定確認応答が届かないケースで後述

 このアニメーションでは、データを送信する側を上に、データを受信する側を下に描いてあります。数字が書き込んである1つの箱は、トラックの例でいえば、トラック1台に相当します。トラックにはリンゴ(1バイト分のデータ)が複数積まれていたように、この箱の中にはデータが複数含まれていると考えてください。

 アニメーションの(1)を見ると、箱[1]から箱[4]までの箱が太い線で囲まれています。この枠はTCPのウィンドウを表しています。トラックの例でいえば駐車場の広さに当たる部分です。ウィンドウがスライドしていく様子は、(3)の緑の矢印のように表しています。「スライディングウィンドウ」については、[下位レイヤ編]第3回 「分かるスライディングウィンドウ、見えるEthereal」(スライディングウィンドウの謎に迫る)を参照してください。

 黒い矢印は、送信側が送り出したデータがどこまで進んでいるかを表しています。(1)でいうと、[1]のデータが間もなく受信側に到着しようとしていて、[4]のデータはまだそんなに進んでいないことを表しています。

 送信側の箱が黄色く塗りつぶしてあるのは、すでに送信したデータであることを示しています。また受信側の数字で黒地に白く書いてあるものは、いま受信したばかりのデータを表しています。(2)で見ると、受信側の[1]が、たったいま受信したデータです。

 また同じ(2)の青い矢印は、データを受信した受信側が、送信側に返送した肯定確認応答(ACK)を表したものです。この矢印が[2]に向かっているのは、受信側が次に[2]のデータを送るよう求めていることを表します。次にどれを送ってほしいかは、肯定確認応答の中に含まれています。なお、これらの矢印の横に書いてある数字は、複数ある矢印の発生順を示しています。

●通信の失敗にはどんな種類があるんでしょうか

 TCPの通信を狂わせる状況としては、送信側が送ったデータに関するものと、肯定確認応答に関するものに分けて考えると分かりやすくなります。

 まず、送信側が送ったデータの問題については、受信側から見て、(1)一部のデータが重複して到着した、(2)一部のデータが到着しなかった、(3)データの順番が入れ替わった、の3つが考えられます(図1)。

図1 通信中に起きる問題を分類してみると……

 このうち(1)は、後から来たものを無視すればいいので、対処はそんなに難しくないことが想像できると思います。残る(2)と(3)ですが、TCPでは、スライディングウィンドウを上手に使って、この2つを一度に片付けています。具体的なやり方は、また後で説明します。

 肯定確認応答についても、同様に(1)〜(3)の問題が発生する可能性があります。送信データの場合と同様に、(1)の重複については、重複部分を無視すれば問題ありません。

 肯定確認応答に関してユニークなのは、(2)の一部の肯定確認応答が到着しなかった場合です。TCPでは、それより後のデータに対する肯定確認応答が到着すれば、途中の肯定確認応答がなくても、そのまま通信を続けます。つまり、[1]の肯定確認応答の次に、[3]の肯定確認応答が来たら、[2]の肯定応答が抜けていても、それは問題なしと見なすということです。

 こうすると、(3)の順番の入れ替わりについても、その対応方法が見えてきます。[1][3][2]と来たら、[1][3]を受信することで[2]も問題なしと見なして処理を続け、その後に[2]が来たら、それは重複として無視すればいいことになります。

 結局、肯定確認応答については、到着しないデータを無視することで、その対応は、非常にシンプルなものになることが分かると思います。

●でも、到着しなかったものを無視して大丈夫なんですか?

 でも、ちゃんと受信したこと確認する肯定確認応答を無視して大丈夫なの? そんな疑問もわきます。でも大丈夫、うまくいきます。うまくいく理由は、TCPが「送信データを受信できないときには、受信できるまで文句をいう」性格だからです。よく「頼りがないのは、良い知らせ」といいますが、TCPはまさにこれを地で行っています。

 TCPは、受信できないデータがあると、抜け落ちたデータ受信できるまで、延々「xx番が届いてない」といい続けます。逆にいえば、それが聞こえてこない限り、肯定確認応答が1つ、2つ抜けても、送信そのものはうまくいっていると判断できます。こういった理由から、肯定確認応答については、その抜けも見逃すことができる、というわけです。

●データが化けたらどうする?

 TCPでは、送信したい本来のデータに加えて、それが正しいかどうかチェックするための情報も一緒に送信しています。そのため通信回線に問題が発生して、送ろうとしているデータが壊れてしまうと、それを受信した側が、壊れてしまっていることを判断できます。

 データを受信したコンピュータは、自分でも、そこに含まれているデータからチェック情報を計算します。その結果と、送信情報に付いてきたチェック情報を比べて、同じならデータは正しく受信できたと判断します(図2)。

図2 データのチェック方法

 もし2つのチェック情報が違う結果になるときは、通信途中で情報が書き換わってしまったと判断し、そのデータを捨てます。すると、そのデータは到着しなかったのに等しいわけですから、先に説明した「一部のデータが到着しなかった」場合と同じ扱いで処理すればいいわけです。

 

 

TCP/IPアレルギー撲滅ドリル【下位レイヤ編】(5)目次
1  正確な通信のための確信/通信中のトラブルを解明しよう
2  通信データが消えてしまうケースを追う
3  肯定確認応答が届かないケースを追う

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

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

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


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

注目のテーマ

Master of IP Network 記事ランキング

本日 月間