TCPヘッダ その3

フォーマット

さて前々回、前回に引き続きTCPヘッダのフォーマットについてです。まずは、もう一度TCPヘッダのフォーマットを載せておきます。






フラグ

「フラグ」は1バイトの情報ですが、各ビットごとに意味があります。フラグの各ビットは次の通りです。





上位の2ビットは予約として0で固定です。そして、URGフラグは緊急データがあるときに1になります。
(緊急データって何?ということは詳しくは知りません・・・知っている人教えてください)

ACKフラグは確認応答のセグメントのときに1になります。
通常の通信を行っているときには必ずACKフラグは1です。ACKフラグが0になるのは、通信の本当の最初のときだけです。

PUSHフラグはバッファ内のデータを送信するというときに1になります。TELENETでは、コマンドの文字列をリモートのホストにその都度送信するため、バッファにためずに送っていきます。そのような場合にPUSHフラグが1になっています。

RSTフラグは
TCPのセッションを強制的に切断するときに1になります。強制的に切断するときとはシーケンス番号が狂ってしまったというときなどです。



3ウェイハンドシェイク

そのあとのSYNフラグがTCPのコネクション確立である「3ウェイハンドシェーク」に関係してきます。前回でも触れていますが、3ウェイハンドシェークを通じて、TCPセッションで利用していくことになるシーケンス番号とACK番号を決めていきます。3ウェイハンドシェークのイメージは次の図の通りです。





まず、最初の
Aから@の「接続してもいいですか?」というコネクションの要求はSYNフラグが1になっています。またACKフラグは0です。そしてシーケンス番号はランダムな値が設定され、ACK番号は0です。
そして、BはAからの要求にこたえてAのセグメントが送信されます。このときに同時にBからAに対してのコネクション要求を出していきます。
TCPは全2重通信を行います。そのために双方向のコネクションを確立します。このときは、SYNフラグが1、ACKフラグが1です。さらにシーケンス番号はランダムな値が設定され、ACK番号は@のセグメントのシーケンス番号に+1されます。
BからAに対してのコネクションの要求にこたえて、AからのセグメントBが送信されます。そのときの各フラグはSYNフラグは0、ACKフラグは1です。また
シーケンス番号はAのセグメントのACK番号が使われ、ACK番号はAのセグメントのシーケンス番号に+1したものになります。
この3段階のステップを経て、TCPではお互いの双方向のコネクションを確立します。そしてこの過程で決められた
シーケンス番号とACK番号をそれ以降のデータ通信で利用していきます。ちなみに最初にシーケンス番号をランダムにするのは、クラッカーによるセグメントの偽造を防止できるというメリットがあります。






セッションの切断

最後のFINフラグはコネクションを切断するときに使われます。TCPではコネクションの切断は4ステップで行われます。そのプロセスは次の通りです。




@のセグメントではそれまでのデータ通信で使っていたシーケンス番号とACK番号です。そしてFINフラグ、ACKフラグが1です。これによりBに切断要求を出しています。Bからは切断要求の確認とBからも切断を行うことをAのセグメントで通知します。シーケンス番号は@のセグメントのACK番号、ACK番号は@のセグメントのシーケンス番号に+1したものを使います。実際にはBがコネクションの切断を行い、Bのセグメントで切断が完了したことをFINフラグを1にして通知しています。それからAが確認をCのセグメントで返してきます。でも、もうすでにコネクションは切断されているので、本当はCのセグメントって意味がないんですけどね・・・








(C) Copyright 2000-2001 Gene All Right Reserved