趣味のネットワークの勉強で、

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”をつけるようにどうやって制御してるんだろ。