TCP IP 各种数据包结构
下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用......
/*物理帧头结构*/
typedef struct {
BYTE desmac[6]; //目的MAC地址
BYTE srcmac[6]; //源MAC地址
USHORT ethertype; //帧类型
}Dlc_Header;
/*IP报头结构*/
typedef struct {
BYTE h_len_ver; //IP版本号(高4位)及以32比特为单位的IP包头部的长度(低四位)
BYTE tos; //服务类型TOS
USHORT total_len; //IP包总长度
USHORT ident; //标识
USHORT frag_and_flags; //标志位
BYTE ttl; //生存时间
BYTE proto; //协议
USHORT checksum; //IP首部校验和
BYTE sourceip[4]; //源IP地址(32位)
//或者UINT sourceip;
BYTE destip[4]; //目的IP地址(32位)
//或者 UINT destip;
}Ip_Header;
/*TCP报头*/
typedef struct {
USHORT srcport; // 源端口
USHORT dstport; // 目的端口
UINT seqnum; // 顺序号
UINT acknum; //期待获得对方的TCP包编号
BYTE h_len; // 以32比特为单位的TCP报头长度
BYTE flags; // 标志(URG、ACK等)
USHORT indow; // 窗口大小
USHORT chksum; // 校验和
USHORT urgptr; // 紧急指针
}Tcp_Header;
//TCP伪首部 用于进行TCP校验和的计算,保证TCP效验的有效性
typedef struct{
ULONG sourceip;//源IP地址
ULONG destip;//目的IP地址
BYTE mbz;//置空(0)
BYTE ptcl;//协议类型(IPPROTO_TCP)
USHORT tcpl;//TCP头的长度(单位:字节)
}PSD_HEADER;
/*UDP报头*/
typedef struct {
USHORT srcport; // 源端口
USHORT dstport; // 目的端口
USHORT total_len; // 包括UDP报头及UDP数据的长度(单位:字节)
USHORT chksum; // 校验和
}Udp_Header;
//UDP伪首部-仅用于计算校验和
typedef struct tsd_hdr
{
BYTE sourceip[4]; //源IP地址
BYTE destip[4]; //目的IP地址
BYTE mbz;//置空(0)
BYTE ptcl; //协议类型(IPPROTO_UDP)
USHORT udpl;//UDP包总长度(不包括伪首部的长度 单位:字节)
}PSD_HEADER;
/*ICMP报头*/
typedef struct {
BYTE i_type; //类型 发出的ICMP为8(ICMP_ECHO_REQUEST),接受到的ICMP为0
BYTE i_code; //代码
USHORT i_cksum; //ICMP包校验和
USHORT i_id; //识别号(一般用进程号作为标识号)
USHORT i_seq; //报文序列号(一般设置为0)
ULONG timestamp;//时间戳
}Icmp_Header;
//ARP帧结构
typedef struct {
USHORT HW_Type;//硬件类型Ethernet:0x1
USHORT Prot_Type;//上层协议类型IP:0x0800
BYTE HW_Addr_Len;//硬件地址长度:6
BYTE Prot_Addr_Len;//协议地址(IP地址)的长度:4
USHORT Flag;//1表示请求,2表示应答
BYTE Send_HW_Addr[6];//源MAC地址
BYTE Send_Prot_Addr[4];//源IP地址
BYTE Targ_HW_Addr[6];//目的MAC地址
BYTE Targ_Prot_Addr[4];//目的IP地址
BYTE Padding[18];//填充数据
}Arp_Frame;
/*DNS数据报头*/
typedef struct {
USHORT id; //标识,通过它客户端可以将DNS的请求与应答相匹配;
USHORT flags; //标志:(查询)0x0100 (应答)0x8180 这些数字都是主机序
USHORT questions; //问题数目
USHORT answers; //资源记录数目
USHORT author; //授权资源记录数目
USHORT addition; //额外资源记录数目
}DNS_HEADER;
//这是DNS包的公共部分,即查询包及应答包都含有这部分,由于查询问题(Domain)大小无法确定,因此这里不好将其及其以后的数据写入结构体中