listen 函数中参数 backlog
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了listen 函数中参数 backlog相关的知识,希望对你有一定的参考价值。
参考技术A 我们该如何理解 listen 函数中的参数 backlog?如果 backlog 表示的是未完成连接队列的大小,那么已完成连接的队列的大小有限制吗?如果都是已经建立连接的状态,那么并发取决于已完成连接的队列的大小吗?backlog 的值含义从来就没有被严格定义过。原先 Linux 实现中,backlog 参数定义了该套接字对应的未完成连接队列的最大长度 (pending connections)。如果一个连接到达时,该队列已满,客户端将会接收一个 ECONNREFUSED 的错误信息,如果支持重传,该请求可能会被忽略,之后会进行一次重传。
从 Linux 2.2 开始,backlog 的参数内核有了新的语义,它现在定义的是已完成连接队列的最大长度,表示的是已建立的连接(established connection),正在等待被接收(accept 调用返回),而不是原先的未完成队列的最大长度。现在,未完成队列的最大长度值可以通过 /proc/sys/net/ipv4/tcp_max_syn_backlog 完成修改,默认值为 128。
至于已完成连接队列,如果声明的 backlog 参数比 /proc/sys/net/core/somaxconn 的参数要大,那么就会使用我们声明的那个值。实际上,这个默认的值为 128。注意在 Linux 2.4.25 之前,这个值是不可以修改的一个固定值,大小也是 128。
设计良好的程序,在 128 固定值的情况下也是可以支持成千上万的并发连接的,这取决于 I/O 分发的效率,以及多线程程序的设计。在后面的性能篇里,我们的目标就是设计这样的程序。
https://time.geekbang.org/column/article/135735
以上是关于listen 函数中参数 backlog的主要内容,如果未能解决你的问题,请参考以下文章
TypeError('"listener" 参数必须是函数');