BlankTar

about | blog | works | photo

追記: 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;    /* チェックサム。ヘッダどメッセージ色々をあわせて計算するらしい。 */
};
< pythonのwhooshで全文検索してみる メモリの中身と実行ファイル >