getsockopt


背景: 以下函数

1 bool Socket::getTcpInfo(struct tcp_info* tcpi) const
2 {
3   socklen_t len = sizeof(*tcpi);
4   memZero(tcpi, len);
5   return ::getsockopt(sockfd_, SOL_TCP, TCP_INFO, tcpi, &len) == 0;
6 }

有以下几点不太明白:

1.  struct tcp_info是个什么结构体

2.  getsockopt这个函数的功能是什么

下面一一作答:

这个结构体里面包含的东西就多了,

 1 struct tcp_info {
 2     __u8    tcpi_state;           //tcp state: TCP_SYN_SENT,TCP_SYN_RECV,TCP_FIN_WAIT1,TCP_CLOSE etc
 3     __u8    tcpi_ca_state;     //congestion state:
 4     __u8    tcpi_retransmits;  //重传数,表示当前待重传的包数,这个值在重传完毕后清零
 5     __u8    tcpi_probes;        ///* 持续定时器或保活定时器发送且未确认的段数*/
 6     __u8    tcpi_backoff;        //用来计算持续定时器的下一个设计值的指数退避算法指数,在传送超时是会递增。
 7     __u8    tcpi_options;        //tcp头部选项是否包含:扩展因子、时间戳、MSS等内容
 8     __u8    tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4; //扩展因子数值
 9     __u8    tcpi_delivery_rate_app_limited:1;  //限速标志
10 
11     __u32    tcpi_rto;        //重传超时时间,这个和RTT有关系,RTT越大,rto越大
12     __u32    tcpi_ato;        //用来延时确认的估值,单位为微秒. 
13                             //在收到TCP报文时,会根据本次与上次接收的时间间隔来调整改制,在设置延迟确认定时器也会根据
14                             //条件修改该值
15     __u32    tcpi_snd_mss;    // 本端的MSS
16     __u32    tcpi_rcv_mss;    // 对端的MSS
17 
18     __u32    tcpi_unacked;    //未确认的数据段数
19     __u32    tcpi_sacked;    //2个含义:server端在listen阶段,可以接收连接的数量;收到的SACK报文数量
20     __u32    tcpi_lost;        //本端在发送出去被丢失的报文数。重传完成后清零
21     __u32    tcpi_retrans;   /* 重传且未确认的数据段数 */
22     __u32    tcpi_fackets;
23 
24     /* Times. */
25     __u32    tcpi_last_data_sent;    //当前时间-最近一个包的发送时间,单位是毫秒
26     __u32    tcpi_last_ack_sent;     /* 未使用*/
27     __u32    tcpi_last_data_recv;    //当前时间-最近接收数据包的时间,单位是毫秒
28     __u32    tcpi_last_ack_recv;     //当前时间-最近接收ack的时间,单位是毫秒
29 
30     /* Metrics. */
31     __u32    tcpi_pmtu;            /* 最后一次更新的路径MTU */
32     __u32    tcpi_rcv_ssthresh;   //当前接收窗口的大小
33     __u32    tcpi_rtt;            //smoothed round trip time,微妙    
34     __u32    tcpi_rttvar;        //描述RTT的平均偏差,该值越大,说明RTT抖动越大
35     __u32    tcpi_snd_ssthresh;  //拥塞控制慢开始阈值
36     __u32    tcpi_snd_cwnd;        //拥塞控制窗口大小
37     __u32    tcpi_advmss;        //本端的MSS上限
38     __u32    tcpi_reordering;    /* 没有丢包时,可以重新排序的数据段数 */
39 
40     __u32    tcpi_rcv_rtt;        // 作为接收端,测出的RTT值,单位为微秒. 这个值不是对方计算并传送过来的rtt,而是作为接收端,在没发送数据的情况下
41                                 // 通过接收发送端发送的数据的情况计算得到的rtt值。在数据发送方,如果不接受数据,这个值一般情况下为0。
42     __u32    tcpi_rcv_space;        /* 当前接收缓存的大小 */
43 
44     __u32    tcpi_total_retrans;  //统计总重传的包数,持续增长。
45 
46     __u64    tcpi_pacing_rate;        //发送速率
47     __u64    tcpi_max_pacing_rate;    //最大发送速率,默认是unlimited,可以通过SO_MAX_PACING_RATE来设置
48     __u64    tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
49     __u64    tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
50     __u32    tcpi_segs_out;         /* RFC4898 tcpEStatsPerfSegsOut */
51     __u32    tcpi_segs_in;         /* RFC4898 tcpEStatsPerfSegsIn */
52 
53     __u32    tcpi_notsent_bytes;
54     __u32    tcpi_min_rtt;
55     __u32    tcpi_data_segs_in;    /* RFC4898 tcpEStatsDataSegsIn */
56     __u32    tcpi_data_segs_out;    /* RFC4898 tcpEStatsDataSegsOut */
57 
58     __u64   tcpi_delivery_rate;
59 
60     __u64    tcpi_busy_time;      /* Time (usec) busy sending data */
61     __u64    tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
62     __u64    tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
63 };

基本包含了所有的tcp链接中的信息。

 

 

getsockopt函数的功能就很简单了 就是获取tcp链接过程中的信息


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM