地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

network関連のパケット構造体

パケット

ネットワーク関連のパケットの構造体

ether header

Ethernetのフレーム構造 Ethernetでは、ケーブルを流れる信号を「フレーム」と呼ぶ

include/uapi/linux/if_ether.h

 struct ethhdr {
     unsigned char   h_dest[ETH_ALEN];   /* destination eth addr */
     unsigned char   h_source[ETH_ALEN]; /* source ether addr    */
     __be16      h_proto;        /* packet type ID field */
 } __attribute__((packed));

ヘッダの概要は下記参照。

概要 サイズ 説明
プリアンブル 7byte タイミングを取るための固定ビット列
SFD 1byte タイミング用。
次のビットからデータが開始されるよ的な。
宛先MAC 6byte 通信先の機器を識別する為の番号
送信元MAC 6byte 通信元の機器を識別する為の番号
Etherタイプ 2byte 上位のプロトコルを表す値。
但し1500以下だったらデータサイズを表す
データ 可変 カプセル化した中身のデータ
FCS 2byte 受け取り側でエラーが発生してないかをチェックする用

ip header

IPヘッダ

include/uapi/linux/ip.h

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8    ihl:4,
        version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
    __u8    version:4,
        ihl:4;
#else
#error  "Please fix <asm/byteorder.h>"
#endif
    __u8    tos;
    __be16  tot_len;
    __be16  id;
    __be16  frag_off;
    __u8    ttl;
    __u8    protocol;
    __sum16 check;
    __be32  saddr;
    __be32  daddr;
    /*The options start here. */
};

tcp header

include/uapi/linux/tcp.h

struct tcphdr {
    __be16  source;
    __be16  dest;
    __be32  seq;
    __be32  ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u16   res1:4,
        doff:4,
        fin:1,
        syn:1,
        rst:1,
        psh:1,
        ack:1,
        urg:1,
        ece:1,
        cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
    __u16   doff:4,
        res1:4,
        cwr:1,
        ece:1,
        urg:1,
        ack:1,
        psh:1,
        rst:1,
        syn:1,
        fin:1;
#else
#error  "Adjust your <asm/byteorder.h> defines"
#endif

udp header

include/uapi/linux/udp.h

struct udphdr {
    __be16  source;
    __be16  dest;
    __be16  len;
    __sum16 check;
};