一、 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;