イーサネット関係のヘッダ

2013-08-23 追記

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;  /* チェックサム。ヘッダどメッセージ色々をあわせて計算するらしい。 */
};