网络探针管理器

网络探测器管理器跟踪系统中的传入和传出网络包 (包信息由 AIX®中的 bpf 模块解释)。 探测器规范允许用户指定 Berkeley 包过滤器 (BPF) 过滤器,类似于用于详细跟踪的 tcpdump 过滤器表达式。

可以使用内置变量来收集因特网协议的包头和有效内容信息。 例如,以太网、因特网协议版本 4/版本 6 (IPv4/v6)、传输控制协议 (TCP)、用户数据报协议 (UDP)、因特网控制报文协议 (ICMP)、因特网组消息协议 (IGMP) 和地址解析协议 (ARP) 协议。

网络探针管理器报告特定于关键协议的事件(TCP 状态更改、往返时间、重新传输和 UDP 缓冲区溢出)。

网络探针管理器处理以下主要用例:

  • 根据基于 IP 地址和端口的 bpf 模块提供下列特定于包的信息:
    • 跟踪连接的传入和传出字节。
    • 使用以下内置项来收集协议头和有效内容信息。
      • TCP 标志(SYN 和 FIN)、TCP 序列和应答编号。
      • IPv4/IPv6(IP 地址、协议类型:tcp、udp、icmp 和 igmp 等等)。
      • ICMP(包类型:ECHO REQUEST 和 ECHO RESPONSE 等等)。
  • 提供对完整 RAW 网络包的访问以进行探针脚本处理。
  • 报告以下协议相关事件:
    • 跟踪 TCP 发送方和接收方缓冲区变满事件。
    • TCP 连接状态从 SYN-SENT 状态更改为 ESTABLISHED 状态,或从 ESTABLISHED 状态更改为 CLOSE 状态。
    • 监视状态更改之间的时间变化量(例如,从 SYN-SENT 状态变为 ESTABLISHED 状态所消耗的时间)。
    • 标识因为侦听器队列已满而废弃连接的侦听器(连接信息)。
    • 标识 TCP 连接的重新传输(包的第二次及后续重新传输)。
    • 标识因为接收缓冲区不足而删除包的 UDP 套接字。

调查规范

网络探针管理器的探针规范包含三个或五个元素,它们之间用 :(冒号)分隔。 第一元组始终为 @@net

网络探针管理器支持两个主要规范类型:一个类别收集特定于包的信息,另一个类别收集特定于协议的信息。

  • 用于收集特定于包的信息的格式:

    @@net:bpf:<interface1>|<interface 2>|…..:<protocol>:<Filter>

  • 用于收集特定于协议的信息的格式:

    @@net:tcp:<event_name>

    @@net:udp:<event_name>

探针子类型

第二个元组表示探测器的子类型,该子类型指示包含探测器的 AIX 网络堆栈层。 此元组可具有下列其中一个值(不能为 *):

表 1. 探针子类型的第二元组规范
第二元组(子类型) 描述
bpf 包与特定过滤器匹配时,此探针在网络接口层启动。
tcp 此探针针对特定于 TCP 协议的事件启动。
udp 此探针针对特定于 UDP 协议的事件启动。

探针网络事件或收集网络包信息

第三元组特定于特定子类型(在第二元组中指定)。 它不能具有值 *。

基于 bpf 的探针

此规范包含 5 个元组,以用于下表中描述的基于 bpf 的探针:

表 2。 基于 bpf 的探针: Tuple 规范
第二元组(子类型) 后续元组 描述

bpf

