連載第6回
|
|
フツーの通信の様子を見よう |
ここでは、http://www.atmarkit.co.jp/top/mainlogo.gifにある画像(図1)を読み出すときの様子を、この解説で利用している同じマシンのEtherealでキャプチャしました。画像のサイズは2757バイトです。キャプチャしたときの画面は画面1のとおりです。
図1 AtmarkITトップページのロゴ。サイズは2,757バイト |
この画面は、データのやりとりを表すものですが、おそらくこの画面だけでは、やりとりをつかみにくいと思います。そこで、ここでは表示内容をExcelで少し整理してみました。
画面1 ロゴ画像のダウンロードをモニタした様子 |
ちなみに、この整理はEtherealの画面を見ながら行ってもいいのですが、ちょっと大変な場合は、キャプチャした内容をテキストファイルに書き出して、それをExcelに読み込んでデータのやりとりを見やすい表の形にすると少し楽になります。キャプチャしたデータをテキストで書き出すには、Etherealの「File」メニューの「Export」を使います。
この方式で書き出したテキストファイルは図2のようになります。ここでは、図で背景を薄いオレンジ色にした部分を抜き出しました。
図2 Etherealのテキスト出力の一部 |
表1がその結果です。Etherealの結果は、A>B(AからBに向けた通信)、B<A(BからAに向けた通信)のように、通信の方向と受信した内容が表示されています。それだとちょっと分かりにくいので、ここでは通信の方向に合わせて、自マシンを右に、接続したWebサーバを左に分けて、やりとりのイメージがわきやすいように並べました。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
表1 ロゴデータのやりとりを表にしたもの(クリックすると拡大、さらに詳細な情報を表示します) |
#はやりとりしたパケットの番号、timeは自マシンがパケットを受信した時間、flgは[ACK]など特別な機能を表します。またSeqはシーケンス番号、Ackは肯定確認応答番号、Winはウィンドウサイズ、Lenはデータの長さ、MSS(Maximum Segment Size)は最小セグメントサイズを表しています。ちなみにMSSは、トラックの例でいうとトラックの最大積載量に相当するものです。また備考には、上位プロトコルの情報などを書いています。
#1〜#3ではお互いに[SYN]と[ACK]を送り合っています。これは第1回「TCPの迷宮をさまよってみませんか?」●TCPのキホンのキホンで説明したもので、3ウェイハンドシェークと呼ばれる動作です。この動作で、お互いに通信の開始を確認し合います。
このときお互いに送り合っているMSSは、一度に送れるデータのサイズを表します。本連載のいい方をすれば「トラックに一度に積めるりんごの数」ということになります。これを最初にお互いに知らせ合っておくわけです。
WebブラウザがWebサーバに画像を送るように出しているリクエストは、#4で送っています。ちなみに備考のコマンド内容「GET /top/mainlogo.gif HTTP/1.1」は、コマンドの冒頭を抜き出したものです。送出した全コマンドを見たい場合には、Ethereal画面でそのデータを選択してください。画面2のようにコマンドを見ることができます。
画面2 httpコマンドをEtherealで見る |
また#4への[ACK]を示しているのが#5です。この[ACK]のAck欄に書かれている数値「449」は、次に受信したい情報の番号です。肯定確認応答[ACK]で、次に送ってほしい番号を送ることは、第5回「それでも不正確なデータを受け取ったらどうするの?」●送信データが消えてしまうケースを追うで説明していますので、参照してください。
なお、この数値は1バイトを送るたびに1ずつ増えるようになっています。#4で、シーケンス番号1から始まる、448バイトのデータを送ったところ、#5で送られた[ACK]では、Ackの値が449になっていて、次のデータとして449バイト目から送るよう要求していることが図から読み取れます。
Webサーバからの画像のデータは、#6、#7、#9で送信しています。ここでまず注目する点は、データが3つに分割されていることです。画像のファイルサイズは2757バイトですが、WebサーバがHTTPに関連する情報を加えるので、送り返されるデータはこれより多くなります。しかしトラックのサイズ(MSS)は1414バイトですから、1414バイトずつ、3回に分けて送信されているわけです。
ここで面白いのは、#6と#7は、[ACK]を受信することなく、連続して送信している点です。これは通信の効率を上げるためのTCPの特徴です。[ACK]を受信しなくてもなぜ大丈夫なのかは、第2回「ITオンチにTCPのセボネを見る」●「ひとまとめ」と「連続送り」を図で説明してくださいで説明していますので、参照してください。
ところで、#6、#7と2つのデータを受信しておきながら、Webブラウザは#8の[ACK]を1つだけしか送っていません。これはどうしてでしょうか。この謎を解く鍵は、#8のAckの値が2829になっている点にあります。
#8の[ACK]の値が2829になっているということは、次のシーケンス番号として2829をリクエストしている、ということです。#6でWebサーバが送出したデータは1414バイト、#7でも同じく1414バイトですから、2829バイト目をリクエストするこの[ACK]は、#7に対する[ACK]ということになります。
では#6に対する[ACK]は送らなくてもよいのでしょうか? そう、送らなくても大丈夫です。その理由は、第5回「それでも不正確なデータを受け取ったらどうするの?」●肯定確認応答が届かないケースを追うに書いてあります。TCPは、途中の[ACK]が到着しなくても、最後のデータに対する[ACK]が受信できれば、そこまではすべてOKと見なします。ここではその特性を積極的に利用して、わざと途中の[ACK]を省略し、最後の[ACK]だけを送ることで、通信効率を上げているわけです。こういった細かいテクニックは実にニクイばかりです。
なお、#9で受信したデータに対する[ACK]は、#10で[FIN]と一緒に送られています。このことは、Ack欄の値が3146になっていることから読み取れます。#9で、シーケンス番号2829で始まる317バイトのデータを受信したので、その次のデータは3146になるわけです。
#10〜#12では、お互いに通信の終わりを表す[FIN]を送り合って通信を終わっています。それぞれが[FIN]を送り合うのは、[SYN]の場合と同じように、相互に通信を終える手順を踏むルールになっているためです。
道具の準備と使い方 |
|
関連リンク | |
連載: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疑似デバイスの作成も可能だ。
|
|