Listen第二个参数的意义

时间:2024-01-02 16:36:56

今天主要回顾下listen的第二个参数的意义。 话说现在现在都是用框架写业务代码。真的很少在去关注最基本的socket函数的意义了。该忘得都忘得差不多了。~~~  要慢慢捡起来。  主要是在看redis网络这块的时候它的第二个参数设置的是500多。  而且突然想到当初几年前腾讯电话面试问过我第二个参数是什么意思。当时我一股脑就说成connet的连接数量了。哈哈  2b.

照例 先上图,再解析

Listen第二个参数的意义

首先这个图是展示的TCP 三次握手。这里就不吸收三次握手了。我们主要是关注 两个队列

1:未完成队列:每个这样的SYN分节对应其中一项,已有某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD

2:已完成队列:每个已经完成TCP三路握手过程的客户对应其中一项。 这些套接口处于ESTABLISHED

这里说下对着两个队列的理解

假设未完成队列设置为100,  有并发1000个请求过来。假如系统处理过慢。那么系统会做以下几件事

1) 因为未完成队列只有100个。先放100个请求过来处理三次握手。其他的请求直接拒绝。TCP会忽略该分节,也就是不送RST,这样客户端将重发SYN,期望在未完成队列中找到位置

2)每处理完一个三次握手动作。就放一个SYN请求过来。并站住未完成队列一个位置。除非三次握手完成(成功或者失败)、或者超时就把该请求连接移除未完成队列。如果系统性能好。这个动作会很快。

3)完成TCP三次握手的请求放到已完成队列里。

这个时候再去看 listen的第二个参数。

其实这里man listen的时候已经解释的很清楚了

   The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.  If a connection request arrives when  the  queue  is full,  the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.

    第二个参数就是未完成队列的大小

但是继续man listen函数 看到如下解释

The  behavior  of  the  backlog  argument on TCP sockets changed with Linux 2.2.  Now it specifies the queue length for completely established sockets waiting to be accepted,  instead  of  the  number  of  incomplete  connection  requests.   The  maximum  length  of  the  queue  for  incomplete  sockets   can   be   set   using  /proc/sys/net/ipv4/tcp_max_syn_backlog.   When  syncookies are enabled there is no logical maximum length and this setting is ignored.  See tcp(7) for more information.

        在linux 2.2以后  listen的第二个参数。指的是在完成TCP三次握手后的队列。即在系统accept之前的队列。已经完成的队列。如果系统没有调用accpet把这个队列的数据拿出来。一旦这个队列满了。未连接队列的请求过不来。导致未连接队列里的请求会超时或者拒绝。如果系统调用了accpet队列接受请求数据。那么就会把接受到请求移除已完成队列。 这时候已完成队列又可以使用了。

最后 说了如果开启了syncookies  忽略listen的第二个参数

syncookie 主要是为了防止syn flood攻击。这里暂时先不说。以后再补充

总结

1,这里可以感受到  内核用了两个队列。 可以针对并发请求的时候。及时拒绝掉一部分处理不过来的请求。防止盲等待。类似有点雪崩处理的感觉。

2,listen的第二个参数。跟系统的链接数量没有任何关系。相当于设置一个瞬间能够处理的阈值。

3,一般情况下都会去开启 syncookie。所有其实现在已经可以不太关系listen的第二个值了