TCPヘッダ その2
目次
TCPヘッダフォーマット
さて、今回もTCPヘッダについて見ていきます。もう一度、TCPヘッダのフォーマットを載せておきます。
シーケンス番号、ACK番号
TCPはコネクション型のプロトコルです。コネクション型プロトコルの特徴は、データを転送する前にまずコネクションを確立していくことです。さらに、データ転送のときには確認応答(ACK)を返し、順序制御を行っています。
TCPヘッダのうち、「シーケンス番号」と「ACK番号」はコネクションの確立、各TCPセグメントの順序制御に使われます。コネクションの確立にはあとに続いている「フラグ」も関わってきます。今回は、順序制御について見ていくことにします。
まずシーケンス番号はセグメントの順番です。そしてACK番号は次に送られるのを期待するセグメントのシーケンス番号です。
具体的には、シーケンス番号を100で10バイトのデータを送ります。すると受信した側は次は110から送ってもらえればいいので、ACK番号が110で返されます。100から10バイト分を無事に受け取ったので、次は110から送ってね!という感じです。
さらに、エラー制御もシーケンス番号とACK番号で行っています。データが途中の経路でなくなってしまった場合は、受信側に届かないので、もちろんACKが返ってきません。送信元はデータを送ると、タイマーをスタートさせてそのタイマー内にACKが返ってこないとエラーとみなして再送します。
またデータは送信先に届いても、エラーチェックをしたときにエラーがあった!という場合はACKを返しません。すると送信元には結局タイマー時間内にACKが返ってこないのでエラーとみなして再送します。
なお、このタイマーはネットワークの状況によって送信元のコンピュータが動的に決定していきます。
では、シーケンス番号は 0 からはじまるのか?
というとそうではありません。シーケンス番号が何番からはじまるのかということはコネクションを確立するときに決められてきます。TCPではコネクションの確立を「3ウェイハンドシェイク」と呼んでいますが、その過程で今後使っていくシーケンス番号とACK番号を決めていきます。
3ウェイハンドシェイクについては次回に触れていきます。
データオフセット、予約
続いて、「データオフセット」です。これは回りくどい言い方をしていますが、実際のデータの始まりが先頭からどれぐらいか?ということを示します。つまり、早い話がヘッダの長さです。
そして、あとの「予約」の部分は使われていなく、値は0です。