Mac头,ip头,tcp头简介

5 篇文章 0 订阅
3 篇文章 0 订阅

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值