libpcap格式-数据包头-包含长度/原始长度

libpcap格式-数据包头-包含长度/原始长度,c,networking,wireshark,libpcap,packet-capture,C,Networking,Wireshark,Libpcap,Packet Capture,libpcap数据包头结构有2个长度字段: typedef struct pcaprec_hdr_s { guint32 ts_sec; /* timestamp seconds */ guint32 ts_usec; /* timestamp microseconds */ guint32 incl_len; /* number of octets of packet saved in file */

libpcap数据包头结构有2个长度字段:

typedef struct pcaprec_hdr_s {
        guint32 ts_sec;         /* timestamp seconds */
        guint32 ts_usec;        /* timestamp microseconds */
        guint32 incl_len;       /* number of octets of packet saved in file */
        guint32 orig_len;       /* actual length of packet */
} pcaprec_hdr_t;
包含:实际捕获并保存在文件中的数据包数据字节数。此值不应大于全局标头的原始长度或snaplen值

原始长度:数据包被捕获时出现在网络上的长度。如果inclu_len和orig_len不同,则实际保存的数据包大小受snaplen限制


有人能告诉我这两个长度字段之间的区别吗?我们正在完全保存数据包,那么这两个数据包有何不同呢?

阅读Wireshark wiki()上的文档并研究一个示例pcap文件,看起来incl_len和orig_len通常是相同的数量。它们唯一不同的时间是数据包的长度超过snaplen的大小,snaplen是在文件的全局头中指定的

这里我只是猜测,但我认为snaplen指定了用于捕获的静态缓冲区的大小。如果一个数据包对于捕获缓冲区来说太大,那么这就是该格式发送该事实信号的方法。snaplen“通常”为65535,这对于大多数数据包来说都足够大。但文件规定,尺寸可能会受到用户的限制

有人能告诉我这两个长度字段之间的区别吗?我们正在完全保存数据包,那么这两个数据包有何不同呢

如果您保存的是整个数据包,那么2个数据包应该没有区别

但是,例如,如果从命令行Wireshark运行tcpdump或TShark或dumpcap或捕获,并使用“
-s
n”标志指定一个小值,或在Wireshark GUI的“将每个数据包限制为[n]字节”选项中指定一个小值,然后libpcap/WinPcap将被传递该值,并且只向程序提供每个数据包的前n个字节,而不会保存整个数据包

有限的“快照长度”意味着您看不到所有数据包数据,因此可能无法进行某些分析,但意味着操作系统中缓冲数据包所需的内存更少(因此丢弃的数据包可能更少),并且,如果应用程序正在保存数据包,则需要较少的CPU带宽将数据包复制到应用程序,并且需要较少的磁盘带宽将数据包保存到磁盘(这也可能减少丢弃的数据包数量),并且保存的数据包需要较少的磁盘空间