tcp/ip协议listen函数中backlog参数的含义与php-fpm的502 Bad Gateway

To understand the backlog argument, we must realize that for a given listening socket, the kernel maintains two queues :
要明白backlog参数的含义,我们必须明白对于一个listening socket,kernel维护者两个队列:

1.An incomplete connection queue, which contains an entry for each SYN that has arrived from a client for which the server is awaiting completion of the TCP three-way handshake. These sockets are in the SYN_RCVD state .
1.一个未完成连接的队列,此队列维护着那些已收到了客户端SYN分节信息,等待完成三路握手的连接,socket的状态是SYN_RCVD

2.A completed connection queue, which contains an entry for each client with whom the TCP three-way handshake has completed. These sockets are in the ESTABLISHED state 
2.一个已完成的连接的队列,此队列包含了那些已经完成三路握手的连接,socket的状态是ESTABLISHED

The backlog argument to the listen function has historically specified the maximum value for the sum of both queues.
backlog参数历史上被定义为上面两个队列的大小之和

Berkeley-derived implementations add a fudge factor to the backlog: It is multiplied by 1.5
Berkely实现中的backlog值为上面两队列之和再乘以1.5

When a SYN arrives from a client, TCP creates a new entry on the incomplete queue and then responds with the second segment of the three-way handshake: the server‘s SYN with an ACK of the client‘s SYN (Section 2.6). This entry will remain on the incomplete queue until the third segment of the three-way handshake arrives (the client‘s ACK of the server‘s SYN), or until the entry times out. (Berkeley-derived implementations have a timeout of 75 seconds for these incomplete entries.)
当客户端的第一个SYN到达的时候,TCP会在未完成队列中增加一个新的记录然后回复给客户端三路握手中的第二个分节(服务端的SYN和针对客户端的ACK),这条记录会在未完成队列中一直存在,直到三路握手中的最后一个分节到达,或者直到超时(Berkeley时间将这个超时定义为75秒)

If the queues are full when a client SYN arrives, TCP ignores the arriving SYN (pp. 930–931 of TCPv2); it does not send an RST. This is because the condition is considered temporary, and the client TCP will retransmit its SYN, hopefully finding room on the queue in the near future. If the server TCP immediately responded with an RST, the client‘s connect would return an error, forcing the application to handle this condition instead of letting TCP‘s normal retransmission take over. Also, the client could not differentiate between an RST in response to a SYN meaning "there is no server at this port" versus "there is a server at this port but its queues are full."
如果当客户端SYN到达的时候队列已满,TCP将会忽略后续到达的SYN,但是不会给客户端发送RST信息,因为此时允许客户端重传SYN分节,如果返回错误信息,那么客户端将无法分清到底是服务端对应端口上没有相应应用程序还是服务端对应端口上队列已满这两种情况

通过下面方式可以修改系统的 somaxconn

vim /etc/sysctl.conf

net.core.somaxconn = 2048

sysctl -p

在 php-fpm 中,有一个选项是关于这个方面的

listen.backlog = -1

这个数值,最好不要设置为 -1 ,-1 的时候没不能采用系统的设置数置,导致出现 502 出现

2015/02/11 12:37:22 [error] 25725#0: *1015645 connect() to unix:/tmp/php-cgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 222.240.64.190,

解决方法就是手动设置这个数值

listen.backlog = 1024

时间: 2024-10-07 06:28:59

tcp/ip协议listen函数中backlog参数的含义与php-fpm的502 Bad Gateway的相关文章

tcp/ip协议listen函数中backlog参数的含义

listen函数的定义如下所示: #include <sys/socket.h> int accept(int sockfd, struct sockaddr * restrict addr, socklen_t *restrict len); 返回值:若成功则返回文件(套接字)描述符,若出错则返回-1 int listen(int sockfd, int backlog);返回值:若成功则返回0:若出错则返回-1 之前看书的时候对listen函数的参数backlog不是很理解,今天看到一篇很

listen()函数中backlog参数分析

实例分析1 将服务器端的listen函数backlog设置为2,用20个客户端与服务器建立连接,查看连接的建立情况. 服务器代码: #include <stdio.h> #include<unistd.h> #include<sys/types.h> /* basic system data types */ #include<sys/socket.h> /* basic socket definitions */ #include<netinet/i

TCP/IP 协议图--网络层中的 IP 协议

IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层--网络层.网络层的主要作用是"实现终端节点之间的通信".这种终端节点之间的通信也叫"点对点通信". 网络的下一层--数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递.而一旦跨越多种数据链路,就需要借助网络层.网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输. IP 大致分为三大作用模块,它们是 IP 寻址.路由(最终节点为止的转发)以及 IP 分包与组包

TCP/IP协议图--网络层中的IP协议

IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层--网络层.网络层的主要作用是"实现终端节点之间的通信".这种终端节点之间的通信也叫"点对点通信". 网络的下一层--数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递.而一旦跨越多种数据链路,就需要借助网络层.网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输. IP 大致分为三大作用模块,它们是 IP 寻址.路由(最终节点为止的转发)以及 IP 分包与组包

网络编程的基本概念,TCP/IP协议简介

8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机.而TCP层则提供面向应

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

tcp ip协议笔记(1)——简介

前言 本人记性不佳,看书健忘,以此笔记来记录看书后自己所知所想,已达到加深对tcp ip的理解,本笔记仅仅是我看完书后自己所写的总结,权当是书后复习. 一.为什么会有tcp ip协议 我们知道中国有56个民族,各个民族有各自的语言,语言就形成了各个民族的障碍,大家都说自己的语言,谁也听不懂对方在讲什么,语言是各个民族之间那道鸿沟,谁也跨不过,照成每个民族都是一个小团体,民族之间不能协同合作成为一个大团体.普通话就解决了这个问题,在民族之间那道鸿沟上建立了一道桥梁,让民族之间可以交流,避免了不

tcp ip协议笔记(1)——简单介绍

??前言 本人记性不佳,看书健忘,以此笔记来记录看书后自己所知所想,已达到加深对tcp ip的理解.本笔记不过我看完书后自己所写的总结,权当是书后复习. 一.为什么会有tcp ip协议 我们知道中国有56个民族.各个民族有各自的语言,语言就形成了各个民族的障碍.大家都说自己的语言,谁也听不懂对方在讲什么,语言是各个民族之间那道鸿沟,谁也跨只是,照成每一个民族都是一个小团体,民族之间不能协同合作成为一个大团体. 普通话就攻克了这个问题,在民族之间那道鸿沟上建立了一道桥梁,让民族之间能够交流,避免了

对TCP/IP协议的理解

话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电脑之间进行通讯所共同遵守的规则,就是网络协议. 那么谁来制定这个网络协议? 国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型.要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息 给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?内容太多太杂,所以OSI模型将这些通