一、24字节pcap文件头(一个文件只有一个),linktype为链路层类型,决定数据帧头结构,其他没啥用
typedef struct PcapFileHeader
{
unsigned long magic; /* 0xa1b2c3d4 */
unsigned short version_major; /* magjor Version 2 */
unsigned short version_minor; /* magjor Version 4 */
unsigned long thiszone; /* gmt to local correction */
unsigned long sigfigs; /* accuracy of timestamps */
unsigned long snaplen; /* max length saved portion of each pkt */
unsigned long linktype; /* data link type (LINKTYPE_*) */
}PcapFileHeader_t;
二、Pcap包头(一个文件可以有很多个包),
//时间戳
typedef struct PcapTime_val
{
long tv_sec; /* seconds 含义同 time_t 对象的值 */
long tv_usec; /* and microseconds */
}PcapTime_val_t;
//pcap数据包头结构体
typedef struct PcapPackageHeader
{
struct PcapTime_val ts; /* time stamp */
unsigned long caplen; /* length of portion present *///标识所抓获的数据包保存在pcap文件中的实际长度,以字节为单位
unsigned long len; /* length this packet (off wire) *///所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大
}PcapPackageHeader_t;
三、数据帧头
链路层决定结构(看客自己找吧,本人遇到的那一种就不说了),内有Protocal记录IPv4或IPv6
四、IPv4数据报头,Protocal记录为TCP还是UDP或其他
typedef struct PcapIPv4Header //20字节
{ //IP数据报头
unsigned char Ver_HLen; //版本+报头长度
unsigned char TOS; //服务类型
unsigned short TotalLen; //总长度
unsigned short ID; //标识
unsigned short Flag_Segment; //标志+片偏移
unsigned char TTL; //生存周期
unsigned char Protocol; //协议类型
unsigned short Checksum; //头部校验和
unsigned long SrcIP; //源IP地址
unsigned long DstIP; //目的IP地址
}PcapIPv4Header_t;
IPv6数据报头
typedef struct PcapIPv6Header //40字节
{
unsigned long FlowLabel;
unsigned short PayloadLength;
unsigned char NextHeader;
unsigned char HopLimit;
unsigned char Source[16];
unsigned char Destination[16];
}PcapIPv6Header_t;
五、常用协议头,TCP头为公有部分,后面还有可选项部分,需要通过IP头的报头长度与公有部分长度计算
//TCP数据报头
typedef struct PcapTCP_PublicHeader
{ //TCP数据报头
unsigned short SrcPort; //源端口
unsigned short DstPort; //目的端口
unsigned long SeqNO; //序号
unsigned long AckNO; //确认号
unsigned char HeaderLen; //数据报头的长度(4 bit) + 保留(4 bit)
unsigned char Flags; //标识TCP不同的控制消息
unsigned short Window; //窗口大小
unsigned short Checksum; //校验和
unsigned short UrgentPointer; //紧急指针
}PcapTCP_PublicHeader_t;
//UDP数据头
typedef struct PcapUDPHeader
{
unsigned short SrcPort; // 源端口号16bit
unsigned short DstPort; // 目的端口号16bit
unsigned short len; // 数据包长度16bit
unsigned short checkSum; // 校验和16bit
}PcapUDPHeader_t;
//ICMP数据头
typedef struct PcapICMPHeader
{
unsigned char type; //类型8位
unsigned char code; //代码8位
unsigned short checkSum; //校验和16bit
}PcapICMPHeader_t;
六、以上为所有头结构,后面部分为payload,Pcap包头记录的长度与头长度计算可得到
参考:1、网络资料一些整理,不单我说很多资料有问题
2、使用Wireshark解析实验验证