第三元组:接口名称 此元组指定可针对其捕获包信息的一个接口或一组接口。 可能的值为 enX(例如,en0en1)以及 lo0。 此元组不支持值 *。 可一次指定一个或多个接口(通过将 | 用作分隔符)。
第四元组:协议 此元组指定用于启动探针的网络协议。 可能的值为 ether, arp, rarp, ipv4, ipv6, tcp, udp, icmp4, icmp6igmp。 在 Vue 脚本中填充特定于协议的内置项以用于访问。 例如,协议值 ipv4 将填充 __ip4hdr 内置项。
此元组的值 * 指示此探针针对与指定过滤器相匹配的所有协议类型启动。 如果协议为 *,那么网络探针管理器所支持的所有内置值对于 Vue 脚本都不可用。 可通过使用 Vue 函数 copy_kdata () 来访问所请求大小的原始包数据并映射至对应协议头。
注: 将 * 指定为与过滤器匹配的指定接口上的所有入局和出局信息包启动探测器时,可能会使性能更强。 包信息跨越多个包缓冲区时,还涉及副本。

bpf

第五元组:bpf 过滤器字符串 此元组指定 bpf 过滤表达式(tcpdump 命令中指定的过滤表达式)。 提供的过滤表达式必须括在双引号中。 第四元组中指定的过滤表达式和协议必须兼容。 值 * 在此元组中不受支持。
示例
  1. 规范格式,接口 en0 在端口 23 上接收或发送包(过滤器字符串“port 23”)时,用于从 Vue 脚本访问与以太网头 (__etherhdr)、IP 头(__ip4hdr__ip6hdr)及 TCP 头 (__tcphdr) 信息相关的内置变量:
    @@net:bpf:en0:tcp:“port 23”
  2. 规范格式,系统在 en0 和 en1 接口上从主机 example.com 接收或发送包(过滤器字符串“example.com”)时,用于从 Vue 脚本访问与以太网头 (__etherhdr)、IP 头(__ip4hdr__ip6hdr)和 UDP 头 (__udphdr) 信息相关的内置变量:
    @@net:bpf:en0|en1:udp:“host example.com”
  3. 规范格式,系统从主机 example.com 接收包或向其发送包时,用于访问原始包信息:
    @@net:bpf:en1:*:“host example.com”
注: 每个 bpf 探测器规范都使用一个 bpf 设备。 这些设备由ProbeVue、"tcpdump以及使用 "libpcap或 "bpf服务进行数据包捕获和注入的任何其他应用程序共享。 bpf 探针数取决于系统中的可用 bpf 设备数。

bpf 探针启动时,那么 __mdata 变量包含原始包数据。 可通过使用 Vue 函数 copy_kdata () 来访问所请求大小的原始数据,并映射至以太网头和 IP 头等等。 使用以下结构以了解头和有效内容数据信息。

示例

VUE script to access the raw packet data when the “*” is specified as the protocol.

 /* Define the ether header structure */
struct  ether_header {
        char  ether_dhost[6];
        char  ether_shost[6];
        short ether_type;
};

/* ProbeVue script to access and interpret the data from RAW packet */

@@net:bpf:en0:*:"port 23"
{
        /* define the script local variables */
        __auto struct ether_header eth;
        __auto char *mb;

        /* __mdata contains the address of packet data */
        mb =(char *) __mdata;
        printf("Network probevue\n");
        
       /* 
        * Use already available “copy_kdata(…)” VUE function to copy data of 
        * requested size (size of ether_header) from mbuf data pointer to eth
        * (ether_header) variable.
        */
        copy_kdata (mb, eth);
        printf("Ether Type  from raw data :%x\n",eth.ether_type);
      
}

TCP 探针

此规范包含 3 个元组,以用于下表中描述的 TCP 探针:

表 3。 TCP 探针:元组规范
第二元组(子类型)

事件(第三元组)

值 * 在此元组中不受支持。

描述
tcp state_change 每当 TCP 状态更改时,此探针启动。
send_buf_full 每当发送缓冲区变满事件发生时,此探针启动。
recv_buf_full 每当接收缓冲区变满事件发生时,此探针启动。
重新发送 (retransmit) 每当 TCP 连接发生重新传输包事件时,此探针启动。
listen_q_full 每当服务器(侦听器套接字)因为侦听器队列变满而废弃新连接请求时,此探针启动。

