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
}
相关推荐
白堤上的喵14 小时前
信息安全基础知识
网络
IDOlaoluo15 小时前
OpenSSL 1.0.1e 下载解压和运行方法(小白适用 附安装包)
linux
赖龙15 小时前
记录SSL部署,链路不完整问题
网络·网络协议·ssl
豆是浪个15 小时前
Linux(Centos 7.6)命令详解:sar
linux·运维·centos
fie888915 小时前
CentOS下Bind服务的安装与故障排查
linux·运维·centos
fatiaozhang952715 小时前
浪潮CD1000-移动云电脑-RK3528芯片-2+32G-安卓9-2种开启ADB ROOT刷机教程方法
android·网络·adb·电脑·电视盒子·刷机固件·机顶盒刷机
tang7778916 小时前
金融行业:静态与动态代理 IP 的选型与风控
网络·tcp/ip·金融
Xの哲學16 小时前
Linux RCU (Read-Copy-Update) 机制深度分析
linux·网络·算法·架构·边缘计算
東雪蓮☆16 小时前
Linux 网络流量监控 Shell 脚本详解(支持邮件告警)
linux·运维·服务器
吐个泡泡v16 小时前
网络编程基础:一文搞懂 Socket、HTTP、HTTPS、TCP/IP、SSL 的关系
网络·网络协议·http·https·socket·ssl·tcp