原文:http://blog.csdn.net/kobejayandy/article/details/46989465

#include<sys/socket.h>

int listen(int sockfd, int backlog);

本函数的第二个参数规定了内核应该为相应套接口排队的最大连接个数,一般为以下两个队列的大小之和,即未完成三次握手队列 +  已经完成三次握手队列

为了更好的理解backlog参数,我们必须认识到内核为任何一个给定的监听套接口维护两个队列:

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

2、已完成连接队列(completed connection queue),每个已完成TCP三路握手过程的客户对应其中一项。这些套接口处于ESTABLISHED状态。

当来自客户的SYN到达时,TCP在未完成连接队列中创建一个新项,然后响应以三路握手的第二个分节:服务器的SYN响应,其中稍带对客户SYN的ACK(即SYN+ACK)。这一项一直保留在未完成连接队列中,直到三路握手的第三个分节(客户对服务器SYN的ACK)到达或者该项超时为止(曾经源自Berkeley的实现为这些未完成连接的项设置的超时值为75秒)。如果三路握手正常完成,该项就从未完成连接队列移到已完成连接队列的队尾。当进程调用accept时,已完成连接队列中的队头项将返回给进程,或者如果该队列为空,那么进程将被投入睡眠,直到TCP在该队列中放入一项才唤醒它。


linux系统设置未连接队列最大数限制

linux系统tcp /ip协议栈有个选项可以设置未连接队列大小限制tcp_max_syn_backlog

可以通过命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog   查看

Linux 系统中提供somaxconn这个参数,它定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128

可以通过命令: cat /proc/sys/net/core/somaxconn 查看

nginx 服务器设置backlog为512

现有我们可以来讨论应用层组件:为何有的应用服务器进程中,会单独使用1个线程,只调用accept方法来建立连接,例如tomcat;有的应用服务器进程中,却用1个线程做所有的事,包括accept获取新连接。
原因在于:首先,SYN队列和ACCEPT队列都不是无限长度的,它们的长度限制与调用listen监听某个地址端口时传递的backlog参数有关。既然队列长度是一个值,那么,队列会满吗?当然会,如果上图中第1步执行的速度大于第2步执行的速度,SYN队列就会不断增大直到队列满;如果第2步执行的速度远大于第3步执行的速度,ACCEPT队列同样会达到上限。第1、2步不是应用程序可控的,但第3步却是应用程序的行为,假设进程中调用accept获取新连接的代码段长期得不到执行,例如获取不到锁、IO阻塞等。
那么,这两个队列满了后,新的请求到达了又将发生什么?
若SYN队列满,则会直接丢弃请求,即新的SYN网络分组会被丢弃;如果ACCEPT队列满,则不会导致放弃连接,也不会把连接从SYN列队中移出,这会加剧SYN队列的增长。所以,对应用服务器来说,如果ACCEPT队列中有已经建立好的TCP连接,却没有及时的把它取出来,这样,一旦导致两个队列满了后,就会使客户端不能再建立新连接,引发严重问题。
所以,如TOMCAT等服务器会使用独立的线程,只做accept获取连接这一件事,以防止不能及时的去accept获取连接。
那么,为什么如Nginx等一些服务器,在一个线程内做accept的同时,还会做其他IO等操作呢?
这里就带出阻塞和非阻塞的概念。应用程序可以把listen时设置的套接字设为非阻塞模式(默认为阻塞模式),这两种模式会导致accept方法有不同的行为。对阻塞套接字,accept行为如下图:
这幅图中可以看到,阻塞套接字上使用accept,第一个阶段是等待ACCEPT队列不为空的阶段,它耗时不定,由客户端是否向自己发起了TCP请求而定,可能会耗时很长。
对非阻塞套接字,accept会有两种返回,如下图:
非阻塞套接字上的accept,不存在等待ACCEPT队列不为空的阶段,它要么返回成功并拿到建立好的连接,要么返回失败。
所以,企业级的服务器进程中,若某一线程既使用accept获取新连接,又继续在这个连接上读、写字符流,那么,这个连接对应的套接字通常要设为非阻塞。原因如上图,调用accept时不会长期占用所属线程的CPU时间片,使得线程能够及时的做其他工作。