每当 TCP 相关事件发生时,__proto_info 内置变量提供 TCP 连接(四元组)信息(本地 IP、远程 IP、本地端口和远程端口)。 对于 listen_q_full 事件,远程端口和 IP 地址包含空值。

示例

TCP 协议状态更改的探针规范:

@@net:tcp:state_change

udp 探针

对于 udp 探针,此规范包含三个元组,如下表中所示:

表 4。 udp 第二元组: 第三元组值
第二元组(子类型) 事件(第三元组)

值 * 在此元组中不受支持。

描述
udp sock_recv_buf_overflow 每当数据报或 UDP 套接字的接收缓冲区溢出时,此探针启动。

每当套接字接收缓冲区溢出事件发生时,__proto_info 内置变量提供 UDP 协议相关数据(源 IP 和目标 IP 地址、源端口号和目标端口号)。

@@net:udp:sock_recv_buf_overflow

示例

UDP 套接字的接收缓冲区溢出的探针规范:

@@net:udp:sock_recv_buf_overflow

Vue 脚本的网络探针相关内置变量

可使用以下内置变量探测网络相关事件。

__etherhdr 内置变量

__etherhdr 变量是一个特殊内置变量,用于从被过滤包获取以太网头信息。 在接口层使用下列任一协议探测包信息时,此内置变量可用:“ether”、“ipv4”、“ipv6”、“tcp”、“udp”、“icmp4”、“icmp6”、“igmp”、“arp”和“rarp”。 此变量在子类型为 bpf 的探针中可用。 可使用 __etherhdr->member 语法访问其成员元素。

__etherhdr 内置值具有以下成员:

表 5。 __etherhdr 内置变量成员
成员名 类型 描述
src_addr

mac_addr_t

源 MAC 地址。

数据类型 mac_addr_t 用于存储 MAC 地址。 使用格式说明符“M”来显示 MAC 地址。

dst_addr mac_addr_t 目标 MAC 地址。

数据类型 mac_addr_t 用于存储 MAC 地址。 使用格式说明符“M”来显示 MAC 地址。

ether_type unsigned short 此名称指示封装在以太网框架的有效内容中的协议。 协议可以是 IPv4、IPv6、ARP 和 REVARP。

它可与 ether_type 的下列其中一个内置常量值相匹配:

  • ETHERTYPE_IP
  • ETHERTYPE_IPV6
  • ETHERTYPE_ARP
  • ETHERTYPE_REVARP

请参阅头文件 /usr/include/netinet/if_ether.h /usr/include/netinet/if_ether6.h 以获取 ether_type 值。

注: __etherhdr 内置变量仅适用于以太网接口,而不适用于回送接口。
__ip4hdr 内置变量

__ip4hdr 变量是一个特殊内置变量,用于从被过滤包获取 IPv4 头信息。 在接口层使用下列任一协议探测包信息时,此内置变量可用:“ipv4”、“tcp”、“udp”、“icmp4”和“igmp”。 而且,IP 版本为 IPv4 时它具有有效数据。 此变量在子类型为 bpf 的探针中可用。 可使用 __ip4hdr->member 语法访问其成员元素。

此内置变量具有下列成员:

表 6。 __ip4hdr 内置变量成员
成员名 类型 描述
src_addr

ip_addr_t

源 IP 地址。

数据类型 ip_addr_t 用于存储 IP 地址。 使用格式说明符“I”来以点分十进制格式显示 IP 地址,使用格式说明符“H”以显示主机名。 显示主机名操作成本很高。

dst_addr ip_addr_t 目标 IP 地址。

数据类型 ip_addr_t 用于存储 IP 地址。 使用格式说明符“I”来以点分十进制格式显示 IP 地址,使用格式说明符“H”以显示主机名。 显示主机名操作成本很高。

协议 unsigned short 此成员名指示 IP 数据报的数据部分中使用的协议。 协议可以是 TCP、UDP、ICMP、IGMP、FRAGMENTED 等等。

