イーサネット関係のヘッダ
追記
pythonのctypesで使う用のものもどうぞ。 ctypes用のネットワーク関係の構造体
旧サイトにおいてあったTCP/IP関連のヘッダ情報だよ。 整理するにあたってこっちに持ってきてみた。
ether header
struct ether_header {
u_char ether_dhost[ETHER_ADDR_LEN]; /* 宛先ホストのハードウェアアドレス */
u_char ether_shost[ETHER_ADDR_LEN]; /* 送信者のハードウェアアドレス */
u_short ether_type; /* ネットワーク層のプロトコル */
};
ARP header
struct ether_arp {
u_int16 arp_hrd; /* ハードウェアのタイプ(?) */
u_int16 arp_pro; /* プロトコルのタイプ。arp要求だの応答だの。 */
u_int8 arp_hln; /* ハードウェアアドレスの長さ。普通に考えて6しか入らないんじゃ。 */
u_int8 arp_pln /* プロトコルアドレスの長さ。IPアドレスしか入れないだろうし、4しか入れない気がする。 */
u_int8 arp_sha[6]; /* 送り主のハードウェアアドレス。Sourceらしい。 */
u_int32 arp_spa; /* 送り主のプロトコルアドレス。ちゅーかIPアドレス。 */
u_int8 arp_tha[6]; /* 受け取り手のハードウェアアドレス。Target。ちなみに、知らないときは0で埋める */
u_int32 arp_tpa; /* 受け取り手のプロトコルアドレス。 */
};
IP header
struct iphdr {
u_int version:4; /* バージョン。IPのバージョン(4)を入れればいいらしい */
u_int ihl:4; /* ヘッダの長さ。ヘッダって固定長じゃないの・・・? */
u_int8 tos; /* サービスタイプ。優先順位? でも0で固定らしい。 */
u_int16 tot_len; /* パケットの長さ。 */
u_int16 id; /* 送信されたパケットのカウント。分割されたデータの場合は、同じ値が入る。 */
u_int16 flag_off; /* 最初の1ビットが0で、2ビット目がデータを分割していいかどうかのフラグ。3ビット目は分割した最後のパケットなら0、そうじゃなきゃ1。
4ビット目以降は分割前のデータの何ビット目から始まるのか。よく分からん。 */
u_int8 ttl; /* 世に名高いTTL。通過できるルーターの数。 */
u_int8 protocol; /* トランスポート層のプロトコル。 */
u_int16 check; /* ヘッダが壊れていないかのチェックサム */
u_int32 saddr; /* 送信元のIPアドレス */
u_int32 daddr; /* 宛先のIPアドレス。Sourceは分かってもdってなんだdって。 */
};
versionの後:4というのは4ビットという意味。ちっちゃすぎるだろ・・・! つまり当然だけれど、versionとihlはエンディアンで入れ替わる。めんどくさすぎるよ。
ICMP header
struct icmp {
u_int8 icmp_type; /* そのまんま、タイプ。 */
u_int8 icmp_code; /* タイプ別で、フラグみたいなのが格納されるっぽい。トラブルの内容とか入れる。 */
u_int16 icmp_cksum; /* チェックサム。ヘッダどメッセージ色々をあわせて計算するらしい。 */
};