Seeds of contemplation.

「シーケンス番号」フィールド:32bit幅

 送信するデータ(バイト・データ)に対して、順序付けを行うための「シーケンス番号」を指定するフィールド。送信するデータ1byteごとに、シーケンス番号を1つずつ昇順に割り当て、どこまでデータを送信したかを指定する。このフィールドは32bit幅しかないので、2の32乗=4Gbytes分送信すると、また同じ番号に戻ってくる(ラップアラウンドする)ことになる。初期値は0とは限らず、ランダムな値がセットされる。このフィールドは常に有効である。

 シーケンス番号は、TCPデータの送信側で管理されており、データを送信するたびに、送信したデータのバイト数分だけシーケンス番号が加算され、TCPパケットに入れて送信される。データ部分の最初のバイト位置が、このシーケンス番号に一致する。例えばTCPデータとして10bytesのデータが格納されているとすると、データの先頭バイトがシーケンス番号「n」の位置に相当し、10bytes目はシーケンス番号「n+9」の位置に相当する。

「ACK番号」フィールド:32bit幅

 これは受信したデータに対して、どこのバイト位置までを受信したかを表すフィールドである。ACK(Acknowledge)は「承認」という意味。シーケンス番号と同様に32bit幅なので、4Gbytesごとにラップアラウンドすることになる。ACK番号は、データを受信した側が、どこまで受信したかを示すために、応答TCPパケットにセットして送信する。後述するACKフラグがオンの場合にのみ、このACK番号フィールドが有効となる。

 このフィールドは、受信したデータのシーケンス番号に対応しており、受信が完了したデータ位置のシーケンス番号+1を返すことになっている。例えば受信したTCPパケット中にデータが10bytes含まれているとすると、受信したパケットのシーケンス番号nに10を加えた「n+10」がACK番号として返される。これは、シーケンス番号「n」から「n+9」まではすべて受信が完了したという意味である。

0 ♥ / 3 months ago