TCP/IP协议头部对应代码

以太网ethernet

代码

/* This is an Ethernet frame header. */
struct ethhdr {
  unsigned char        h_dest[ETH_ALEN];    /* destination eth addr    */
  unsigned char        h_source[ETH_ALEN];    /* source ether addr    */
  unsigned short    h_proto;        /* packet type ID field    */
};

 

ARP头部

/* ARP protocol opcodes. */
#define    ARPOP_REQUEST    1        /* ARP request            */
#define    ARPOP_REPLY    2        /* ARP reply            */
#define    ARPOP_RREQUEST    3        /* RARP request            */
#define    ARPOP_RREPLY    4        /* RARP reply            */

/*
 *    This structure defines an ethernet arp header.
 */

struct arphdr
{
    unsigned short    ar_hrd;        /* format of hardware address    */
    unsigned short    ar_pro;        /* format of protocol address    */
    unsigned char    ar_hln;        /* length of hardware address    */
    unsigned char    ar_pln;        /* length of protocol address    */
    unsigned short    ar_op;        /* ARP opcode (command)        */
#if 0
     /*
      *     Ethernet looks like this : This bit is variable sized however...
      */
    unsigned char        ar_sha[ETH_ALEN];    /* sender hardware address    */
    unsigned char        ar_sip[4];        /* sender IP address        */
    unsigned char        ar_tha[ETH_ALEN];    /* target hardware address    */
    unsigned char        ar_tip[4];        /* target IP address        */
#endif
};

 

IP

//注意大小端问题,自己手动修改一下下面的代码,或者直接将version和ihl合并成为char,根据自己机器写代码时指定,x86为小端

 

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;
    __u16    tot_len;
    __u16    id;
    __u16    frag_off;
    __u8    ttl;
    __u8    protocol;
    __u16    check;
    __u32    saddr;
    __u32    daddr;
    /*The options start here. */
};

UDP


struct udphdr {
  unsigned short    source;
  unsigned short    dest;
  unsigned short    len;
  unsigned short    check;
};

TCP


#define HEADER_SIZE    64        /* maximum header size        */
struct tcphdr {
    __u16    source;
    __u16    dest;
    __u32    seq;
    __u32    ack_seq;
#if defined(LITTLE_ENDIAN_BITFIELD)
    __u16    res1:4,
        doff:4,
        fin:1,
        syn:1,
        rst:1,
        psh:1,
        ack:1,
        urg:1,
        res2:2;
#elif defined(BIG_ENDIAN_BITFIELD)
    __u16    doff:4,
        res1:4,
        res2:2,
        urg:1,
        ack:1,
        psh:1,
        rst:1,
        syn:1,
        fin:1;
#else
#error    "Adjust your <asm/byteorder.h> defines"
#endif    
    __u16    window;
    __u16    check;
    __u16    urg_ptr;
};

enum {
  TCP_ESTABLISHED = 1,
  TCP_SYN_SENT,
  TCP_SYN_RECV,
  TCP_FIN_WAIT1,
  TCP_FIN_WAIT2,
  TCP_TIME_WAIT,
  TCP_CLOSE,
  TCP_CLOSE_WAIT,
  TCP_LAST_ACK,
  TCP_LISTEN,
  TCP_CLOSING    /* now a valid state */
};

 

 

一些常规的typedef

typedef signed char s8;
typedef unsigned char u8;

typedef signed short s16;
typedef unsigned short u16;

typedef signed long s32;
typedef unsigned long u32;

typedef signed long long s64;
typedef unsigned long long u64;

 

以上图片均来自《TCP/IP详解卷一:协议》

代码来自linux1.2版本内核源码

 

 

posted @ 2012-12-29 23:41  godjob  Views(559)  Comments(0Edit  收藏  举报