文章參考地址:http://blog.chinaunix.net/uid-20698826-id-4700710.html http://blog.csdn.net/mrwangwang/article/details/8537775
一、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在IP報文中的位置如圖所示
UDP報頭由4個域組成,其中每個域各占用2個字節,具體如下:
*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;
五、TCP/IP報文格式
圖中括號中的數字代表的是當前域所占的空間大小,單位是bit位。
黃色的是數據鏈路層的頭部,一共14字節
綠色的部分是IP頭部,一般是20字節
紫色部分是TCP頭部,一般是20字節