CubicLouve

Spring_MTの技術ブログ

TCP 3-way handshakeの復習

3 way handshakeのおさらい

tcpdump の見方を勉強を見ながら自分でもやってみた。

ほとんど、上記のブログのままやってます。

clientとserverはこちらを使っています。

SpringMT/socket_test · GitHub

コネクション開始

1. SYN

クライアントからSYNを送る

時刻(HH:MM:SS.マイクロ秒) 送信元 > 送信先 Flags: フラグ seq: シーケンス番号 ack: ACK 番号 win: ウィンドウサイズ options: TCPのオプション lengh: 送信バイト数
15:59:33.795719 localhost.58710 > localhost.italk S(SYN(コネクション確立要求)) 2814860088 なし 65535 mss 16344,nop,wscale 4,nop,nop,TS val 927136454 ecr 0,sackOK,eol 0
15:59:33.795719 IP localhost.58710 > localhost.italk: Flags [S], seq 2814860088, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 927136454 ecr 0,sackOK,eol], length 0

2. SYN/ACK

サーバーからSYN + ACKを送る

時刻(HH:MM:SS.マイクロ秒) 送信元 > 送信先 Flags: フラグ seq: シーケンス番号 ack: ACK 番号 win: ウィンドウサイズ options: TCPのオプション lengh: 送信バイト数
15:59:33.795801 IP localhost.italk > localhost.58710 S.(SYN + ACK (接続許可)) 1552828466 2814860089(1のseq + 1) 65535 mss 16344,nop,wscale 4,nop,nop,TS val 927136454 ecr 927136454,sackOK,eol 0
15:59:33.795801 IP localhost.italk > localhost.58710: Flags [S.], seq 1552828466, ack 2814860089, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 927136454 ecr 927136454,sackOK,eol], length 0

3. ACK

クライアントからのACK

時刻(HH:MM:SS.マイクロ秒) 送信元 > 送信先 Flags: フラグ seq: シーケンス番号 ack: ACK 番号 win: ウィンドウサイズ options: TCPのオプション lengh: 送信バイト数
15:59:33.795801 localhost.58710 > localhost.italk . なし 1(本当は2のseq(1552828466) +1 tcpdumpの-Sオプションでfullの数字になる ) 9186 nop,nop,TS val 927136454 ecr 927136454 0
15:59:33.795814 IP localhost.58710 > localhost.italk: Flags [.], ack 1, win 9186, options [nop,nop,TS val 927136454 ecr 927136454], length 0

コネクションクローズ

1. クライアントがFIN + ACK送る

時刻(HH:MM:SS.マイクロ秒) 送信元 > 送信先 Flags: フラグ seq: シーケンス番号 ack: ACK 番号 win: ウィンドウサイズ options: TCPのオプション lengh: 送信バイト数
17:22:03.845002 IP localhost.61206 > localhost.italk F. 1 6 9186 nop,nop,TS val 932053925 ecr 932053925 0
17:22:03.845002 IP localhost.61206 > localhost.italk: Flags [F.], seq 1, ack 6, win 9186, options [nop,nop,TS val 932053925 ecr 932053925], length 0

2. サーバーがFIN + ACK返す

時刻(HH:MM:SS.マイクロ秒) 送信元 > 送信先 Flags: フラグ seq: シーケンス番号 ack: ACK 番号 win: ウィンドウサイズ options: TCPのオプション lengh: 送信バイト数
17:22:03.845253 IP localhost.italk > localhost.61206 F. 6(1の時のack番号) 2(1の時のseq + 1) 9186 nop,nop,TS val 932053925 ecr 932053925 0
17:22:03.845253 IP localhost.italk > localhost.61206: Flags [F.], seq 6, ack 2, win 9186, options [nop,nop,TS val 932053925 ecr 932053925], length 0

3. クライアントがFINに対するACK返す

時刻(HH:MM:SS.マイクロ秒) 送信元 > 送信先 Flags: フラグ seq: シーケンス番号 ack: ACK 番号 win: ウィンドウサイズ options: TCPのオプション lengh: 送信バイト数
17:22:03.845277 IP localhost.61206 > localhost.italk . なし 7(2の時のseq + 1) 9186 nop,nop,TS val 932053925 ecr 932053925 0
17:22:03.845277 IP localhost.61206 > localhost.italk: Flags [.], ack 7, win 9186, options [nop,nop,TS val 932053925 ecr 932053925], length 0

その他

Flagsの定義

Flags are some combination of S (SYN), F (FIN), P (PUSH), R  (RST), U (URG), W (ECN CWR), E (ECN-Echo) or `.' (ACK), or `none' if no flags are set.

なので、S.はSYN + ACK .はACKのみ

TCPのオプション

  • mss : 最大セグメント長 Max-segment-size
  • wscale : ウィンドウスケール
  • sackOK : Selective Acknowledgmentが有効
  • TS val ecr : valはタイムスタンプ ecrはecho reply 参照 rfc7323
  • nop : パディング No operation provides padding around other options
  • eol : オプションリストの終わり

参考文献

2.6 Examining tcpdump Output

sackOK? - 酔いどれコード

TSOPT ‐ 通信用語の基礎知識

基礎から学ぶWindowsネットワーク:第16回 信頼性のある通信を実現するTCPプロトコル(3) (1/4) - @IT

ソケットインターフェースと3-way handshake - niwaka diary

Geekなぺーじ:TCPを使う