パケット
ネットワーク関連のパケットの構造体
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
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
struct udphdr {
__be16 source;
__be16 dest;
__be16 len;
__sum16 check;
};