asp网站开发实例书籍,wordpress文章版权声明,淘宝店铺一年交多少钱,应用制作器Linux 上可以使用TCP_INFO查询TCP连接状态信息包括#xff1a;
发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmss#xff08;Advertised MSS#xff09;、通过 ACK 确认的累计字节数等等
struct tcp_info {__u8 tcpi_state;__u8 tcpi_ca_state;__u8 tcpi_retransmits;__…Linux 上可以使用TCP_INFO查询TCP连接状态信息包括
发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmssAdvertised 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 类型的未确认字节数、SACKSelective Acknowledgment个数、丢失的数据包数、重传的数据包数和 FACKForward Acknowledgment个数。 - 20-23行__u32 类型的最后发送数据时间、最后发送 ACK 时间、最后接收数据时间和最后接收 ACK 时间。 - 25-33行__u32 类型的 PMTUPath MTU、接收拥塞窗口阈值、RTTRound Trip Time、RTTVARRTT 变化的方差、发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmssAdvertised MSS和数据包重排序的数量。 - 35-36行__u32 类型的接收 RTTRound Trip Time和接收窗口大小。 - 38行__u32 类型的总的重传次数。 - 40-42行__u64 类型的 pacing_rate、max_pacing_rate 和通过 ACK 确认的累计字节数。 - 44-45行__u32 类型的发送段数和接收段数。 - 47-50行__u32 类型的未发送字节数、最小 RTTRound Trip Time、接收到的数据包数和已发送的数据包数。 - 52行__u64 类型的传输速率。 - 54-56行__u64 类型的发送数据忙碌时间、受接收窗口限制的时间和受发送缓冲区限制的时间。 iperf 中的示例代码如下
/*************************************************************/
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
}