Mac頭,ip頭,tcp頭簡介

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

 

發佈了168 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章