tcp Send_Q Recv-Q 字段含义 timer 字段含义

转载 2017年01月03日 19:14:49

处于LISTEN状态的socket,Recv-Q表示了current listen backlog队列元素数目(等待用户调用accept的完成3次握手的socket),而Send-Q表示了listen socket最大能容纳的backlog。这个数目由listen时指定,且不能大于 /proc/sys/net/ipv4/tcp_max_syn_backlog;对于非LISTEN socket,Recv-Q表示了receive queue中的字节数目(等待接收的下一个tcp段的序号-尚未从内核空间copy到用户空间的段最前面的一个序号);Send-Q表示发送queue中容纳的字节数(已加入发送队列中最后一个序号-输出段中最早一个未确认的序号


3.ss命令输出解释之timer

linux-19:~ # ss -a -t -o -4
State       Recv-Q Send-Q                                            Local Address:Port                                                Peer Address:Port   
LISTEN      0      128                                                           *:sunrpc                                                         *:*       
LISTEN      0      128                                                           *:47093                                                          *:*       
LISTEN      0      3                                                  192.168.86.1:domain                                                         *:*       
LISTEN      0      3                                                  192.168.0.86:domain                                                         *:*       
LISTEN      0      3                                                    10.0.64.19:domain                                                         *:*       
LISTEN      0      3                                                 192.168.100.3:domain                                                         *:*       
LISTEN      0      3                                                172.16.132.189:domain                                                         *:*       
LISTEN      0      3                                                     127.0.0.2:domain                                                         *:*       
LISTEN      0      3                                                     127.0.0.1:domain                                                         *:*       
LISTEN      0      128                                                           *:ssh                                                            *:*       
LISTEN      0      128                                                   127.0.0.1:ipp                                                            *:*       
LISTEN      0      100                                                           *:smtp                                                           *:*       
LISTEN      0      128                                                   127.0.0.1:953                                                            *:*       
LISTEN      0      64                                                            *:33914                                                          *:*       
LISTEN      0      64                                                            *:nfs                                                            *:*       
LISTEN      0      128                                                           *:35659                                                          *:*       
LISTEN      0      128                                                           *:remotefs                                                        *:*       
LISTEN      0      128                                                  10.0.64.19:6380                                                           *:*       
LISTEN      0      128                                                           *:openvms-sysipc                                                        *:*       
ESTAB       0      0                                                172.16.132.189:ssh                                                172.16.132.93:hs-port  timer:(keepalive,65min,0)
ESTAB       0      0                                                    10.0.64.19:35225                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:46617                                                10.0.64.107:61616   
ESTAB       0      0                                                    10.0.64.19:openvms-sysipc                                                10.0.64.2:videotex 
ESTAB       0      0                                                    10.0.64.19:49462                                                10.0.64.107:61616   
ESTAB       0      0                                                172.16.132.189:ssh                                                172.16.132.85:63934    timer:(keepalive,38min,0)
ESTAB       0      0                                                    10.0.64.19:60569                                                10.0.64.107:61616   
ESTAB       0      0                                                    10.0.64.19:52745                                                10.0.64.129:61616   
ESTAB       0      52                                               172.16.132.189:ssh                                                172.16.132.92:50598    timer:(on,476ms,0)
ESTAB       0      0                                                    10.0.64.19:56401                                                10.0.64.107:61616   
ESTAB       0      0                                                    10.0.64.19:54805                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:60772                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:55510                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:45663                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:39262                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:57775                                                10.0.64.129:61616   
ESTAB       0      0                                                    10.0.64.19:52205                                                 10.0.64.18:6379    
ESTAB       0      0                                                    10.0.64.19:remotefs                                               10.0.64.12:sentinel 

这个输出更上次输出相比,多了一个timer输出。这个输出描述的是tcp socket上的定时器,在说明这个之前先了解一下linux对一个tcp socket可能设置的定时器。
tcp socket总共有7个定时器,通过4个timer实现。分别是
通过icsk_retransmit_timer实现的重传定时器、零窗口探测定时器;通过sk_timer实现的连接建立定时器、保活定时器和FIN_WAIT_2定时器;通过icsk_delack_timer实现的延时ack定时器;以及TIME_WAIT定时器。

我们看一下ss的代码

点击(此处)折叠或打开

  1. static const char *tmr_name[] = {
  2.     "off",
  3.     "on",
  4.     "keepalive",
  5.     "timewait",
  6.     "persist",
  7.     "unknown"
  8. };

点击(此处)折叠或打开

  1. if (show_options) {
  2.         if (r->idiag_timer) {
  3.             if (r->idiag_timer > 4)
  4.                 r->idiag_timer = 5;
  5.             printf(" timer:(%s,%s,%d)",
  6.              tmr_name[r->idiag_timer],
  7.              print_ms_timer(r->idiag_expires),
  8.              r->idiag_retrans);
  9.         }
  10.     }
对应的内核代码是

点击(此处)折叠或打开

  1. if (icsk->icsk_pending == ICSK_TIME_RETRANS) { 
  2.                 r->idiag_timer = 1;
  3.                 r->idiag_retrans = icsk->icsk_retransmits;
  4.                 r->idiag_expires = EXPIRES_IN_MS(icsk->icsk_timeout); 
  5.         } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) { 
  6.                 r->idiag_timer = 4;
  7.                 r->idiag_retrans = icsk->icsk_probes_out;
  8.                 r->idiag_expires = EXPIRES_IN_MS(icsk->icsk_timeout); 
  9.         } else if (timer_pending(&sk->sk_timer)) { 
  10.                 r->idiag_timer = 2;
  11.                 r->idiag_retrans = icsk->icsk_probes_out;
  12.                 r->idiag_expires = EXPIRES_IN_MS(sk->sk_timer.expires); 
  13.         } else {
  14.                 r->idiag_timer = 0;
  15.                 r->idiag_expires = 0; 
  16.         }