Linux中TCP listen()的参数相关推荐

  1. linux中tcp连接内核参数调优somaxconn

    永久生效: vim /etc/sysctl.conf net.core.somaxconn=32768 sysctl -p 立即生效: sysctl -w net.core.somaxconn=327 ...

  2. linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记

    关于  SKB序列号的小笔记 为了修改TCP协议,现在遇到了要改动tcp分组的序列号,但是只是在tcp_sendmsg函数中找到了SKB的end_seq  一直没有找到seq 不清楚在那里初始化了,就 ...

  3. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  4. Linux中 C++ main函数参数argc和argv含义及用法

    Linux中 C++ main函数参数argc和argv含义及用法 简介 argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vecto ...

  5. TCP listen() Backlog 参数详解

    int listen(int fd, int backlog); socket系统调用listen只被tcp 服务器使用,他做两件事: 1. 将未链接的套接口转换为被动套接口,指示内核接受向此套接口的 ...

  6. Linux中命令选项及参数简介

    登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着"选项"(英文options)或"参数"(英文arguments).即Linux中 ...

  7. linux中tcp/ip协议实现及嵌入式应用 下载,LINU中TCPIP协议实现及嵌入式应用

    好文网为大家准备了关于LINU中TCPIP协议实现及嵌入式应用范文,好文网里面收集了五十多篇关于好LINU中TCPIP协议实现及嵌入式应用好文,希望可以帮助大家.更多关于LINU中TCPIP协议实现及 ...

  8. 查看linux中tcp连接数

    一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协 ...

  9. python统计字符串中数字个数 socket_Python中socket中的listen()里参数(数字)到底代表什么?...

    在调用socket的时候,我们会使用到listen()函数,里面有个参数叫backlog, 例如:socket.listen(5). 那么这个数字5到底代表什么意思呢? 解答 下面使用具体的代码片段来 ...

最新文章

  1. 用VS2010调试微软开放的部分源码
  2. spark内核回顾思考 RDD
  3. VC中获取窗体句柄的各种方法
  4. m3u8文件在手机上用什么软件看_如何用手机从一个网页下载视频
  5. 面向 Web 前端的原生语言总结手册
  6. 代码中启动ros节点roslaunch和rosrun,代码启动节点与关闭节点,地图切换
  7. 数据结构与计算机网络参考书,2019计算机考研:数据结构参考书及复习重点
  8. 调用支付宝网页支付被浏览器拦截
  9. 批量启用AD中账户的Exchange邮箱
  10. 计算机无法识别 此硬盘,如果计算机无法识别硬盘驱动器,该怎么办?
  11. 聚观早报 | 通信行程卡正式宣布下线;《三体》首日播放量破1亿
  12. 给出三个坐标点,求三角形周长。
  13. kali启动时出现resuming from hibernation错误
  14. 说一说Glide.with()
  15. 《视觉SLAM进阶:从零开始手写VIO》第三讲 基于优化的IMU预积分与视觉信息融合 作业
  16. 森林防火应急指挥GIS系统森林防火监测预警系统
  17. Excel TEXT函数怎么把数值转换成文本
  18. C++中的引用变量详解
  19. Python之建模数值逼近篇--一维插值
  20. web3再牛 也没能逃出这几个老巨头的手掌心

热门文章

  1. 张勋说:钢渣处理和综合利用的原因及效益分析
  2. Qmail+Vpopmail 安装相关文档
  3. 2020年数维杯数学建模A题舆情监测情感倾向分析建模求解全过程文档及程序
  4. vue项目中使用可选链 ( ?. )和双问号 ( ??)详解
  5. CGT Asia 2023第三届亚洲细胞与基因治疗创新峰会将于4月上海召开
  6. http中get/put/post区别
  7. 微调电位器命名规则_电位器物料规格描述规范
  8. hooks useRef 报错object is possibly undefined
  9. 后端服务器常用软件:nginx
  10. 两个月,看完这套资料他终于如愿拿到阿里 Offer 了!