它可与协议的下列其中一个内置常量值相匹配。

IPPROTO_HOPOPTS,
IPPROTO_ICMP, 
IPPROTO_IGMP,
IPPROTO_TCP, 
IPPROTO_UDP, 
IPPROTO_ROUTING,
IPPROTO_FRAGMENT, 
IPPROTO_NONE, 
IPPROTO_LOCAL

请参阅头文件 /usr/include/netinet/in.h 以获取协议值。

ttl unsigned short 生存时间或中继段限制。
cksum unsigned short IP 头校验和。
标识 unsigned short 标识号。 此成员用于唯一标识单个 IP 数据报的片段组。
total_len unsigned short 总长度。 此值是整个包(片段)大小,包括 IP 头和数据,以字节计。
hdr_len unsigned short IP 头的大小。
tos unsigned short 服务类型。
frag_offset unsigned short 片段偏移量。

此值指定特定片段的偏移量(相对于原始未分段 IP 数据报的开头)。 第一个片段的偏移量为零。

它可与其中一个内置常量 frag_offset 标志值相匹配。 标志值必须是按位设置的,并且与内置常量标记值一起验证是否存在特定标记:

  • IP_DF(没有片段标记)
  • IP_MF(更多片段标记)

请参阅头文件 /usr/include/netinet/ip.h 以获取标记值。

__ip6hdr 内置变量

__ip6hdr 变量是一个特殊内置变量,用于从被过滤包获取 IPv6 头信息。 用户在接口层探测包信息时,此变量可用。 IP 版本为 IPv6 时,带有任一协议(“ipv6”、“tcp”、“udp”和“icmp6”)的此变量具有有效数据。 此变量在子类型为 bpf 的探针中可用。 可使用 __ip6hdr->member 语法访问其成员元素。

此内置变量具有下列成员:

表 7。 __ip6hdr 内置变量成员
成员名 类型 描述
src_addr

ip_addr_t

源 IP 地址。

数据类型 ip_addr_t 用于存储 IP 地址。 使用格式说明符“I”来显示 IP 地址,使用格式说明符“H”以显示主机名。 显示主机名操作成本很高。

dst_addr ip_addr_t 目标 IP 地址。

数据类型 ip_addr_t 用于存储 IP 地址。 使用格式说明符“I”来显示 IP 地址,使用格式说明符“H”以显示主机名。 显示主机名操作成本很高。

协议 unsigned short 此值指示 IP 数据报的数据部分中使用的协议。 协议可以是 TCP、UDP 和 ICMPV6 等等。

它可与协议的下列其中一个内置常量值相匹配:

IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ROUTING, IPPROTO_ICMPV6, IPPROTO_NONE, IPPROTO_DSTOPTS, IPPROTO_LOCAL

请参阅头文件 /usr/include/netinet/in.h 以获取协议值。

hop_limit unsigned short 中继段限制(生存时间)。
total_len unsigned short 总长度(有效内容长度)。 有效内容的大小,包含任何扩展头。
next_hdr unsigned short 指定下一个头的类型。 此字段通常指定包的有效内容使用的传输层协议。 包中存在扩展头时,此字段指示跟在其后的扩展头。 这些值与用于 IPv4 协议字段的值共享。
flow_label unsigned int 流程标签。
traffic_class unsigned int 流量类。

__tcphdr 内置变量

__tcphdr 变量是一个特殊内置变量,用于从被过滤包获取 tcp 头信息。 用户使用 tcp 协议在接口层探测包信息时,此变量可用。 它在子类型为 bpf 的探针中可用。 可使用 __tcphdr->member 语法访问其成员元素。

__tcphdr 内置变量具有以下成员:

表 8。 __tcphdr 内置变量成员
成员名 类型 描述
src_port unsigned short 包的源端口。
dst_port unsigned short 包的目标端口。
标志 unsigned short 这些值是控制位,设置它们是为了指示控制信息的通信。 每个标志占用 1 位。

