TCPの通信では、データの送り手と受け手が、SEQ と ACK の交換をしながら確実にデータが相手に届いたか確認しながら、次のデータを送る。という作業を繰り返していきます。
SEQ番号 → データ送信元が受信先に送る番号。「xxxx バイト目から、1000 Byte のデータを送るよ」という時の開始の xxxxx を指す番号。
ACK番号 → データ受信先が送信元に送る番号。「yyyy バイトまでデータを受け取ったよ」という番号。
です。
WireShark の場合、デフォルトの表示画面にこの値が表示されません。これを表示させてみます。(以下、この記事作成時点での WireShark デフォルトのカラム)
1) 適当なTCP パケットを選びます。
2) 画面下部に表示される「Transmission Control Protocl」のセクションを開いて、「Sequence number: xxxx (relative sequence number) 」という部分を選択して右クリックします。
3) 「Apply as Column」を選択します。
このカラム追加の作業を他のデータに対しても行います。
「Acknowlegement number:xxxxx (relative ack number)」 と
「TCP segment Len: xxxx]
に対して同じ作業を行います。
まとめると下図のように全部で②の3つの項目をカラムとして追加する事になります。
5) 最終的に以下のように3つの列が増えているはずです。
列の順番は、マウスのドラッグで変更する事ができます。
ここでは、「TCP Segement Len」→「Sequence number」→「Acknowledgement number」の順番で入れ替えました。
ACK番号とSEQ番号の関係を WireShark上で見てみる。
せっかくなので、SEQ番号と ACK 番号がきちんと並んでいるか見てみます。
オレンジの枠で囲んだ所 (全部で4行) に注目します。
まずはじめの3行について見て行きます。はじめの3行は、「Source」→「Destination」の通信です。
Length の所を見るとわかるように、この3つのパケットのデータ部分のサイズ( TCP Segment Len) は、全て 1460 Byte というサイズです。
上の3つのパケットのSEQ番号(Sequence Number) の数字の番号は、1733、3193、4653 です。つまり、
「1733Byteから 1460 Byte送るよ」
「3193Byteから 1460 Byte 送るよ」 (※ 3193 = 1733 + 1460)
「4653Byteから 1460 Byte 送るよ」 (※ 4653 = 3193 + 1460)
と、「Source」から「Destination」に向けて 3回立て続けに言っています。最終的に、4653 + 1460 Byte のデータを送っているはずです。
ここで4行目の通信は、向きが変わって「Destination」→「Source」への通信です。Ack番号(Acknowledgement number) は、6113 になっています。
ACK番号は、「6133 Byte受け取ったよ」という確認の通信を意味します。
「Source」→「Destination」の通信で最終的に送信したよ。と言っているのは、「4653 + 1460 Byte」です。
4653 + 1460 = 6133 なので、ACKの番号(受け取った Byte数)と同じで、きちんとつじつまが合っています。