WireShark で TCP の SEQ とACK の番号を表示させる。

投稿日:2015年11月22日

TCPの通信では、データの送り手と受け手が、SEQ と ACK の交換をしながら確実にデータが相手に届いたか確認しながら、次のデータを送る。という作業を繰り返していきます。

SEQ番号 → データ送信元が受信先に送る番号。「xxxx バイト目から、1000 Byte のデータを送るよ」という時の開始の xxxxx を指す番号。
ACK番号 → データ受信先が送信元に送る番号。「yyyy バイトまでデータを受け取ったよ」という番号。

です。

WireShark の場合、デフォルトの表示画面にこの値が表示されません。これを表示させてみます。(以下、この記事作成時点での WireShark デフォルトのカラム)image

1) 適当なTCP パケットを選びます。

image

2) 画面下部に表示される「Transmission Control Protocl」のセクションを開いて、「Sequence number: xxxx  (relative sequence number) 」という部分を選択して右クリックします。

image

3) 「Apply as Column」を選択します。

image

4) 以下のようにカラムが増えているはずです。
image

このカラム追加の作業を他のデータに対しても行います。

「Acknowlegement number:xxxxx (relative ack number)」 と
「TCP segment Len: xxxx]

に対して同じ作業を行います。
まとめると下図のように全部で②の3つの項目をカラムとして追加する事になります。
image

5) 最終的に以下のように3つの列が増えているはずです。

image

列の順番は、マウスのドラッグで変更する事ができます。
ここでは、「TCP Segement Len」→「Sequence number」→「Acknowledgement number」の順番で入れ替えました。

image

ACK番号とSEQ番号の関係を WireShark上で見てみる。

せっかくなので、SEQ番号と ACK 番号がきちんと並んでいるか見てみます。
オレンジの枠で囲んだ所に注目します。

上3行は、「Source」→「Destination」の通信です。
image

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)

と3回立て続けに言っています。最終的に、4653 + 1460 Byte のデータを送っているはずです。

ここで4行目の通信は、向きが変わって「Destination」→「Source」への通信です。Ack番号(Acknowledgement number) は、6113 になっています。
ACK番号は、「6133 Byte受け取ったよ」という確認の通信を意味します。

「Source」→「Destination」の通信で最終的に送信したよ。と言っているのは、「4653 + 1460 Byte」です。
4653 + 1460 = 6133 なので、ACKの番号(受け取った Byte数)と同じで、きちんとつじつまが合っています。