它可与其中一个内置常量标志值相匹配。 标志值必须是按位设置的,并且与内置常量标记值一起验证是否存在特定标志。

  • TH_FIN(发送方未发送更多数据)
  • TH_SYN(请求建立连接)
  • TH_RST(重置连接)
  • TH_PUSH(推送功能。 请求将缓存数据推送至接收应用程序)
  • TH_ACK(指示此包包含应答)
  • TH_URG(指示紧急指针字段很重要)

请参阅 TCP 文档以获取有关这些标记的详细信息,请参阅头文件 /usr/include/netinet/tcp.h 以获取标记值。

seq_num unsigned int 序号。
ack_num unsigned int 应答号。
hdr_len unsigned int TCP 头长度信息
cksum unsigned short 校验和。
窗口 unsigned short 窗口大小。
urg_ptr unsigned short 紧急指针。

__udphdr 内置变量

__udphdr 是一个特殊内置变量,用于从被过滤包获取 udp 头信息。 用户使用 udp 作为协议在接口层探测包信息时,此内置变量可用。 它在子类型为 bpf 的探针中可用。 可使用 __udphdr->member 语法访问其成员元素。

__udphdr 内置变量具有下列成员:

表 9。 __udphdr 内置变量成员
成员名 类型 描述
src_port unsigned short 包的源端口。
dst_port unsigned short 包的目标端口。
长度 unsigned short UDP 头和数据长度信息。
cksum unsigned short 校验和。

__icmp 内置变量

__icmp 是一个特殊内置变量,用于从被过滤包获取 icmp 头信息。 用户使用 icmp 作为协议在接口层探测包信息时,此内置变量可用。 它在子类型为 bpf 的探针中可用。 可使用 __icmp->member 语法访问其成员元素。

此内置变量具有下列成员:

表 10. __icmp 内置变量成员
成员名 类型 描述
类型 unsigned short ICMP 消息的类型。

例如:0 - 回传应答,8 - 回传请求,3 - 目标不可访问。 查看所有类型。 有关更多信息,请参阅标准网络文档。

它可与 ICMP 消息类型的下列其中一个内置常量值相匹配:

ICMP_ECHOREPLY, 
ICMP_UNREACH
ICMP_SOURCEQUENCH,
ICMP_REDIRECT,
ICMP_ECHO, 
ICMP_TIMXCEED,
ICMP_PARAMPROB,
ICMP_TSTAMP,
ICMP_TSTAMPREPLY,
ICMP_IREQ, 
ICMP_IREQREPLY,
ICMP_MASKREQ,
ICMP_MASKREPLY

请参阅头文件 /usr/include/netinet/ip_icmp.h 以获取协议值。

注: 未定义所有可能的消息类型值,因此该值中可能存在其他选项。
代码 unsigned short ICMP 消息的子类型。

对于每种类型的消息,将定义一些不同的代码和子类型。 例如,没有路径指向目标、与目标的通信在管理上被禁止、不是邻居、地址不可访问及端口不可访问。 有关更多信息,请参阅标准网络文档。

它可与 ICMP 子类型的下列其中一个内置常量值相匹配:

ICMP_UNREACH_NET ICMP_UNREACH_HOST ICMP_UNREACH_PROTOCOL ICMP_UNREACH_PORT ICMP_UNREACH_NEEDFRAG ICMP_UNREACH_SRCFAIL ICMP_UNREACH_NET_ADMIN_PROHIBITED ICMP_UNREACH_HOST_ADMIN_PROHIBITED

类型 4 的子类型值

类型 4 的子类型值如下所示:

ICMP_REDIRECT_NET 
ICMP_REDIRECT_HOST 
ICMP_REDIRECT_TOSNET 
ICMP_REDIRECT_TOSHOST

类型 6 的子类型值

类型 6 的子类型值如下所示:

ICMP_TIMXCEED_INTRANS
ICMP_TIMXCEED_REASS

类型 7 的子类型值

