//以太网协议格式的定义
struct ether_header
{
u_int8_t ether_dhost[6]; //目的以太网地址
u_int8_t ether_shost[6]; //源以太网地址
u_int16_t ether_type; //以太网类型
};
//ARP协议格式的定义
struct arp_header
{
u_int16_t arp_hardware_type; //硬件类型
u_int16_t arp_protocol_type; //协议类型
u_int8_t arp_hardware_length; //硬件地址长度
u_int8_t arp_protocol_length; //协议地址长度
u_int16_t arp_operation_code; //ARP操作码
u_int8_t arp_source_ethernet_address[6]; //源以太网地址
u_int8_t arp_source_ip_address[4]; //源IP地址
u_int8_t arp_destination_ethernet_address[6]; //目的以太网地址
u_int8_t arp_destination_ip_address[4]; //目的IP地址
};
//IP地址格式的定义
typedef u_int32_t in_addr_;
struct in_addr_t
{
in_addr_ s_addr;
};
//IP协议格式的定义
struct ip_header
{
u_int8_t ip_header_lengtg:4; //版本
u_int8_t ip_version:4; //首部长度
u_int8_t ip_tos; //服务质量
u_int16_t ip_length; //总长度
u_int16_t ip_id; //标识
u_int16_t ip_off; //偏移
u_int8_t ip_ttl; //生存时间
u_int8_t ip_protocol; //协议类型
u_int16_t ip_checksum; //校验和
struct in_addr_t ip_source_address; //源IP地址
struct in_addr_t ip_detination_address; //目的IP地址
};
//UDP协议格式的定义
struct udp_header
{
u_int16_t udp_source_port; //源端口号
u_int16_t udp_destination_port; //目的端口号
u_int16_t udp_length; //长度
u_int16_t udp_checksum; //校验和
};
//TCP协议格式的定义
struct tcp_header
{
u_int16_t tcp_source_port; //源端口号
u_int16_t tcp_destination_port; //目的端口号
u_int32_t tcp_acknowledgement; //序列号
u_int32_t tcp_ack; //确认码
u_int8_t tcp_reserved:4; //保留
u_int8_t tcp_offset:4; //偏移
u_int8_t tcp_flags; //标记
u_int16_t tcp_windows; //窗口大小
u_int16_t tcp_checksum; //校验和
u_int16_t tcp_urgent_pointer; //紧急指针
};
//ICMP协议格式的定义
struct icmp_header
{
u_int8_t icmp_type; //ICMP类型
u_int8_t icmp_code; //ICMP代码
u_int16_t icmp_checksum; //校验和
u_int16_t icmp_id; //标识
u_int16_t icmp_sequence; //序列号
};
对于网络部分的学习:
先看 嵌入式Linux应用程序开发详解 中的网络部分说明并练习编译其中的代码
然后 Linux网络编程 和 Unix网络编程实用技术与实例分析;张炯;清华大学出版社 这两部分内容有点相似
如果要掌握各个协议的报文类型 可以参考 TCP-IP详解卷1:协议
然后看一下 tcpdump 的源代码