見分け方
tcpdump出力から、パケットがTCPなのかUDPなのか見分ける。
TCP
TIMESTAMP IP SRC.PORT > DST.PORT: Flags [FLAGS], ...
UDP
TIMESTAMP IP SRC.PORT > DST.PORT: SIZE ...
DST.PORT:の後に"Flags"が来ればTCP、パケットサイズの数値が来ればUDPと理解すれば良い。(全部大文字の単語はそれぞれの出力で読み替える)
どんな時に役立つか
DNSのキャプチャ
DNSはUDPで問合せをすることが多いけれども、EDNS0(だっけ?)とかでUDPパケットサイズに収まりきらない応答をやりとりする時とか、ゾーン転送などでTCPを使用することがある。
どちらも同じポート53を使うので、キャプチャ出力を見て区別できないと見落とすことになるかも。
IP上のプロトコルを見たい時
IP上のプロトコル、ええとつまりUDP、TCP、あとなんか最近出てきているHTTPの新しい奴とか、VPN関係のパケットとか、そういうレベルでパケットを眺めたい時なんかには役立ちそうな気がしないでもない。
能書き
ある時DNSパケットのキャプチャをする必要が出てきた。古いネットワーク機器のキャッシュDNSサーバ機能が最近のどんな機能までカバーしているのか、簡単に確認したくなったのだ。
皆さんご存じの通り、DNSはTCPで通信する時も、UDPで通信する時もあるわけだけれども、大昔はUDPだけだと考えても概ね問題がない、そんな時代もあった。だから古いネットワーク機器がTCPで通信する気がないのかも、と思った次第。
tcpdump -n port 53
こんな感じのフィルタを書けば良いわけだけれども、これってTCPとUDPのどちらでもキャプチャするわけだよね。
そういった前提でキャプチャ結果表示を見て気がついた。
「これはTCPパケットなのか、UDPパケットなのかどこを見れば分かるんだ?」
いや、うん、そりゃまー、今でもUDPで通信するケースがずっと多いし、パケットサイズとか通信相手とかによってある程度TCPであるかどうか推測できるのかもしれない。それはそれで置いておいて、tcpdump出力のどこにTCPかUDPか書いてあるんだよ、という疑問を感じて調べたよ、という話。