类型 7 的子类型值如下所示:

ICMP_PARAMPROB_PTR

ICMP_PARAMPROB_MISSING

请参阅头文件 /usr/include/netinet/ip_icmp.h 以获取消息子类型值。

注意:未定义所有可能的消息子类型值,因此消息子类型值中可能存在其他选项。

cksum unsigned short 校验和。

__icmp6 内置变量

__icmp6 是一个特殊内置变量,用于从被过滤包获取 icmpv6 头信息。 用户使用 icmp6 协议在接口层探测包信息时,此内置变量可用。 它在子类型为 bpf 的探针中可用。 可以使用语法 “__icmp6->member”来访问此内置变量的成员元素。

__icmp6 具有下列成员:

表 11. __icmp6 内置变量成员
成员名 类型 描述
类型 unsigned short ICMPV6 消息的类型。

它指定消息类型,用于确定余下数据的格式。

它可与 ICMPV6 类型的下列其中一个内置常量值相匹配。

ICMP6_DST_UNREACH
ICMP6_PACKET_TOO_BIG
ICMP6_TIME_EXCEEDED
ICMP6_PARAM_PROB
ICMP6_INFOMSG_MASK
ICMP6_ECHO_REQUEST
ICMP6_ECHO_REPLY 

请参阅头文件 /usr/include/netinet/icmp6.h 以获取协议值。

注: 并非所有可能的消息类型值都已定义,因此该值中可能存在其他选项。
代码 unsigned short ICMPV6 消息的子类型。

此值取决于消息类型。 它提供额外消息粒度级别。

它可与 ICMPV6 子类型的下列其中一个内置常量值相匹配。

ICMP6_DST_UNREACH_NOROUTE
ICMP6_DST_UNREACH_ADMIN
ICMP6_DST_UNREACH_ADDR
ICMP6_DST_UNREACH_BEYONDSCOPE
ICMP6_DST_UNREACH_NOPORT

请参阅头文件 /usr/include/netinet/icmp6.h 以获取消息子类型值。

注: 并非所有可能的消息子类型值都已定义,因此该值中可能存在其他选项。
cksum unsigned short 校验和。

__igmp 内置变量

__igmp 是一个特殊内置变量,用于从被过滤包获取 igmp 头信息。 用户使用 igmp 协议在接口层探测包信息时,此内置变量可用。 它在子类型为 bpf 的探针中可用。 可以使用语法 "__igmp-> member" 来访问其成员元素。

__igmp 内置变量具有下列成员:

表 12. __igmp 内置变量成员
成员名 类型 描述
类型 unsigned short

IGMP 消息的类型。

例如,Membership Query (0x11), Membership Report (IGMPv1: 0x12, IGMPv2: 0x16, IGMPv3: 0x22), Leave Group (0x17) 有关更多信息,请参阅标准文档或网络文档。

它可与 IGMP 消息类型的下列其中一个内置常量值相匹配。

IGMP_HOST_MEMBERSHIP_QUERY
IGMP_HOST_MEMBERSHIP_REPORT
IGMP_DVMRP
IGMP_HOST_NEW_MEMBERSHIP_REPORT
IGMP_HOST_LEAVE_MESSAGE
IGMP_HOST_V3_MEMBERSHIP_REPORT
IGMP_MTRACE
IGMP_MTRACE_RESP
IGMP_MAX_HOST_REPORT_DELAY

请参阅头文件 /usr/include/netinet/igmp.h 以获取协议值。

注意:未定义所有可能的消息类型值,因此值中可能存在其他选项。

代码 unsigned short

IGMP 类型的子类型。

它可与 IGMP 消息子类型的下列其中一个内置常量值相匹配。

类型 3 的子类型值。


