#ifndef _PROTO_H_
#define _PROTO_H_


/**//*
* TCP/IP 協議類型
*/
#define IPPROTO_IP 0 // IP
#define IPPROTO_ICMP 1 // ICMP
#define IPPROTO_TCP 6 // TCP
#define IPPROTO_UDP 17 // UDP


/**//*
* 常見端口
*/
#define PORT_DNS 53 // DNS


/**//*
* 其它定義
*/
#define ETH_ALEN 6 // 以太網地址大小
#define ETH_HLEN 14 // 以太網頭部大小
#define ETH_DATA_LEN 1500 // 最大幀負載數據大小
#define ETH_FRAME_LEN 1514 // 最大幀大小,頭部+負載數據


/**//**
* 常見協議定義
**/
#pragma pack(push, 1)


/**//*
*14字節的以太網包頭
*/
typedef struct _ETHDR


{
UCHAR eh_dst[ETH_ALEN]; // 目的MAC地址
UCHAR eh_src[ETH_ALEN]; // 源MAC地址
USHORT eh_type; // 下層協議類型,如IP(ETHERTYPE_IP)、ARP(ETHERTYPE_ARP)等
} ETHDR, *PETHDR;


/**//*
*28字節的ARP頭
*/
typedef struct _ARPHDR


{
USHORT ar_hrd; // 硬件地址類型,以太網中為ARPHRD_ETHER
USHORT ar_pro; // 協議地址類型,ETHERTYPE_IP
UCHAR ar_hln; // 硬件地址長度,MAC地址的長度為6
UCHAR ar_pln; // 協議地址長度,IP地址的長度為4
USHORT ar_op; // ARP操作代碼,ARPOP_REQUEST為請求,ARPOP_REPLY為響應
UCHAR ar_sha[ETH_ALEN]; // 源MAC地址
ULONG ar_sip; // 源IP地址
UCHAR ar_tha[ETH_ALEN]; // 目的MAC地址
ULONG ar_tip; // 目的IP地址
} ARPHDR, *PARPHDR;


/**//*
*20字節的IP頭
*/
typedef struct _IPHDR


{
UCHAR h_lenver; // 版本號和頭長度(各占4位)
UCHAR tos; // 服務類型
USHORT total_len; // 封包總長度,即整個IP報的長度
USHORT ident; // 封包標識,惟一標識發送的每一個數據報
USHORT frag_and_flags; // 標志
UCHAR ttl; // 生存時間,就是TTL
UCHAR protocol; // 協議,可能是TCP、UDP、ICMP等
USHORT checksum; // 校驗和
ULONG saddr; // 源IP地址
ULONG daddr; // 目標IP地址
} IPHDR, *PIPHDR;


/**//*
*20字節的TCP頭
*/
typedef struct _TCPHDR


{
USHORT srceport; // 16位源端口號
USHORT dstport; // 16位目的端口號
ULONG seq; // 32位序列號
ULONG ack; // 32位確認號
UCHAR dataoffset; // 高4位表示數據偏移
UCHAR flags; // 6位標志位
//FIN - 0x01
//SYN - 0x02
//RST - 0x04
//PSH - 0x08
//ACK - 0x10
//URG - 0x20
//ACE - 0x40
//CWR - 0x80

USHORT window; // 16位窗口大小
USHORT checksum; // 16位校驗和
USHORT urgptr; // 16位緊急數據偏移量
} TCPHDR, *PTCPHDR;


/**//*
*偽TCP頭,計算校驗和時使用
*/
typedef struct _PSDTCPHDR


{
ULONG saddr;
ULONG daddr;
char mbz;
char ptcl;
USHORT tcpl;
} PSDTCPHDR, *PPSDTCPHDR;


/**//*
*8字節的UDP頭
*/
typedef struct _UDPHDR


{
USHORT srcport; // 源端口號
USHORT dstport; // 目的端口號
USHORT len; // 封包長度
USHORT checksum; // 校驗和
} UDPHDR, *PUDPHDR;


/**//*
*偽UDP頭,計算校驗和時使用
*/
typedef struct _PSDUDPHDR


{
ULONG saddr;
ULONG daddr;
char mbz;
char ptcl;
USHORT udpl;
} PSDUDPHDR, *PPSDUDPHDR;


/**//*
*12字節的ICMP頭
*/
typedef struct _ICMPHDR


{
UCHAR type; //類型
UCHAR code; //代碼
USHORT checksum; //校驗和
USHORT id; //標識符
USHORT sequence; //序列號
ULONG timestamp; //時間戳
} ICMPHDR, *PICMPHDR;


/**//*
*6字節的PPPOE頭+2字節協議
*/
typedef struct _PPPOEHDR


{
UCHAR ver_type; //版本+類型 一般為0x11
UCHAR code; //編碼
USHORT sessionid; //session id
USHORT len; //長度
USHORT protocol; //協議
} PPPOEHDR, *PPPPOEHDR;


/**//*
* dns包頭
*/
typedef struct _DNSHDR


{
USHORT id;
USHORT flags;
USHORT quests;
USHORT answers;
USHORT author;
USHORT addition;
} DNSHDR, *PDNSHDR;


/**//*
* dns查詢包,query
*/
typedef struct _DNSQUERY


{

/**//*UCHAR *dname;*/ //查詢的域名,這是一個大小在0到63之間的字符串

/**//*該域名的獲取方法如下:
* 長度:udp包總長度-sizeof(UDPHDR)-sizeof(DNSHDR)-sizeof(DNSQUERY)
* 內容在dns頭后面
*/
USHORT type; //查詢類型,大約有20個不同的類型
USHORT classes; //查詢類,通常是A類既查詢IP地址
} DNSQUERY, *PDNSQUERY;


/**//*
* dns響應包
*/
typedef struct _DNSRESPONSE


{
USHORT name; // 查詢的域名
USHORT type; // 查詢的類型
USHORT classes; // 類型碼
UINT ttl; // 生存時間
USHORT length; // 資源數據長度
UINT addr; // 資源數據
} DNSRESPONSE, *PDNRESPONSE;

#pragma pack(pop)

#endif

posted on 2009-12-03 11:47
水 閱讀(6881)
評論(0) 編輯 收藏 引用 所屬分類:
協議分析