linux tcp listen函数的参数backlog
1 listen函数(http://man7.org/linux/man-pages/man2/listen.2.html)
int listen(int sockfd, int backlog);
该函数被服务端调用,指明了sockfd所指向的套接字是一个被动套接字,sockfd参数说明内核协议栈需要监听的套接字,backlog参数指定已完成tcp链接队列的容量。

2 tcp三次握手、未完成队列、已完成队列
服务端listen函数调用成功后会马上返回,与此同时系统内核开始监听参数sockfd所指定的套接字,等待客户端发起tcp握手信息。
如上图所示,首先客户端发起syn包时,服务端会回复syn-ack包,此时链接处于未完成状态。服务端内存中会创建一个状态为SYN_RCVD 的连接,放入未完成队列,这个队列的大小可通过/proc/sys/net/ipv4/tcp_max_syn_backlog设置。未完成队列中每个链接都维护有一个定时器,如果网络超时没有在时限内收到相应的ack,会重发syn-ack包,如果多次无效则停止,并从未完成队列中取消该连接。(次数在这里指定/proc/sys/net/ipv4/tcp_synack_retries )
如上图所示,当客户端收到服务端的syn-ack包后,会发出ack包进行确认,服务端接收ack确认,此时tcp三次握手完成。服务端中该链接的状态会变成ESTABLISHED,同时该链接会移交到内存的已完成队列中。这个队列的最大容量就是通过backlog参数指定的。该队列会随着越来越多的客户端与服务器完成tcp三次握手而增长。直到达到backlog指定的上限。如果已完成队列满了,系统收到新的ack包时,协议栈的行为取决于 /proc/sys/net/ipv4/tcp_abort_on_overflow的设置。如若为1,直接回rst包,结束链接,否则忽视ack包。
此时,服务端应用层一般可以使用accept函数(该函数是一个阻塞函数),从已完成队列中获取一个tcp链接并返回一个套接字的文件描述符,与此同时已完成队列会空出一个位置,从而内核协议栈又可以接受新的已完成三次握手的tcp链接。
linux tcp listen函数的参数backlog的更多相关文章
- linux中probe函数传递参数的寻找(下)
点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...
- 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- Linux TCP/IP调优参数 /proc/sys/net/目录
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...
- [TCP/IP] TCP在listen时的参数backlog的意义
linux内核中会维护两个队列: 1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态 2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态 3)当有一个S ...
- Linux中,Tomcat 怎么承载高并发(深入Tcp参数 backlog)
一.前言 这两天看tomcat,查阅 tomcat 怎么承载高并发时,看到了backlog参数.我们知道,服务器端一般使用mq来减轻高并发下的洪峰冲击,将暂时不能处理的请求放入队列,后续再慢慢处理.其 ...
- 深入探索 Linux listen() 函数 backlog 的含义
1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...
- tcp/ip协议listen函数中backlog參数的含义
listen函数的定义例如以下所看到的: #include <sys/socket.h> int accept(int sockfd, struct sockaddr * restrict ...
- listen()函数中backlog参数分析
实例分析1 将服务器端的listen函数backlog设置为2,用20个客户端与服务器建立连接,查看连接的建立情况. 服务器代码: #include <stdio.h> #include& ...
- Linux TCP/IP调优-Linux内核参数注释
固定文件的内核参数 下列文件所在目录: /proc/sys/net/ipv4/ 名称 默认值 建议值 描述 tcpsyn_retries 5 1 对于一个新建连接,内核要发送多少个SYN连接请求才决定 ...
随机推荐
- Linux监控工具介绍系列——iostat
文章转自:https://www.cnblogs.com/ghj1976/p/5691857.html Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iost ...
- codeforces gym #101161E - ACM Tax(lca+主席树)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 ...
- Fiddler 安装使用
Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能 ...
- HDU 1160 FatMouse's Speed ——(DP)
又是那个lis变形的题目. 但是不好定义严格的比较符号,因此只能n^2去做.值得注意的一个是要先排序,因为可能可以先选后面的再选前面的,先排序的话就能够避免这个问题.但是要注意,因为要输出路径,所以要 ...
- An error occurred while starting a transaction on the provider connection. See the inner exception for details.
用EntityFramework循环操作数据时,报了如下错误 An error occurred while starting a transaction on the provider connec ...
- WIN7+QT5.2.0 连接oracle11g问题及解决方法
用下面的代码建立连接之后,出现了几个问题 //连接数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QOCI"); /**连接Ora ...
- 在windows平台下搭建Django项目虚拟环境
参考文档:https://www.cnblogs.com/lovele-/p/8719126.html https://blog.csdn.net/lwcaiCSDN/article/details ...
- Projects: Linux scalability: Accept() scalability on Linux 惊群效应
小结: 1.不必要的唤醒 惊群效应 https://github.com/benoitc/gunicorn/issues/792#issuecomment-46718939 https://www.c ...
- Kali Linux更新5.2.9后 Vmware Workstation无法正常启动
说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 最近更新了Kali后发现一个奇葩的问题,我的虚拟机不能正常使用了.启 ...
- Object.keys() 遍历对象
Object.keys()方法的运用与数组遍历 Object.keys()用于获得由对象属性名组成的数组,可与数组遍历相结合使用,用起来效果杠杠滴.数组遍历可以用for()或forEach()来实现, ...