DVMPP_PROBE           1
DVMRP_REPORT          2
DVMRP_ASK_NEIGHBORS   3
DVMRP_ASK_NEIGHBORS2  4
DVMRP_NEIGHBORS       5
DVMRP_NEIGHBORS2      6
DVMRP_PRUNE           7
DVMRP_GRAFT           8
DVMRP_GRAFT_ACK       9
DVMRP_INFO_REQUEST    10
DVMRP_INFO_REPLY      11
注: 并非所有可能的消息子类型值都已定义,因此该值中可能存在其他选项。
cksum unsigned short IGMP 校验和值。
group_addr ip_addr_t

所报告或查询的组地址。

此地址是多点广播地址,发送特定于组或特定于组和源的查询时将查询此地址。 发送常规查询时,此字段发送值零。

数据类型 ip_addr_t 用于存储组 IP 地址。 使用格式说明符“I”来显示 IP 地址。

__arphdr 内置变量

__arphdr 是一个特殊内置变量,用于从被过滤包获取 arphdr 头信息。 用户使用 arprarp 协议在接口层探测包信息时,此变量可用。 它在子类型为 bpf 的探针中可用。可使用 __arphdr->member 语法访问 __arphdr 成员元素。

__arphdr 内置变量具有以下成员:

表 13. __arphdr 内置变量成员
成员名 类型 描述
hw_addr_type unsigned short 硬件地址类型的格式。 此字段标识正在使用的特定数据链路协议。

它可与数据链路协议的下列其中一个内置常量值相匹配:

ARPHRD_ETHER, 
ARPHRD_802_5, 
ARPHRD_802_3, and 
ARPHRD_FDDI

请参阅头文件 /usr/include/net/if_arp.h 以获取协议值。

protocol_type unsigned short 协议地址类型的格式。 此字段标识正在使用的特定网络协议。

它可与网络协议的下列其中一个内置常量值相匹配:

SNAP_TYPE_IP, 
SNAP_TYPE_AP, 
SNAP_TYPE_ARP,
VLAN_TAG_TYPE

请参阅头文件 /usr/include/net/nd_lan.h 以获取协议值。

hdr_len unsigned short MAC 或硬件地址长度。
proto_len unsigned short 协议或 IP 地址长度。
操作 unsigned short 指定发送方正在执行的操作:1 表示请求,2 表示应答。

它可与网络协议的下列其中一个内置常量值相匹配:

ARPOP_REQUEST,
ARPOP_REPLY 

请参阅头文件 /usr/include/net/if_arp.h 以获取协议值。

src_mac_addr mac_addr_t 发送方或源 MAC 地址。

发送方硬件或 MAC 地址存储为 mac_addr_t 数据类型。 格式说明符“%M”用于显示发送方 MAC 或硬件地址。

dst_mac_addr mac_addr_t 目标 MAC 地址。

目标硬件或 MAC 地址存储为 mac_addr_t 数据类型。 格式说明符“%M”用于显示目标 MAC 或硬件地址。

src_ip ip_addr_t 源或发送方 IP 地址。

发送方 IP 地址存储为 ip_addr_t 数据类型。

格式说明符“%I”用于显示发送方 IP 地址。

dst_ip ip_addr_t 目标 IP 地址。

目标 IP 地址存储为 ip_addr_t 数据类型。

格式说明符“%I”用于显示目标 IP 地址。

示例

该 Vue 脚本用于探测通过端口 23 接收/发送的包的包头信息。 提供源和目标节点信息,以及 tcp 头长度信息

@@net:bpf:en0:tcp:"port 23"
{
        printf("src_addr:%I and dst_addr:%I\n",__ip4hdr->src_addr,__ip4hdr->dst_addr);
        printf("src port:%d\n",__tcphdr->src_port);
        printf("dst port:%d\n",__tcphdr->dst_port);
        printf("tcp hdr_len:%d\n",__tcphdr->hdr_len);
}

Output:
# probevue bpf_tcp.e
src_addr:10.10.10.12 and dst_addr:10.10.18.231
src port:48401
dst port:23
tcp hdr_len:20
..................
.................

__proto_info 内置变量

