このページの本文へ

ネットワークがクイズでわかる! 誰が正解?「TCP/IP」 第3回

間違った回答に惑わされないで!

「スリーウェイハンドシェイク」の手順、わかっていますか?

2011年08月03日 09時00分更新

文● 遠藤 哲

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

クイズ「誰が正解?」の時間がやってきました。このクイズでは、ケンイチ君、いずみちゃん、竹田君の3人が私の質問に答えます。ただし、正解なのは1人だけですよ。クイズのテーマは「TCP/IP」、ネットワークの基本です。さてさて、誰が正解か当てられますか?


誰が正解?(間違いが2人いますので要注意!)

通信を制御するフラグ

 TCPはヘッダ情報に6つの「フラグ」と呼ばれる情報を持っている(図1)。このフラグはTCPが相手との通信を確実に行なうための制御情報で、通信手順のチェックや送信データの受信確認などに利用される。各フラグは1ビットの情報で、そのフラグの持つ意味を通知したい場合に“1”が設定され、そうでなければ“0”となる。

図1●TCPヘッダの要素とフラグフィールド

 まず「URG(Urgent)」フラグは、すぐ処理したい緊急データがあることを示すフラグだ。緊急データがある場合にURGフラグに「1」を設定するとともに、緊急ポインタに緊急データのサイズが設定される。

 2つ目の「ACK(Acknowledge)」フラグは、確認応答番号(以下ACK番号、38ページ参照)が有効であることを示すフラグである。TCPの通信が開始される際の最初のパケットは「0 」が設定されるが、その後は通信が終了するまで「1」が設定され、ヘッダ内に有効なACK番号が設定される。

 3つ目の「PSH(Push)」フラグは、受信したデータをすみやかに上位アプリケーションに引き渡すように要求するためのフラグである。おもに受信側の処理を促し応答性能を上げるために利用される。Telnetで文字を送信する際は、PSHに1が設定されている。

 4つ目の「RST(Reset)」フラグは、TCPコネクションを強制的に切断する(初期状態に戻す)場合に使用するフラグである。Webブラウザでファイルをダウンロード中に停止ボタンを押したり、Webブラウザそのものを終了させたりした場合に、RSTを1に設定したパケットが送信される。

 5つ目の「SYN(Synchronize )」フラグは、TCPのコネクションを確立するために使用するフラグである。詳しくは、以下で解説する。

 最後の「FIN(Finish)」フラグは、TCPコネクションを終了する正常な手続きの中で使われるフラグである。

TCPコネクションの確立

 ではここで、フラグをどのように使ってTCPコネクションを確立しているか、その手順について見てみよう。

 TCPで扱うヘッダとデータの全体を「TCPセグメント(以下セグメント)」と呼ぶ。TCPはデータの受け渡しを確実に行なうために、実データの送信に先立って「スリーウェイハンドシェイク」と呼ばれる通信手順によってTCPコネクションを確立する(図2)。

図2●スリーウェイハンドシェイクの手順

 クライアントからサーバに向けてWebやメールなどの通信を開始すると、TCPコネクションを確立するために3つのTCPセグメントがやりとりされる。これがスリーウェイハンドシェイクと呼ばれるゆえんである。この手順で使用されるTCPヘッダのフラグはSYNとACKである。どのように使っているか詳しく見てみよう。

 最初にクライアントからサーバへ送られるTCPセグメントのフラグにはSYNフラグが1に設定され、ACKは0が設定されている。このときのシーケンス番号が10000だったとする。意味合いとしては、「これからシーケンス番号10000を起点として通信を始めたい」という要求になる。

 その要求を受け取ったサーバは、クライアントからの通信開始要求を受け入れた証として、受信したシーケンス番号に1を加えて、その番号をACK番号に設定し、ACKフラグに1を設定する。ここまでで、クライアントからサーバへの方向については、正しくデータを受信したか確認できるようになる。

 しかし、サーバからクライアントへデータを送る場合に何番のシーケンス番号を起点とするかがまだ通知できていない。そこで、サーバからの応答にはさらにSYNフラグを設定し、初期シーケンス番号をクライアントに通知する。

 一方、クライアントは、SYNフラグとACKフラグに1が設定されたセグメントを受信する。ここでACK番号が、送ったシーケンス番号に1加算された番号であることを確認する。

 また、サーバから送られてきたシーケンス番号の初期値に1を加えてACK番号に設定し、ACKフラグに1を設定し、サーバへ応答する。この応答はサーバのSYNに対する応答の意味しかないので、SYNフラグは0が設定される。この3つ目のセグメントがサーバで受信されると、ACK番号が送ったシーケンス番号に1加算された番号であることを確認し、無事TCPコネクションが確立された状態となる。

 さて、ケンイチ君のいうCONフラグは実際には存在しないものなので誤りだ。また、いずみちゃんは、FINの定義が間違っている。FINはFinishの意味でTCPコネクションを切断するときに使われるフラグである。よって正解は竹田君である。

 本記事は、ネットワークマガジン2007年8月号の特集1『クイズでわかる 誰が正解?「TCP/IP」』を再編集したものです。内容は原則として掲載当時のものであり、現在とは異なる場合もあります。

カテゴリートップへ

この連載の記事