趣味のネットワークの勉強で、
cのプログラムによるパケットキャプチャをしてみたときのこと。
ためしにgoogleへのアクセスをキャプチャしてみた。
==== 74 バイトのパケットを取得しました ====
[[ 第2層:: イーサネットヘッダ ]]
[ 送信元: 00:08:ca:ce:17:f5 宛先: 00:19:c8:01:9a:ce タイプ: 8 ]
(( 第3層::: IPヘッダ ))
( 送信元: 192.168.1.103 宛先: 173.194.117.186 )
( タイプ: 6 ID: 60408 長さ: 60 )
{{ 第4層:::: TCPヘッダ }}
{ 送信元ポート: 47876 宛先ポート: 443 }
{ Seq #: 2914304096 Ack #: 0 }
{ ヘッダサイズ: 40 フラグ: SYN }
パケットデータがありません
==== 66 バイトのパケットを取得しました ====
[[ 第2層:: イーサネットヘッダ ]]
[ 送信元: 00:19:c8:01:9a:ce 宛先: 00:08:ca:ce:17:f5 タイプ: 8 ]
(( 第3層::: IPヘッダ ))
( 送信元: 173.194.117.179 宛先: 192.168.1.103 )
( タイプ: 6 ID: 35451 長さ: 52 )
{{ 第4層:::: TCPヘッダ }}
{ 送信元ポート: 443 宛先ポート: 51184 }
{ Seq #: 4233367971 Ack #: 151997378 }
{ ヘッダサイズ: 32 フラグ: ACK }
パケットデータがありません
==== 74 バイトのパケットを取得しました ====
[[ 第2層:: イーサネットヘッダ ]]
[ 送信元: 00:19:c8:01:9a:ce 宛先: 00:08:ca:ce:17:f5 タイプ: 8 ]
(( 第3層::: IPヘッダ ))
( 送信元: 173.194.117.186 宛先: 192.168.1.103 )
( タイプ: 6 ID: 33920 長さ: 60 )
{{ 第4層:::: TCPヘッダ }}
{ 送信元ポート: 443 宛先ポート: 47876 }
{ Seq #: 1822618758 Ack #: 2914304097 }
{ ヘッダサイズ: 40 フラグ: SYN ACK }
パケットデータがありません
==== 107 バイトのパケットを取得しました ====
[[ 第2層:: イーサネットヘッダ ]]
[ 送信元: 00:08:ca:ce:17:f5 宛先: 00:19:c8:01:9a:ce タイプ: 8 ]
(( 第3層::: IPヘッダ ))
( 送信元: 192.168.1.103 宛先: 173.194.117.186 )
( タイプ: 6 ID: 60425 長さ: 93 )
{{ 第4層:::: TCPヘッダ }}
{ 送信元ポート: 47876 宛先ポート: 443 }
{ Seq #: 2914306210 Ack #: 1822619939 }
{ ヘッダサイズ: 32 フラグ: PUSH ACK } ★←これ!★
41 バイトのパケットデータ
17 03 03 00 24 00 00 00 00 00 00 00 07 20 30 ae | ….$…….. 0.
1e 34 9c 42 a6 03 31 81 66 aa 82 ee 2a f4 f2 ec | .4.B..1.f…*…
cd d7 d0 5e e9 a4 da 1c c2 | …^…..
==== 66 バイトのパケットを取得しました ====
はじめの”SIN”,”SIN ACK”,”ACK”は3way handshakeで、
その後の”ACK PUSH”というものを見つけた。
調べてみたら”PUSH”フラグはすぐに相手のサーバにの
アプリケーションにパケットを渡して欲しい時に使うフラグらしい。
http://en.wikipedia.org/wiki/Transmission_Control_Protocol
“PSH (1 bit) – Push function. Asks to push the buffered data to the receiving application.”
他のサイトへのリクエストには”PUSH”はついていなかったし、
こちらからのリクエストに”PUSH”をつけるようにどうやって制御してるんだろ。