1 TCP头
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头部是20个字节,然后这里有窗口大小16位,指的就是 滑动窗口 的最大值是2的16次方减1,等于65535.
2 UDP头
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;
UDP的头部是8个字节。
3 IP头
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 ;
没有加可选选项的时候,IP包固定包头长度是20个字节。
所有的TCP
、UDP
、ICMP
、IGMP
数据都被封装在IP数据报中传送
4 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;
帧定义,头14个字节,尾4个字节
IP协议往往被封装在以太网帧中传送