Linux中TCP listen()的backlog参数详解
2015-07-21 17:40
639 查看
listen函数是网络编程一个基本的函数,而且它的backlog参数却是和TCP协议息息相关的。我们来看一下一个backlog参数到底有多少秘密。
一、 为了理解backlog参数,我们必须首先认识listen函数。
点击(此处)折叠或打开
#include<sys/socket.h>
int listen(int sockfd, int backlog);
listen函数仅由TCP服务器调用,它做两件事情:
1、当socket函数创建一个套接口时,它被假设为一个主动套装口,也就是说,它是一个将调用connet发起连接的客户套接口。listen函数把一个未连接的套接口转换成一个被动套接口,指示内核应接受指向该套接口的连接请求。根据TCP状态转换图,调用listen导致套接口从CLOSED状态转换到LISTEN状态。
2、本函数的第二个参数规定了内核应该为相应套接口排队的最大连接个数,一般为以下两个队列的大小之和,即未完成三次握手队列 + 已经完成三次握手队列
为了更好的理解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在该队列中放入一项才唤醒它。
二、查看man手册。看看man listen怎么说
三、Linux系统设置未连接队列最大数限制
Linux 系统tcp /ip协议栈有个选项可以设置未连接队列大小限制tcp_max_syn_backlog
Linux 系统中提供somaxconn这个参数,它定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128
一、 为了理解backlog参数,我们必须首先认识listen函数。
点击(此处)折叠或打开
#include<sys/socket.h>
int listen(int sockfd, int backlog);
listen函数仅由TCP服务器调用,它做两件事情:
1、当socket函数创建一个套接口时,它被假设为一个主动套装口,也就是说,它是一个将调用connet发起连接的客户套接口。listen函数把一个未连接的套接口转换成一个被动套接口,指示内核应接受指向该套接口的连接请求。根据TCP状态转换图,调用listen导致套接口从CLOSED状态转换到LISTEN状态。
2、本函数的第二个参数规定了内核应该为相应套接口排队的最大连接个数,一般为以下两个队列的大小之和,即未完成三次握手队列 + 已经完成三次握手队列
为了更好的理解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在该队列中放入一项才唤醒它。
二、查看man手册。看看man listen怎么说
三、Linux系统设置未连接队列最大数限制
Linux 系统tcp /ip协议栈有个选项可以设置未连接队列大小限制tcp_max_syn_backlog
Linux 系统中提供somaxconn这个参数,它定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128
相关文章推荐
- iOS_网络请求_代理方式
- Node.js 的 http 模块
- Java基础—socket--TCP-客户端服务器模式
- iOS_POST_网络请求
- GDB 单步调试 http://www.cppblog.com/baby-fly/archive/2010/07/27/121395.html
- iOS_GET_网络请求
- 该伙伴事务管理器已经禁止了它对远程/网络事务的支持
- Linux中TCP和UDP发送和接收缓冲区
- iOS开发中使用AFNetWorking进行https请求
- 网络字体/图标字体初体验
- 隧道和网络虚拟化:NVGRE vs VXLAN
- ./configure: error: the HTTP rewrite module requires the PCRE library
- linux脚本检测本机与指定IP段网络是否畅通
- httpd 命令解释
- PC-网络教程之宽带小型组网方案
- BAT-使用BAT方法判断网络启动EXE(快捷方式)
- Android 网络通信框架Volley简介(Google IO 2013)
- iOS:关于获取网络类型和运营商信息
- TCP/IP学习(四)TCP缓冲区大小及限制
- ERROR (ConnectionError): HTTPConnectionPool (Caused by <class 'socket.error'>: [Errno 111] Connecti