点击(此处)折叠或打开

  1. static int inet_twsk_diag_fill(struct inet_timewait_sock *tw,
  2.                                struct sk_buff *skb, int ext, u32 pid,
  3.                                u32 seq, u16 nlmsg_flags,
  4.                                const struct nlmsghdr *unlh)
  5. {
  6.         long tmo;
  7.         struct inet_diag_msg *r;
  8.         const unsigned char *previous_tail = skb_tail_pointer(skb);
  9.         struct nlmsghdr *nlh = NLMSG_PUT(skb, pid, seq,
  10.                                          unlh->nlmsg_type, sizeof(*r));

  11.         r = NLMSG_DATA(nlh);
  12.         BUG_ON(tw->tw_state != TCP_TIME_WAIT);

  13.         nlh->nlmsg_flags = nlmsg_flags;

  14.         tmo = tw->tw_ttd - jiffies;
  15.         if (tmo < 0)
  16.                 tmo = 0;

  17.         r->idiag_family = tw->tw_family;
  18.         r->idiag_retrans = 0;
  19.         r->id.idiag_if = tw->tw_bound_dev_if;
  20.         r->id.idiag_cookie[0] = (u32)(unsigned long)tw;
  21.         r->id.idiag_cookie[1] = (u32)(((unsigned long)tw >> 31) >> 1);
  22.         r->id.idiag_sport = tw->tw_sport;
  23.         r->id.idiag_dport = tw->tw_dport;
  24.         r->id.idiag_src[0] = tw->tw_rcv_saddr;
  25.         r->id.idiag_dst[0] = tw->tw_daddr;
  26.         r->idiag_state = tw->tw_substate;
  27.         r->idiag_timer = 3;
  28.         r->idiag_expires = DIV_ROUND_UP(tmo * 1000, HZ);
  29.         r->idiag_rqueue = 0;
  30.         r->idiag_wqueue = 0;
  31.         r->idiag_uid = 0;
  32.         r->idiag_inode = 0;
这样timer的输出含义就是(类型,过期时间,重试次数),这里说一下类型的含义:

off: 当前socket没有timer
on: 重传timer
keepalive:连接建立timer or fin_wait_2 timer or 保活timer;具体是那个timer,可以根据连接的状态来确定。
timewait: TIME_WAITtimer
persist:零窗口探测timer 
 

http://bbs.csdn.net/topics/390678647

netstat Send-Q Recv-Q,端口状态说明

netstat Send-Q Recv-Q Send-Q 对方没有收到的数据或者说没有Ack的,还是本地缓冲区. Recv-Q 数据已经在本地接收缓冲,但是还没有recv(). CLOSE_WAIT ...
  • taolinke
  • taolinke
  • 2009年12月29日 15:39
  • 11114

Linux打印出netstat -anp 里的Send_Q发送堵的TCP连接

在Linux的终端执行 netstat -anp |grep 9300|awk '$3>50 {print $1,$2,$3,$4,$5,$6}' 终端输出显示Send_Q>50的发送消息队列 ...
  • yjh314
  • yjh314
  • 2016年06月22日 09:05
  • 1621

请教关于Recv-Q和Send-Q的表示的意思

发现服务器的访问速度变得很慢,使用top命令查看发现与平常无异,使用netstat命令得到的部分结果如下:发觉Recv-Q和Send-Q的值都特别大,另外一台正常的服务器Recv-Q和Send-Q值基...

深入剖析Socket---TCP通信底层队列填满的死锁问题

基础准备     首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客...

netstat Recv-Q和Send-Q

通过netstat -anp可以查看机器的当前连接状态: Active Internet connections (servers and established) Proto Rec...
  • jsh13417
  • jsh13417
  • 2013年08月09日 12:54
  • 17678

Netstat 中 Recv-Q和Send-Q状态

执行命令查看当前网络状态时候发现,执行了命令 netstat -anp 发现recv-q 和 send-q 状态不是很正常,对这2个参数不了解,特意学习了一下,简单总结如下: ...
  • yjh314
  • yjh314
  • 2016年04月01日 18:11
  • 4513

Recv-Q&Send-Q

最近线上某些服务器老是报cpu load高,同机房其他机器却没有问题。排查发现以下异常 ss -nl Recv-Q Send-Q                 Local Address:Por...

Netstat 中 Recv-Q和Send-Q状态

执行命令查看当前网络状态时候发现,执行了命令 netstat -anp 发现recv-q 和 send-q 状态不是很正常,对这2个参数不了解,特意学习了一下,简单总结如下: recv-Q 表示网络接...

netstat 中 Recv-Q Send-Q

Recv-Q Send-Q分别表示网络接收队列,发送队列。Q是Queue的缩写。 这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情...
  • joeyon
  • joeyon
  • 2015年06月09日 09:56
  • 1816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:tcp Send_Q Recv-Q 字段含义 timer 字段含义
举报原因:
原因补充:

(最多只允许输入30个字)