一、 MAC 帧头定义
/*资料帧定义,头 14 个位元组,尾 4 个位元组*/
typedef struct _MAC_FRAME_HEADER
{
char m_cDstMacAddress[6]; //目的 mac 地址
char m_cSrcMacAddress[6]; //源 mac 地址
short m_cType; //上一层协议型别,如 0x0800 代表上一层是 IP 协议,0x0806 为 arp
}__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;
typedef struct _MAC_FRAME_TAIL
{
unsigned int m_sCheckSum; //资料帧尾校验和
}__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL;
二、 IP 头结构的定义
/*IP 头定义,共 20 个位元组*/
typedef struct _IP_HEADER
{
char m_cVersionAndHeaderLen; //版本资讯 (前 4 位),头长度 (后 4 位)
char m_cTypeOfService; // 服务型别 8 位
short m_sTotalLenOfPacket; //资料包长度
short m_sPacketID; //资料包标识
short m_sSliceinfo; //分片使用
char m_cTTL; //存活时间
char m_cTypeOfProtocol; //协议型别
short m_sCheckSum; //校验和
unsigned int m_uiSourIp; //源 ip
unsigned int m_uiDestIp; //目的 ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;
三、 tcp 头结构定义
/*TCP 头定义,共 20 个位元组*/
typedef struct _TCP_HEADER
{
short m_sSourPort; // 源埠号 16bit
short m_sDestPort; // 目的埠号 16bit
unsigned int m_uiSequNum; // 序列号 32bit
unsigned int m_uiAcknowledgeNum; // 确认号 32bit
short m_sHeaderLenAndFlag; // 前 4 位:TCP 头长度;中 6 位:保留;后 6 位:标志位
short m_sWindowSize; // 视窗大小 16bit
short m_sCheckSum; // 检验和 16bit
short m_surgentPointer; // 紧急资料偏移量 16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;
/*TCP 头中的选项定义
kind(8bit)+Length(8bit,整个选项的长度,包含前两部分)+内容 (如果有的话)
KIND = 1 表示 无操作 NOP,无后面的部分
2 表示 maximum segment 后面的 LENGTH 就是 maximum segment 选项的长度(以 byte 为单位,1+1+内容部分长度)
3 表示 windows scale 后面的 LENGTH 就是 windows scale 选项的长度(以 byte 为单位,1+1+内容部分长度)
4 表示 SACK permitted LENGTH 为 2,没有内容部分
5 表示这是一个 SACK 包 LENGTH 为 2,没有内容部分
8 表示时间戳,LENGTH 为 10,含 8 个位元组的时间戳
*/
typedef struct _TCP_OPTIONS
{
char m_ckind;
char m_cLength;
char m_cContext[32];
}__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;
四、 UDP 头结构的定义
/*UDP 头定义,共 8 个位元组*/
typedef struct _UDP_HEADER
{
unsigned short m_usSourPort; // 源埠号 16bit
unsigned short m_usDestPort; // 目的埠号 16bit
unsigned short m_usLength; // 资料包长度 16bit
unsigned short m_usCheckSum; // 校验和 16bit
}__attribute__((packed))UDP_HEADER, *PUDP_HEADER;