シーケンス番号

読み:しーけんすばんごう / 英語表記:sequence number

TCPで送るデータの位置をバイト(オクテット)単位で区別する番号である。受信側がデータの順序を整え、重複を見分けるために使う。

イマシルちゃんの解説

TCPでは、長いデータをセグメントというまとまりに分けて送るんだ。
途中で届く順番が入れ替わっても、元の順序に戻せるようにしたいよね。
そこでデータの位置を示すのがシーケンス番号だよ。
まとまりの個数ではなく、バイト(オクテット)単位でデータに番号を付けるんだ。
接続後にデータを送るときは、そのまとまりの先頭のバイトの番号をヘッダーに入れるよ。
受信側は番号とデータの長さを見れば、どの部分が届いたかや重複しているかを判断できるの。
届いた順番ではなく元の位置で扱うための目印なんだ。

より深い解説

定義

シーケンス番号(Sequence Number)は、TCPヘッダーにある32ビットのフィールドで、そのセグメントに含まれるデータの先頭のバイトが、送信するデータの流れ(バイトストリーム)全体のどの位置にあたるかを示す。TCPは、データをセグメントの単位ではなく、バイトの単位で番号付けしている。

番号の進み方

次のシーケンス番号 = 今のシーケンス番号 + 今のセグメントのデータのオクテット数

例:シーケンス番号1001から、1セグメントに500バイトずつ送る場合

セグメントシーケンス番号データ含まれるバイトの位置
1つ目1001500バイト1001~1500
2つ目1501500バイト1501~2000
3つ目2001300バイト2001~2300

受信側から応答を待たずに続けて送る場合も、番号は同じ規則で進む。セグメントの数ではなく、送ったデータの量だけ増えるので、「1ずつ増える」わけではない。

初期シーケンス番号(ISN)

シーケンス番号は0から始まるのではなく、コネクションの確立時に決める初期シーケンス番号(ISN:Initial Sequence Number)から始まる。ISNは、3ウェイハンドシェイクのSYNのセグメントで相手に伝える。

番号の一周

シーケンス番号は32ビットなので、最大値は2^32 − 1(4,294,967,295)である。最大値を超えると0に戻り、そのまま番号付けを続ける。最大値が65,535なのは、16ビットのフィールドであるポート番号やウィンドウサイズのほうである。

高速な回線では、32ビットの番号が短時間で一周してしまい、古いセグメントと新しいセグメントの番号が重なる恐れがある。これを防ぐため、タイムスタンプオプションを使ったPAWS(Protection Against Wrapped Sequence numbers)という仕組みがある。

確認応答番号との関係

受信側は、データを受け取ると、「次に受け取りたいバイトのシーケンス番号」を確認応答番号として返す。

確認応答番号 = 受け取ったシーケンス番号 + 受け取ったデータのオクテット数

受信側が返す確認応答番号は、受け取ったシーケンス番号そのものではなく、その次の番号である。送信側は、確認応答番号より前のデータが届いたと判断できる。

双方向の番号

TCPは全二重の通信なので、AからBへのデータと、BからAへのデータには、それぞれ独立したシーケンス番号が使われる。1つのセグメントの中で、シーケンス番号は自分が送るデータの位置を、確認応答番号は相手から受け取ったデータの位置を表す。両者は別の番号の系列なので、大小を比べることには意味がない。

実際の試験ではここに出る!全3問

ネットワークスペシャリスト

午前Ⅱ

この用語が出てくる記事

↑