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

这篇具有很好参考价值的文章主要介绍了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 中的示例代码如下:文章来源地址https://www.toymoban.com/news/detail-683467.html

/*************************************************************/
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
}

到了这里,关于Linux 使用TCP_INFO查询TCP连接的状态信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手机网络连接性能API接口:查询手机网络连接性能状态

    手机网络连接性能是我们在使用手机时非常关注的一个方面。有时我们会遇到网络不稳定、网速慢等问题,而这些问题往往会影响我们的手机使用体验。因此,了解手机网络连接性能状态对于我们来说非常重要。   在这篇博文中,我将介绍如何使用手机网络连接性能API接口来

    2024年03月16日
    浏览(54)
  • TCP连接不释放,应用产生大量CLOSE_WAIT状态TCP

    23年元旦期间,大家都沉浸在一片祥和的过节气氛当中。 “滴滴滴”,这头同事的电话响起,具体说些什么我也没太在意,但见同事接完电话之后展现出了一副懊恼夹杂着些许不耐烦的表情。 我不解问道:“怎么了?” 同事:“刚刚运营反馈系统开始刷白屏了,所有的请求

    2024年02月05日
    浏览(38)
  • netstat 连接通信的信息和状态

    netstat  常用参数 t  只显示tcp u 只显示udp n num   数字形式显示地址和端口号 l          listen  显示监听端口   p program  显示进程 a all  所有连接和监听 r 显示路由表 netstat  -lnp    显示服务监听端口tcp+udp+socket ,socket 文件也用来同一台服务器的进程之间通信的。 nets

    2024年02月05日
    浏览(23)
  • 浏览器与apache通讯中的TCP连接状态迁移

    前言 浏览器(IE,火狐,谷歌等)和apache都是基于http协议进行通讯的。浏览器在客户端,apache在服务端。http协议是在TCP/IP模型中的应用层。TCP协议状态在TCP/IP模型中的传输层。在浏览一个网站的时候,如果关闭了浏览器,只是关闭了浏览器的进程,浏览器和apache之间的连接

    2024年02月05日
    浏览(35)
  • 【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息

    【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息 在这篇博客中,我将为你介绍一个非常实用的 Flutter 插件: device_info_plus 。这个插件可以帮助我们获取设备的详细信息,如制造商、型号等,以及应用程序正在运行的 Android 或 iOS 版本。 本文的重点如下: 如

    2024年02月05日
    浏览(44)
  • Linux网络编程(TCP状态转换关系)

    本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 客户端状态转换: 1.CLOSED - SYN-SENT:当客户端尝试与服务器建立连接时,客户端从CLOSED状态转换到SYN-SEND状态。此时客户端发送SYN(同步)包,表示请求建立连接,并

    2024年02月07日
    浏览(44)
  • 查询Oracle和MySQL数据库中当前所有连接信息

    查询Oracle当前所有连接信息: 查询MySQL当前所有连接信息: 在这两个查询中,我为每个字段添加了中文别名,以提高查询结果的可读性

    2024年02月12日
    浏览(69)
  • Linux如何查看网络连接状态

    在Linux中,可以使用多个命令来查看网络连接状态,以下是其中几个常用的命令: 1. netstat命令:可以显示系统的网络连接、路由表和网络接口信息。可以使用以下命令来查看所有的网络连接信息:  该命令可以显示所有的网络连接信息,包括TCP和UDP连接。 2. ss命令:该命令可

    2024年02月11日
    浏览(43)
  • Day19_学点儿JavaEE_学生表和班级表连接查询并显示、带查询班级表的学生信息添加、带查询班级并回显的学生信息修改

    重新封装要展示的信息为一个类,并编写相应的Servlet、Service、Dao 学点儿数据库_Day11_多表、等值连接、内连接、模糊查找 StudentDaoImply : 写一套班级的servlet、service、dao,然后在 StudentServlet 里边的 toUpdate 调用一下班级的查询service,一起发送到 student_add.jsp 即可 这就是三层架

    2024年04月14日
    浏览(31)
  • Linux 下查看 VNC 连接状态

    Windows 系统下进行远程连接的时候,往往会使用 VNC,VNC (Virtual Network Computing) 是一种跨平台的远程图形系统,它可以使 Windows,Linux,MacOS 进行远程图形操作系统,尤其是在 Linux 操作系统下,需要远程控制 Linux 系统时,更是不可缺少。本文详细介绍了 Linux 系统下查看 VNC 连接

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包