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