TCP协议中的backlog参数

2018-05-10  本文已影响0人  cp3_1dbc

backlog参数的含义

TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢?

backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态全连接状态两种队列大小。

在Linux内核2.2之后,分离为两个backlog来分别限制半连接(SYN_RCVD状态)队列大小和全连接(ESTABLISHED状态)队列大小。

两个队列在连接过程中所处的位置如下图所示:

tcp_backlog.png

如何查看监听状态

chris@chris-VirtualBox:/media/sf_share/myspace$ netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:5555                  *:*                     LISTEN     
tcp        0      0 chris-VirtualBox:domain *:*                     LISTEN     
tcp        0      0 localhost:ipp           *:*                     LISTEN     
tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN     
udp        0      0 *:mdns                  *:*                                
udp        0      0 *:42226                 *:*                                
udp        0      0 *:57698                 *:*                                
udp        0      0 *:ipp                   *:*                                
udp        0      0 chris-VirtualBox:domain *:*                                
udp        0      0 *:bootpc                *:*                                
udp6       0      0 [::]:mdns               [::]:*                             
udp6       0      0 [::]:38317              [::]:*                             
raw6       0      0 [::]:ipv6-icmp          [::]:*     

Recv-Q & Send-Q

先看下man netstat中的说明:

这里有一篇关于这两个队列的分析文章,https://www.cnblogs.com/leezhxing/p/5329786.html,结论是这样,要区分LISTEN状态和其他状态:

在我的机器上做了下验证

$ uname -a
Linux ubuntu 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

在8888这个端口启动一个监听程序, 程序中不accept

$ netstat -apn |grep 8888
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      5399/thundering_her
telnet 127.0.0.1 8888
$ ss -l |grep 8888
LISTEN      2      50                                       127.0.0.1:8888                                              *:* 

Send-Q为2,Recv-Q为listen中设置的值

结论:
两个命令中Send-Q和Recv-Q的含义是不同的,

上一篇下一篇

猜你喜欢

热点阅读