网络探针管理器
网络探测器管理器跟踪系统中的传入和传出网络包 (包信息由 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 网络堆栈层。 此元组可具有下列其中一个值(不能为 *):
第二元组(子类型) | 描述 |
---|---|
bpf | 包与特定过滤器匹配时,此探针在网络接口层启动。 |
tcp | 此探针针对特定于 TCP 协议的事件启动。 |
udp | 此探针针对特定于 UDP 协议的事件启动。 |
探针网络事件或收集网络包信息
第三元组特定于特定子类型(在第二元组中指定)。 它不能具有值 *。
基于 bpf 的探针
此规范包含 5 个元组,以用于下表中描述的基于 bpf 的探针:
第二元组(子类型) | 后续元组 | 描述 |
---|---|---|
bpf |
第三元组:接口名称 | 此元组指定可针对其捕获包信息的一个接口或一组接口。 可能的值为 enX (例如,en0 和 en1 )以及 lo0 。 此元组不支持值 *。 可一次指定一个或多个接口(通过将 | 用作分隔符)。 |
第四元组:协议 | 此元组指定用于启动探针的网络协议。 可能的值为 ether, arp, rarp, ipv4, ipv6, tcp, udp, icmp4, icmp6 和 igmp 。 在 Vue 脚本中填充特定于协议的内置项以用于访问。 例如,协议值 ipv4 将填充 __ip4hdr 内置项。此元组的值 *
指示此探针针对与指定过滤器相匹配的所有协议类型启动。 如果协议为 *,那么网络探针管理器所支持的所有内置值对于 Vue 脚本都不可用。 可通过使用 Vue 函数
copy_kdata
() 来访问所请求大小的原始包数据并映射至对应协议头。注: 将 * 指定为与过滤器匹配的指定接口上的所有入局和出局信息包启动探测器时,可能会使性能更强。 包信息跨越多个包缓冲区时,还涉及副本。
|
|
bpf |
第五元组:bpf 过滤器字符串 | 此元组指定 bpf 过滤表达式(tcpdump 命令中指定的过滤表达式)。 提供的过滤表达式必须括在双引号中。 第四元组中指定的过滤表达式和协议必须兼容。 值 * 在此元组中不受支持。 |
- 规范格式,接口 en0 在端口 23 上接收或发送包(过滤器字符串“port 23”)时,用于从 Vue 脚本访问与以太网头 (
__etherhdr
)、IP 头(__ip4hdr
或__ip6hdr
)及 TCP 头 (__tcphdr
) 信息相关的内置变量:@@net:bpf:en0:tcp:“port 23”
- 规范格式,系统在 en0 和 en1 接口上从主机 example.com 接收或发送包(过滤器字符串“example.com”)时,用于从 Vue 脚本访问与以太网头 (
__etherhdr
)、IP 头(__ip4hdr
或__ip6hdr
)和 UDP 头 (__udphdr
) 信息相关的内置变量:@@net:bpf:en0|en1:udp:“host example.com”
- 规范格式,系统从主机 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 探针:
第二元组(子类型) | 事件(第三元组) 值 * 在此元组中不受支持。 |
描述 |
---|---|---|
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
探针,此规范包含三个元组,如下表中所示:
第二元组(子类型) | 事件(第三元组) 值 * 在此元组中不受支持。 |
描述 |
---|---|---|
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 内置值具有以下成员:
成员名 | 类型 | 描述 |
---|---|---|
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 的下列其中一个内置常量值相匹配:
请参阅头文件 |
__ip4hdr 变量是一个特殊内置变量,用于从被过滤包获取 IPv4 头信息。 在接口层使用下列任一协议探测包信息时,此内置变量可用:“ipv4”、“tcp”、“udp”、“icmp4”和“igmp”。 而且,IP 版本为 IPv4 时它具有有效数据。 此变量在子类型为 bpf
的探针中可用。 可使用
__ip4hdr->member
语法访问其成员元素。
此内置变量具有下列成员:
成员名 | 类型 | 描述 |
---|---|---|
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 等等。 它可与协议的下列其中一个内置常量值相匹配。
请参阅头文件
|
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 数据报的开头)。 第一个片段的偏移量为零。 它可与其中一个内置常量
请参阅头文件 |
__ip6hdr 内置变量
__ip6hdr 变量是一个特殊内置变量,用于从被过滤包获取 IPv6 头信息。 用户在接口层探测包信息时,此变量可用。 IP 版本为 IPv6 时,带有任一协议(“ipv6”、“tcp”、“udp”和“icmp6”)的此变量具有有效数据。 此变量在子类型为 bpf
的探针中可用。 可使用
__ip6hdr->member
语法访问其成员元素。
此内置变量具有下列成员:
成员名 | 类型 | 描述 |
---|---|---|
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 请参阅头文件
|
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 内置变量具有以下成员:
成员名 | 类型 | 描述 |
---|---|---|
src_port | unsigned short | 包的源端口。 |
dst_port | unsigned short | 包的目标端口。 |
标志 | unsigned short | 这些值是控制位,设置它们是为了指示控制信息的通信。 每个标志占用 1 位。 它可与其中一个内置常量标志值相匹配。 标志值必须是按位设置的,并且与内置常量标记值一起验证是否存在特定标志。
请参阅 TCP 文档以获取有关这些标记的详细信息,请参阅头文件 |
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 内置变量具有下列成员:
成员名 | 类型 | 描述 |
---|---|---|
src_port | unsigned short | 包的源端口。 |
dst_port | unsigned short | 包的目标端口。 |
长度 | unsigned short | UDP 头和数据长度信息。 |
cksum | unsigned short | 校验和。 |
__icmp 内置变量
__icmp 是一个特殊内置变量,用于从被过滤包获取 icmp 头信息。 用户使用 icmp 作为协议在接口层探测包信息时,此内置变量可用。 它在子类型为 bpf 的探针中可用。 可使用
__icmp->member
语法访问其成员元素。
此内置变量具有下列成员:
成员名 | 类型 | 描述 |
---|---|---|
类型 | unsigned short | ICMP 消息的类型。 例如:0 - 回传应答,8 - 回传请求,3 - 目标不可访问。 查看所有类型。 有关更多信息,请参阅标准网络文档。 它可与 ICMP 消息类型的下列其中一个内置常量值相匹配:
请参阅头文件
注: 未定义所有可能的消息类型值,因此该值中可能存在其他选项。
|
代码 | 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 的子类型值如下所示:
类型 6 的子类型值 类型 6 的子类型值如下所示:
类型 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 具有下列成员:
成员名 | 类型 | 描述 |
---|---|---|
类型 | unsigned short | ICMPV6 消息的类型。 它指定消息类型,用于确定余下数据的格式。 它可与 ICMPV6 类型的下列其中一个内置常量值相匹配。
请参阅头文件
注: 并非所有可能的消息类型值都已定义,因此该值中可能存在其他选项。
|
代码 | unsigned short | ICMPV6 消息的子类型。 此值取决于消息类型。 它提供额外消息粒度级别。 它可与 ICMPV6 子类型的下列其中一个内置常量值相匹配。
请参阅头文件 注: 并非所有可能的消息子类型值都已定义,因此该值中可能存在其他选项。
|
cksum | unsigned short | 校验和。 |
__igmp 内置变量
__igmp 是一个特殊内置变量,用于从被过滤包获取 igmp
头信息。 用户使用
igmp
协议在接口层探测包信息时,此内置变量可用。 它在子类型为 bpf
的探针中可用。 可以使用语法 "__igmp-> member" 来访问其成员元素。
__igmp 内置变量具有下列成员:
成员名 | 类型 | 描述 |
---|---|---|
类型 | unsigned short | IGMP 消息的类型。 例如, 它可与 IGMP 消息类型的下列其中一个内置常量值相匹配。
请参阅头文件
注意:未定义所有可能的消息类型值,因此值中可能存在其他选项。 |
代码 | unsigned short | IGMP 类型的子类型。 它可与 IGMP 消息子类型的下列其中一个内置常量值相匹配。 类型 3 的子类型值。
注: 并非所有可能的消息子类型值都已定义,因此该值中可能存在其他选项。
|
cksum | unsigned short | IGMP 校验和值。 |
group_addr | ip_addr_t | 所报告或查询的组地址。 此地址是多点广播地址,发送特定于组或特定于组和源的查询时将查询此地址。 发送常规查询时,此字段发送值零。 数据类型 ip_addr_t 用于存储组 IP 地址。 使用格式说明符“I”来显示 IP 地址。 |
__arphdr 内置变量
__arphdr 是一个特殊内置变量,用于从被过滤包获取 arphdr
头信息。 用户使用 arp
或 rarp
协议在接口层探测包信息时,此变量可用。 它在子类型为 bpf
的探针中可用。可使用 __arphdr->member
语法访问 __arphdr
成员元素。
__arphdr 内置变量具有以下成员:
成员名 | 类型 | 描述 |
---|---|---|
hw_addr_type | unsigned short | 硬件地址类型的格式。 此字段标识正在使用的特定数据链路协议。 它可与数据链路协议的下列其中一个内置常量值相匹配:
请参阅头文件 /usr/include/net/if_arp.h 以获取协议值。 |
protocol_type | unsigned short | 协议地址类型的格式。 此字段标识正在使用的特定网络协议。 它可与网络协议的下列其中一个内置常量值相匹配:
请参阅头文件 |
hdr_len | unsigned short | MAC 或硬件地址长度。 |
proto_len | unsigned short | 协议或 IP 地址长度。 |
操作 | unsigned short | 指定发送方正在执行的操作:1 表示请求,2 表示应答。 它可与网络协议的下列其中一个内置常量值相匹配:
请参阅头文件
|
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 地址存储为 格式说明符“%I”用于显示发送方 IP 地址。 |
dst_ip | ip_addr_t | 目标 IP 地址。 目标 IP 地址存储为 格式说明符“%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
变量在子类型为 tcp
或 udp
的探针中可用。 可使用
__proto_info->member
语法访问其成员元素。
__proto_info 内置变量具有以下成员:
成员名 | 类型 | 描述 |
---|---|---|
local_port | unsigned short | 本地端口 |
remote_port | unsigned short | 远程端口 |
local_addr | ip_addr_t | 本地地址 |
remote_addr | ip_addr_t | 远程地址 |
特定于 TCP 的事件的其他信息
下表描述了 TCP 状态更改事件:
名称 | 类型 | 描述 |
---|---|---|
__prev_state | 简短 | 连接的上一状态信息。 |
__cur_state | 简短 | 连接的当前状态信息。 |
它可与 TCP 状态的下列其中一个内置常量值相匹配:
这些值是在已导出头文件 |
例如:
以下 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 重新传输事件
名称 | 类型 | 描述 |
---|---|---|
__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);
}