__proto_info 变量是一个特殊内置变量,用来获取 TCP 或 UDP 事件的协议信息(源和目标 IP 地址和端口)。 __proto_info 变量在子类型为 tcpudp 的探针中可用。 可使用 __proto_info->member 语法访问其成员元素。

__proto_info 内置变量具有以下成员:

表 14. __proto_info 内置变量成员
成员名 类型 描述
local_port unsigned short 本地端口
remote_port unsigned short 远程端口
local_addr ip_addr_t 本地地址
remote_addr ip_addr_t 远程地址

特定于 TCP 的事件的其他信息

下表描述了 TCP 状态更改事件:

表 15. TCP 状态更改事件
名称 类型 描述
__prev_state 简短 连接的上一状态信息。
__cur_state 简短 连接的当前状态信息。
它可与 TCP 状态的下列其中一个内置常量值相匹配:
  • TCPS_ESTABLISHED(已建立连接)
  • TPCS_CLOSED(已关闭连接)
  • TPCS_LISTEN(正在侦听连接)
  • TPCS_SYN_SENT(已将 SYN 发送至远程端)
  • TCPS_SYN_RECEIVED(从远程端接收到 SYN)
  • TCPS_CLOSE_WAIT(接收到 FIN,正在等待关闭)
  • TCPS_FIN_WAIT_1(已关闭,已发送 FIN)
  • TCPS_CLOSING(已关闭交换 FIN,正在等待 FIN ACK)
  • TCPS_LAST_ACK(具有 FIN 并关闭,正在等待 FIN ACK)
  • TCPS_FIN_WAIT_2(已关闭,正在确认 FIN)
  • TCPS_TIME_WAIT(关闭后进入 2*msl 静默等待)

这些值是在已导出头文件 /usr/include/netinet/tcp_fsm.h 中定义的。

例如:

以下 Vue 脚本提供特定连接的状态更改信息:

@@net:tcp:state_change
when(__proto_info->local_addr ==”10.10.10.1” and __proto_info->remote_addr == 10.10.10.2”
	and __proto_info->local_port =”8000” and  __proto_info->remote_port =”9000”)
{
	printf(“Previous state:%d and current_state:%d\n”,__prev_state,__cur_state);
}

TCP 重新传输事件

表 16. TCP 重新传输事件
名称 类型 描述
__nth_retransmit unsigned short 第 N 次重新传输

示例

1. 以下示例标识因为侦听器队列已满而废弃连接的侦听器。

@@net:tcp:listen_q_full
{
	printf(“Listener IP address:%I and Port number is:%d\n”,__proto_info->local_addr, __proto_info->local_port);
}

2. 以下示例标识由于套接字缓冲区溢出而删除包的连接

@@net:udp:sock_recv_buf_overflow
{
        printf("Connection information which drops packet due to socket buffer overflows:\n"); 
        printf("Local IP address:%I and Remote IP address:%I\n",__proto_info->local_addr,__proto_info->remote_addr);
        printf("local port :%d and remote port:%d\n",__proto_info->local_port, __proto_info->remote_port);
 }

3. 标识特定连接的 TCP 连接的重新传输(包的第二次以及后续重新传输)。

@@net:tcp:retransmit
when (__proto_info->local_addr == "10.10.10.1" &&
 	__proto_info->remote_addr == "10.10.10.2" && 
__proto_info->local_port == "4000" &&
 	__proto_info->remote_port == "5000")
{
        printf(" %d th re-transmition for this connection\n", _nth_retransmit);
}

4. 每当发生发送方缓冲区变满事件时标识连接信息。

@@net:tcp:send_buf_full
{
        printf("Connection information whenever send buffer full event occurs:\n"); 
        printf("Local IP address:%I and Remote IP address:%I\n",__proto_info->local_addr,__proto_info->remote_addr);
        printf("local port :%d and remote port:%d\n",__proto_info->local_port, __proto_info->remote_port);
 }