MAC帧头定义
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 ;
在linux内核中ip选项是通过ip_options结构来表示的:
struct ip_options {
/*
* 存在宽松源路由或严格源路由选项时,用来
* 记录下一跳的IP地址
*/
__be32 faddr;
/*
* 标识IP首部中选项所占的字节数,包括__data之后的数据,
* 如果有的话
*/
unsigned char optlen;
/*
* 记录宽松源路由或严格源路由选项在IP首部中的偏移量,
* 即选项的第一个字节的地址减去IP首部的第一个字节的地址
*/
unsigned char srr;
/*
* 用于记录路径选项在IP首部中的偏移量
*/
unsigned char rr;
/*
* 用于记录时间戳选项在IP首部中的偏移量
*/
unsigned char ts;
/*
* 标识该IP选项是否有数据,若有则存放在__data字段起始的
* 存储空间内,即紧跟在ip_option结构后面。这里的数据不只
* 是选项数据,而是整个选项内容
*/
/*
* 标识该选项是IPOPT_SSRR(严格源路由),而不是IPOPT_LSRR(宽松源路由)
*/
unsigned char is_strictroute:1,
/*
* 表示目的地址是从源路由选项选出的
*/
srr_is_hit:1,
/*
* 标识是否修改过IP首部,如果是则需要重新
* 计算IP首部校验和
*/
is_changed:1,
/*
* 标识有IPOPT_RR选项,需要记录IP地址。
*/
rr_needaddr:1,
/*
* ts_needtime标识有IPOPT_TIMESTAMP选项,需要
* 记录时间戳
* ts_needaddr标识有IPOPT_TIMESTAMP选项,需要
* 记录IP地址
*/
ts_needtime:1,
ts_needaddr:1;
/*
* 标识IPOPT_RA选项。路由器警告选项,表示路由器
* 应该更仔细地检查这个数据包
*/
unsigned char router_alert;
/*
* 用于记录商业IP安全选项在IP首部中的偏移量
*/
unsigned char cipso;
/*
* 未使用
*/
unsigned char __pad2;
/*
* 若选项有数据则从该字段开始,使之紧跟在ip_option结构后面,
* 最多不超过40B
*/
unsigned char __data[0];
};
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个字节的时间戳
*/
UDP头结构的定义
https://blog.csdn.net/chenliang0224/article/details/81322804