浅谈tcp socket的backlog参数

最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下。

底层

backlog参数主要用于底层方法int listen(int sockfd, int backlog), 在解释backlog参数之前,我们先了解下tcp在内核的请求过程,其实就是tcp的三次握手:

1、client发送SYN到server,将状态修改为SYN_SEND,如果server收到请求,则将状态修改为SYN_RCVD,并把该请求放到syns queue队列中。

2、server回复SYN+ACK给client,如果client收到请求,则将状态修改为ESTABLISHED,并发送ACK给server。

3、server收到ACK,将状态修改为ESTABLISHED,并把该请求从syns queue中放到accept queue。

在linux系统内核中维护了两个队列:syns queue和accept queue

syns queue

用于保存半连接状态的请求,其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512,不过这个设置有效的前提是系统的syncookies功能被禁用。互联网常见的TCP SYN FLOOD恶意DOS攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致syns queue不能保存其它正常的请求。

accept queue

用于保存全连接状态的请求,其大小通过/proc/sys/net/core/somaxconn指定,在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值。

如果accpet queue队列满了,server将发送一个ECONNREFUSED错误信息Connection refused到client。

应用层

在netty实现中,backlog默认通过NetUtil.SOMAXCONN指定。

当然也可以通过option方法自定义backlog的大小。

backlog设置注意点

前面已经提到过,内核会根据somaxconn和backlog的较小值设置accept queue的大小,如果想扩大accept queue的大小,必须要同时调整这两个参数。

作者:占小狼
链接:https://www.jianshu.com/p/e6f2036621f4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/qiumingcheng/p/9492962.html

时间: 2024-10-11 10:58:36

浅谈tcp socket的backlog参数的相关文章

TCP SOCKET中backlog参数的用途是什么? ---图解

https://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/tcpvariables.html http://www.cnxct.com/something-about-phpfpm-s-backlog/ http://tech.uc.cn/?p=1790 在前年时,业务中遇到好多次因为PHP-FPM的backlog参数引发的性能问题,一直想去详细研究一番,还特意在2013年总结里提到这事<为何PHP5.5.6中fpm backlog Chang

浅谈TCP socket

Socket,用来实现应用的通信,是应用非常广的一个api,今天就来揭开它的神秘面纱. 客户端 引入头文件 #include <winsock2.h> 初始化socket的DLL WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData 创建套接字 SOCKET socket(int domain, int type, int protocol); domain 是协议域,包括 AF_INET 对应 ipv4 AF_INET6 对应 ip

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

浅谈android Socket 通信及自建ServerSocket服务端常见问题

摘  要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通信提供了良好的封装,使用Socket对象代表两端的通信接口,通过Socket产生I/O流进行网络通信. 自建ServerSocket服务端时可能因PC与手机平板终端未接入同一路由器,因此无法访问服本地IP,可以尝试以下两种方式解决 关键词: Socket; ServerSocket;本地IP; ad

Linux网络编程——浅谈 TCP 三次握手和四次挥手

一.tcp协议格式 二.三次握手 在 TCP/IP 协议中.TCP 协议提供可靠的连接服务,採用三次握手建立一个连接. 第一次握手:建立连接时,client发送 syn 包(tcp协议中syn位置1.序号为J)到server,并进入 SYN_SEND 状态.等待server确认: 第二次握手:server收到 syn 包,必须确认客户的 SYN,同一时候自己也发送一个 SYN 包,即 SYN+ACK包(tcp协议中syn位置1,ack位置1.序号K,确定序号为J+1),此时server进入 SY

浅谈 TCP 三次握手

三次握手(three times handshake:three-way handshake)所谓的"三次握手"即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送.接收完毕后何时撤消联系,并建立虚连接. 在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认: 第二次握手:服务器

浅谈TCP的窗口字段

该掸掸这里的灰尘了,写一篇关于TCP的文章吧.今天的主题是TCP的滑动窗口.在开始这个话题之前,我想先提几个关于TCP协议的常见误区. 误区1:TCP协议三次握手过程中后两个包都是[ACK]包. 解释:这种说法并不错,只是不严谨.首先,第一个包是[SYN],SYN位在TCP报头flag字段中,见上图TCP报头结构.第二个包更确切地说应该叫[SYN,ACK]包,因为除了ACK位被置位以外,SYN位也被置位了.第三个包才是单纯的ACK包,因为只有ACK位被置位.所以三次握手的过程为: 客户端----

浅谈Flash Socket通信安全沙箱

用过Flash socket的同学都知道.Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时.会向服务端获取安全策略,假设得不到服务端响应,flash将无法连接到服务端. 首先.什么是Flash安全沙箱? Flash安全沙箱是Flash Socket的一种安全策略.为避免随意Flash终端与目标主机建立Socket通讯,以授权port,域名方式限定连接. 那么.Flash Player怎么获取Socket策略? Flash Player发起socke

[转]浅谈Flash Socket通信安全沙箱

用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无法连接到服务端. 首先,什么是Flash安全沙箱? Flash安全沙箱是Flash Socket的一种安全策略,为避免任意Flash终端与目标主机建立Socket通讯,以授权端口,域名方式限定连接. 那么,Flash Player怎么获取Socket策略? Flash Player发起socket通