2017下半年埋线培训班:TCP/IP各种包头结构

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 20:34:59

下面这些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)大小无法确定,因此这里不好将其及其以后的数据写入结构体中