質問: tcpの3ウェイハンドシェイクをtcpdumpでキャプチャして見たところ、以下のようになりました。この3回目について質問させてください。2行目でシーケンス番号:325204391が送られているので、3行目では、1プラスされた、確認応答番号:325204392が記載される事を想定していましたが、"ack 1"と記載されています。 ・2行目のackは確認応答番号を示していて、3行目のackはackフラグを表しているのでしょうか? ・3行目に確認応答番号は、記載されない仕様なのでしょうか? どなたか詳しい方、教えてください。何か勘違いしているところがあれば、遠慮なくご指摘ください。 20:44:04.934769 IP 192.168.99.1.57535 > 192.168.99.101.http: Flags [S], seq 3819275350, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 977264774 ecr 0,sackOK,eol], length 0 20:44:04.934823 IP 192.168.99.101.http > 192.168.99.1.57535: Flags [S.], seq 325204391, ack 3819275351, win 28960, options [mss 1460,sackOK,TS val 37968152 ecr 977264774,nop,wscale 7], length 0 20:44:04.934996 IP 192.168.99.1.57535 > 192.168.99.101.http: Flags [.], ack 1, win 4117, options [nop,nop,TS val 977264774 ecr 37968152], length 0 ・オペレーテングシステム ホスト:Red Hat Enterprise Linux Server release 7.3 (Maipo) クライアント:macOS
回答: 3行目の`ack 1`は、2行目の`seq 325204391`に1をプラスしたもの、つまり`seq 325204392` を意味しています。 tcpdump はTCPの3ウェイハンドシェイク冒頭の SYN とこれに続く SYN+ACK についてのみ実際のシーケンス番号とACK番号を表示しますが、この後に続くACKやユーザーデータを含むパケットについては、データのバイト数とACKしたバイト数として理解しやすいように、このように表記されます。 ご参考になれば。