常见协议头结构体定义
  48HTyjGrRLH9 2023年11月02日 114 0


环境说明:

Intel 小端存储

Linux Ubuntu-Server 2.6.38-8-generic-pae #42-Ubuntu SMP Mon Apr 11 05:17:09 UTC 2011 i686 i686 i386 GNU/Linux


● Ethernet header

#include	<net/ethernet.h>
/* This is a name for the 48 bit ethernet address available on many
   systems.  */
struct ether_addr
{
	u_int8_t ether_addr_octet[ETH_ALEN];
};

/* 10Mb/s ethernet header */
struct ether_header
{
	u_int8_t  ether_dhost[ETH_ALEN];	/* destination eth addr	*/
	u_int8_t  ether_shost[ETH_ALEN];	/* source ether addr	*/
	u_int16_t ether_type;		        /* packet type ID field	*/
};


● ARP

#include	<net/if_arp.h>
struct arphdr
{
	unsigned short int ar_hrd;		/* Format of hardware address.  */
	unsigned short int ar_pro;		/* Format of protocol address.  */
	unsigned char ar_hln;		/* Length of hardware address.  */
	unsigned char ar_pln;		/* Length of protocol address.  */
	unsigned short int ar_op;		/* ARP opcode (command).  */
};

/* ARP ioctl request.  */
struct arpreq
{
	struct sockaddr arp_pa;		/* Protocol address.  */
	struct sockaddr arp_ha;		/* Hardware address.  */
	int arp_flags;			/* Flags.  */
	struct sockaddr arp_netmask;	/* Netmask (only for proxy arps).  */
	char arp_dev[16];
};



● IP header

#include	<netinet/ip.h>
/* 预处理之后 */
struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
	unsigned int ihl:4;
	unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
	unsigned int version:4;
	unsigned int ihl:4;
#else
# error	"Please fix <bits/endian.h>"
#endif
	u_int8_t tos;
	u_int16_t tot_len;
	u_int16_t id;
	u_int16_t frag_off;
	u_int8_t ttl;
	u_int8_t protocol;
	u_int16_t check;
	u_int32_t saddr;
	u_int32_t daddr;
	/*The options start here. */
};

/* 预处理之后 */
struct iphdr
{
	unsigned int ihl:4;		/* header length */
	unsigned int version:4;	/* version */

	u_int8_t tos;			/* type of service */
	u_int16_t tot_len;		/* total length */
	u_int16_t id;			/* identification */
	u_int16_t frag_off;		/* fragment offset field */
	u_int8_t ttl;			/* time to live */
	u_int8_t protocol;		/* protocol */
	u_int16_t check;		/* checksum */
	u_int32_t saddr;		/* source address */
	u_int32_t daddr;		/* dest address */
};



● ICMP

#include	<netinet/ip_icmp.h>
struct icmp
{
	u_int8_t  icmp_type;	/* type of message, see below */
	u_int8_t  icmp_code;	/* type sub code */
	u_int16_t icmp_cksum;	/* ones complement checksum of struct */
	union
	{
		u_char ih_pptr;		/* ICMP_PARAMPROB */
		struct in_addr ih_gwaddr;	/* gateway address */
		struct ih_idseq		/* echo datagram */
		{
			u_int16_t icd_id;	/* identifier */
			u_int16_t icd_seq;	/* sequence number */
		} ih_idseq;
		u_int32_t ih_void;

		/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
		struct ih_pmtu
		{
			u_int16_t ipm_void;
			u_int16_t ipm_nextmtu;
		} ih_pmtu;

		struct ih_rtradv
		{
			u_int8_t irt_num_addrs;
			u_int8_t irt_wpa;
			u_int16_t irt_lifetime;
		} ih_rtradv;
	} icmp_hun;
#define	icmp_pptr	icmp_hun.ih_pptr
#define	icmp_gwaddr	icmp_hun.ih_gwaddr
#define	icmp_id		icmp_hun.ih_idseq.icd_id
#define	icmp_seq	icmp_hun.ih_idseq.icd_seq
#define	icmp_void	icmp_hun.ih_void
#define	icmp_pmvoid	icmp_hun.ih_pmtu.ipm_void
#define	icmp_nextmtu	icmp_hun.ih_pmtu.ipm_nextmtu
#define	icmp_num_addrs	icmp_hun.ih_rtradv.irt_num_addrs
#define	icmp_wpa	icmp_hun.ih_rtradv.irt_wpa
#define	icmp_lifetime	icmp_hun.ih_rtradv.irt_lifetime
	union
	{
	struct
	{
		u_int32_t its_otime;
		u_int32_t its_rtime;
		u_int32_t its_ttime;
	} id_ts;
	struct
	{
		struct ip idi_ip;
		/* options and then 64 bits of data */
	} id_ip;
	struct icmp_ra_addr id_radv;
		u_int32_t   id_mask;
		u_int8_t    id_data[1];
	} icmp_dun;
#define	icmp_otime	icmp_dun.id_ts.its_otime
#define	icmp_rtime	icmp_dun.id_ts.its_rtime
#define	icmp_ttime	icmp_dun.id_ts.its_ttime
#define	icmp_ip		icmp_dun.id_ip.idi_ip
#define	icmp_radv	icmp_dun.id_radv
#define	icmp_mask	icmp_dun.id_mask
#define	icmp_data	icmp_dun.id_data
};


● TCP header

#include	<netinet/tcp.h>
/* 预处理之后 */
struct tcphdr
{
    u_int16_t source;	/* source port */
    u_int16_t dest;		/* destination port */
    u_int32_t seq;		/* sequence number */
    u_int32_t ack_seq;	/* acknowledgement number */

    u_int16_t res1:4;	/* (unused) */
    u_int16_t doff:4;	/* data offset */
    u_int16_t fin:1;
    u_int16_t syn:1;
    u_int16_t rst:1;
    u_int16_t psh:1;
    u_int16_t ack:1;
    u_int16_t urg:1;
    u_int16_t res2:2;
# 121 "/usr/include/netinet/tcp.h"
    u_int16_t window;	/* window */
    u_int16_t check;	/* checksum */
    u_int16_t urg_ptr;	/* urgent pointer */
};




● UDP header

#include	<netinet/udp.h>
/* 预处理之后 */
struct udphdr
{
	u_int16_t source;
	u_int16_t dest;
	u_int16_t len;
	u_int16_t check;
};








【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  QLtA9LK6PyNk   2023年11月02日   66   0   0 queryinsertstructnull2010
48HTyjGrRLH9