TCPヘッダ その3

TCPヘッダフォーマット

さて前々回、前回に引き続き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からの要求にこたえて②のセグメントが送信されます。このときに同時にBからAに対してのコネクション要求を出していきます。TCPは全2重通信を行います。そのために双方向のコネクションを確立します。このときは、SYNフラグが1、ACKフラグが1です。さらにシーケンス番号はランダムな値が設定され、ACK番号は①のセグメントのシーケンス番号に+1されます。

BからAに対してのコネクションの要求にこたえて、Aからのセグメント③が送信されます。そのときの各フラグはSYNフラグは0、ACKフラグは1です。またシーケンス番号は②のセグメントのACK番号が使われ、ACK番号は②のセグメントのシーケンス番号に+1したものになります。

この3段階のステップを経て、TCPではお互いの双方向のコネクションを確立します。そしてこの過程で決められたシーケンス番号とACK番号をそれ以降のデータ通信で利用していきます。ちなみに最初にシーケンス番号をランダムにするのは、クラッカーによるセグメントの偽造を防止できるというメリットがあります。

セッションの切断

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA