今日のネットワーク。

へぇ〜!ってなることがありましてね。はい。

とあるサイトから Pythonでパケットキャプチャ作る!みたいな?あ?うん。

で、ソースの途中で

ETH_P_IP = 0x800
s = socket(PF_PACKET, SOCK_RAW, ETH_P_IP)
s.bind(("eth1", ETH_P_IP))

ってあったので、
ぱーっと写してました。

しかし…この何事にも興味津々な僕からしたら、
この ETH_P_IP がなんだかわかりません。
で!僕のネットワークの師匠に聞いたら、

師匠:socketはそのままシステムコールになってるんで、0x800のフラグを渡すとカーネルでフィルタしてくれるってことです

僕:え?全く意味がわからないw

師匠: #define ETH_P_IP 0x800 と定義されてるってことです
PF_PACKETもそういう風に定義された定数ですよね
それで、カーネルがその定数を見て、適切に動くようにプログラムされてるってことなんですが
socketシステムコールを呼ぶと、カーネルがソケットを作って返してくれるわけです
PF_PACKETやETH_P_IPは、そのソケットを作るときに渡すオプションみたいなものですね


俺:泣きそう…_:(´ཀ`」 ∠):_


師匠:/usr/include/linux/if_ether.h に定義されているんですが
ほかにも、ETH_P_ALL で全部のパケットとか
ETH_P_ARPでARPパケットだけとか
キャプチャするときに受け取るパケットの種類を選べるようになってるということです
socket(PF_PACKET, SOCK_RAW, ETH_P_ARP) とやれば、ARPパケットだけキャプチャできます
という話で分かります??

ここで僕はよーやく理解出来ましたww✌(๑˃̶͈̀◡˂̶͈́๑)✌ww

if_ether.h
0015 /* Mobitex (kaz@cafe.net) */
#define ETH_P_CONTROL 0x0016 /* Card specific control frames */
#define ETH_P_IRDA 0x0017 /* Linux-IrDA */
#define ETH_P_ECONET 0x0018 /* Acorn Econet */
#define ETH_P_HDLC 0x0019 /* HDLC frames */
#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */
#define ETH_P_DSA 0x001B /* Distributed Switch Arch. */
#define ETH_P_TRAILER 0x001C /* Trailer switch tagging */
#define ETH_P_PHONET 0x00F5 /* Nokia Phonet frames */
#define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frame */


一部ですが、こんな感じになってる!

ふぇえぇ!!どんだけ師匠わかりやすいんだよ!!やばいよ!!