Linux 使用TCP_INFO查询TCP连接的状态信息

Linux 上可以使用TCP_INFO查询TCP连接状态信息包括:

发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmss(Advertised MSS)、通过 ACK 确认的累计字节数等等

复制代码
struct tcp_info {
	__u8	tcpi_state;
	__u8	tcpi_ca_state;
	__u8	tcpi_retransmits;
	__u8	tcpi_probes;
	__u8	tcpi_backoff;
	__u8	tcpi_options;
	__u8	tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
	__u8	tcpi_delivery_rate_app_limited:1;

	__u32	tcpi_rto;
	__u32	tcpi_ato;
	__u32	tcpi_snd_mss;
	__u32	tcpi_rcv_mss;

	__u32	tcpi_unacked;
	__u32	tcpi_sacked;
	__u32	tcpi_lost;
	__u32	tcpi_retrans;
	__u32	tcpi_fackets;

	/* Times. */
	__u32	tcpi_last_data_sent;
	__u32	tcpi_last_ack_sent;     /* Not remembered, sorry. */
	__u32	tcpi_last_data_recv;
	__u32	tcpi_last_ack_recv;

	/* Metrics. */
	__u32	tcpi_pmtu;
	__u32	tcpi_rcv_ssthresh;
	__u32	tcpi_rtt;
	__u32	tcpi_rttvar;
	__u32	tcpi_snd_ssthresh;
	__u32	tcpi_snd_cwnd;
	__u32	tcpi_advmss;
	__u32	tcpi_reordering;

	__u32	tcpi_rcv_rtt;
	__u32	tcpi_rcv_space;

	__u32	tcpi_total_retrans;

	__u64	tcpi_pacing_rate;
	__u64	tcpi_max_pacing_rate;
	__u64	tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
	__u64	tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
	__u32	tcpi_segs_out;	     /* RFC4898 tcpEStatsPerfSegsOut */
	__u32	tcpi_segs_in;	     /* RFC4898 tcpEStatsPerfSegsIn */

	__u32	tcpi_notsent_bytes;
	__u32	tcpi_min_rtt;
	__u32	tcpi_data_segs_in;	/* RFC4898 tcpEStatsDataSegsIn */
	__u32	tcpi_data_segs_out;	/* RFC4898 tcpEStatsDataSegsOut */

	__u64   tcpi_delivery_rate;

	__u64	tcpi_busy_time;      /* Time (usec) busy sending data */
	__u64	tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
	__u64	tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
};
  1. `__u8 tcpi_state;`:表示 TCP 连接的状态。

  2. `__u8 tcpi_ca_state;`:表示 TCP 拥塞控制状态。

  3. `__u8 tcpi_retransmits;`:表示已经重传的数据包数量。

  4. `__u8 tcpi_probes;`:表示发送的探测消息数量。

  5. `__u8 tcpi_backoff;`:重传退避指数。

  6. `__u8 tcpi_options;`:表示 TCP 选项的状态。

  7. `__u8 tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;`:发送和接收窗口的缩放因子。

  8. `__u8 tcpi_delivery_rate_app_limited:1;`:表示是否限制传输速率。

  • 9-12行:`__u32` 类型的重传超时时间、ACK 超时时间、发送端最大段大小和接收端最大段大小。

  • 14-18行:`__u32` 类型的未确认字节数、SACK(Selective Acknowledgment)个数、丢失的数据包数、重传的数据包数和 FACK(Forward Acknowledgment)个数。

  • 20-23行:`__u32` 类型的最后发送数据时间、最后发送 ACK 时间、最后接收数据时间和最后接收 ACK 时间。

  • 25-33行:`__u32` 类型的 PMTU(Path MTU)、接收拥塞窗口阈值、RTT(Round Trip Time)、RTTVAR(RTT 变化的方差)、发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmss(Advertised MSS)和数据包重排序的数量。

  • 35-36行:`__u32` 类型的接收 RTT(Round Trip Time)和接收窗口大小。

  • 38行:`__u32` 类型的总的重传次数。

  • 40-42行:`__u64` 类型的 pacing_rate、max_pacing_rate 和通过 ACK 确认的累计字节数。

  • 44-45行:`__u32` 类型的发送段数和接收段数。

  • 47-50行:`__u32` 类型的未发送字节数、最小 RTT(Round Trip Time)、接收到的数据包数和已发送的数据包数。

  • 52行:`__u64` 类型的传输速率。

  • 54-56行:`__u64` 类型的发送数据忙碌时间、受接收窗口限制的时间和受发送缓冲区限制的时间。

iperf 中的示例代码如下:

cpp 复制代码
/*************************************************************/
void
save_tcpinfo(struct iperf_stream *sp, struct iperf_interval_results *irp)
{
#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \
	defined(TCP_INFO)
    socklen_t tcp_info_length = sizeof(struct tcp_info);

    if (getsockopt(sp->socket, IPPROTO_TCP, TCP_INFO, (void *)&irp->tcpInfo, &tcp_info_length) < 0)
	iperf_err(sp->test, "getsockopt - %s", strerror(errno));

    if (sp->test->debug) {
	printf("tcpi_snd_cwnd %u tcpi_snd_mss %u tcpi_rtt %u\n",
	       irp->tcpInfo.tcpi_snd_cwnd, irp->tcpInfo.tcpi_snd_mss,
	       irp->tcpInfo.tcpi_rtt);
    }

#endif
}
相关推荐
工程师00721 小时前
C# HSL 与欧姆龙 CIP 协议(EtherNet/IP)的详细通信
网络协议·tcp/ip·c#·欧姆龙cip协议·hsl
Bigan(安)1 天前
【奶茶Beta专项】【LVGL9.4源码分析】09-core-global全局核心管理
linux·c语言·mcu·arm·unix
老王熬夜敲代码1 天前
进程PCB
linux·笔记
草莓熊Lotso1 天前
GCC/G++ 编译器完全指南:从编译流程到进阶用法(附实操案例)
linux·运维·服务器·网络·c++·人工智能·自动化
qq_281317471 天前
链路穿透-运维
网络
鸠摩智首席音效师1 天前
linux 系统中 Shutting Down, Restarting, Halting 有什么区别 ?
linux·运维·服务器
CIb0la1 天前
Linux 将继续不支持 HDMI 2.1 实现
linux·运维·服务器
老蒋新思维1 天前
创客匠人峰会深度解析:知识变现的 “信任 - 效率” 双闭环 —— 从 “单次交易” 到 “终身复购” 的增长密码
大数据·网络·人工智能·tcp/ip·重构·数据挖掘·创客匠人
卓码软件测评1 天前
第三方高校软件课题验收测试机构:【使用Apifox测试gRPC服务步骤和技巧】
网络·测试工具·测试用例
掘根1 天前
【消息队列】交换机数据管理实现
网络·数据库