gpt4 book ai didi

tcp - 如何确定原始数据包中 IP header 和 TCP header 的起始字节

转载 作者:可可西里 更新时间:2023-11-01 02:49:24 25 4
gpt4 key购买 nike

我想用libpcap抓包但由于以太网 header 或 802.11 header 的长度可能会有所不同并且 IP header 的长度也可能会有所不同,如何确定 IP header 和 TCP header 的起始字节(指针)另外,如何区分一个包是纯IP包、TCP包还是UDP包?是否有任何 API 或方法可以做到这一点?谢谢!

最佳答案

当您使用 libpcap 时,您可以通过直接查看 pcap 文件头(用于离线捕获)pcap_file_header.linktype 或(用于实时和离线)来确定链路层头的大小捕获)来自对 pcap_datalink() 的调用。大多数情况下,这将是 LINKTYPE_ETHERNET。为确保数据包为 IPv4,您可以转换为以太网 header 并检查以确保以太网类型为 ETHERTYPE_IP(确保将其包装在 ntohs() 中。我通常将 bpf 过滤器应用于我的 pcap 实例化,因此我从不担心这些东西。然而,要检查更高层协议(protocol)并假设您正在使用 pcap_dispatch(),您可以按照以下内容编写回调:( libnet 库因其广泛的可移植数据包结构而仍然很有用):

#include <libnet.h>
#include <pcap.h>

void
process_packet(u_char *user, const struct pcap_pkthdr *header, const u_char *packet)
{
struct libnet_ipv4_hdr *ip;
struct libnet_udp_hdr *tcp;
uint16_t ip_hl, udp_hl, header_cruft;

ip = (struct libnet_ipv4_hdr *)(packet + LIBNET_ETH_H);
ip_hl = ip->ip_hl << 2;

switch (ip->ip_p)
{
case IPPROTO_UDP:
udp = (struct libnet_udp_hdr *)(packet + LIBNET_ETH_H + ip_hl);
udp_hl = tcp->th_off << 2;
header_cruft = LIBNET_ETH_H + ip_hl + tcp_hl;
break;
case IPPROTO_TCP:
/** you get the idea */
break;
default:
break;
}

关于tcp - 如何确定原始数据包中 IP header 和 TCP header 的起始字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com