連載第5回
|
|
正確な通信のための核心 |
これまで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アレルギー撲滅ドリル【超実践編】(上位レイヤ編) 連載:インターネット・プロトコル詳説 連載:ルータの仕組みを学ぼう ホストのネット接続は正しく行われているか? 〜netstatによるネットワーク設定の確認〜 |
「Master of IP Network総合インデックス」 |
- 完全HTTPS化のメリットと極意を大規模Webサービス――ピクシブ、クックパッド、ヤフーの事例から探る (2017/7/13)
2017年6月21日、ピクシブのオフィスで、同社主催の「大規模HTTPS導入Night」が開催された。大規模Webサービスで完全HTTPS化を行うに当たっての技術的、および非技術的な悩みや成果をテーマに、ヤフー、クックパッド、ピクシブの3社が、それぞれの事例について語り合った - ソラコムは、あなたの気が付かないうちに、少しずつ「次」へ進んでいる (2017/7/6)
ソラコムは、「トランスポート技術への非依存」度を高めている。当初はIoT用格安SIMというイメージもあったが、徐々に脱皮しようとしている。パブリッククラウドと同様、付加サービスでユーザーをつかんでいるからだ - Cisco SystemsのIntent-based Networkingは、どうネットワークエンジニアの仕事を変えるか (2017/7/4)
Cisco Systemsは2017年6月、同社イベントCisco Live 2017で、「THE NETWORK. INTUITIVE.」あるいは「Intent-based Networking」といった言葉を使い、ネットワークの構築・運用、そしてネットワークエンジニアの仕事を変えていくと説明した。これはどういうことなのだろうか - ifconfig 〜(IP)ネットワーク環境の確認/設定を行う (2017/7/3)
ifconfigは、LinuxやmacOSなど、主にUNIX系OSで用いるネットワーク環境の状態確認、設定のためのコマンドだ。IPアドレスやサブネットマスク、ブロードキャストアドレスなどの基本的な設定ができる他、イーサネットフレームの最大転送サイズ(MTU)の変更や、VLAN疑似デバイスの作成も可能だ。
|
|