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