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 socket,内核都会为维护两个队列:
- SYN队列:此队列维护着那些已收到了clientSYN网络分组。并发出了SYN/ACK网络分组,等待完毕三路握手的连接,socket的状态是SYN_RCVD;
- ACCEPT队列:此队列包括了那些已经完毕三路握手的连接。socket的状态是ESTABLISHED。
backlog參数历史上被定义为上面两个队列的大小之和。而Berkely实现中的backlog值为上面两队列之和再乘以1.5。
调用accept函数正确返回之后,就表示TCP三次握手已完毕,SYN队列中对应的分组会被加到ACCEPT队列中。
#include <sys/socket.h> int accept( int sockfd, struct sockaddr * restrict addr, socklen_t *restrict len); 返回值:若成功则返回文件(套接字)描写叙述符,若出错则返回-1
当client的第一个SYN到达的时候,TCP会在未完毕队列中添加一个新的记录然后回复给client三路握手中的第二个分节(服务端的SYN和针对client的ACK),这条记录会在未完毕队列中一直存在,直到三路握手中的最后一个分节到达,或者直到超时(Berkeley时间将这个超时定义为75秒)。
假设当clientSYN到达的时候队列已满,TCP将会忽略兴许到达的SYN,可是不会给client发送RST信息,由于此时同意client重传SYN分节,假设返回错误信息。那么client将无法分清究竟是服务端相应port上没有相应应用程序还是服务端相应port上队列已满这两种情况。
对于应用server来说。假设ACCEPT队列中有已经建立好的TCP连接,却没有及时把它取出来。这样,一旦导致两个队列满之后。就会使client不能再建立新连接,引发严重问题。
所以,一些server会使用一个主进程来做accept获取连接,而让其它工作进程来进行其它数据处理等工作。这样能够防止不能及时的去accept获取连接。
tcp/ip协议listen函数中backlog參数的含义的更多相关文章
- 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 ma ...
- listen()函数中backlog参数分析
实例分析1 将服务器端的listen函数backlog设置为2,用20个客户端与服务器建立连接,查看连接的建立情况. 服务器代码: #include <stdio.h> #include& ...
- TCP/IP 协议图--网络层中的 IP 协议
IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层——网络层.网络层的主要作用是“实现终端节点之间的通信”.这种终端节点之间的通信也叫“点对点通信”. 网络的下一层——数据链路层的主要作用是 ...
- TCP/IP协议图--网络层中的IP协议
IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层--网络层.网络层的主要作用是"实现终端节点之间的通信".这种终端节点之间的通信也叫"点对点通信". ...
- C++ 中获取 可变形參函数中的參数
#include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * st ...
- 网络编程的基本概念,TCP/IP协议简介
8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...
- TCP/IP协议学习之实例ping命令学习笔记
TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...
- tcp ip 协议安全
ARP(地址解析协议) 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求 ...
- 计算机网络协议OSI TCP/IP协议--001
网桥:连接同构的LAN的网络互联设备,(同构的LAN 网是,应用层到逻辑层) 实 现的功能是:MAC子层和物理层.1.帧的发送与接收.2.缓冲的管理.3.协议转换. 路由器:在网络层实现互联,他 ...
随机推荐
- 「OC」内存管理
一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空 ...
- day4作业
作业内容:计算器 #!/usr/bin/env python # -*- coding:utf-8 -*- import re,time #加减字符处理函数 def handle_symbol(cal ...
- open和fopen的区别:
1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量.执行 ...
- Spring Boot gradle
最近有写一个电子订单商务网站,使用JAVA8,SPRING,ANGULARJS对项目使用的技术和大家分享. 第一次写博客,哪有不对需要改正的请联系改正. 因为是项目是我给别人做的无法提供源码见谅,我尽 ...
- Deep Learning论文笔记之(六)Multi-Stage多级架构分析
Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些 ...
- SQL Server SQL高级查询语句小结(转)
--select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select disti ...
- Centos6.4下tar包安装最新版Mysql5.6
1.下载 mysql:http://www.mysql.com/downloads/ (须要注冊ORACLE账号) 版本号:mysql-advanced-5.6.21-linux-glibc2.5-x ...
- 队列的定义与实现(C语言实现)
小时候.我们做早操的时候或者军训的时候,都排成一列,有头有尾.如果你迟到了,仅仅能站到最后面一个.退场的时候.都是由第一个先走的.这就是队列雏形. 队列的定义 队列是一种特殊的线性表 队列仅在线性表的 ...
- stm32之GPIO
stm32有5组GPIO口,GPIOA GPIOB GPIOC GPIOD GPIOE 每个GPIO端口有: 2个配置寄存器GPIOx_CRL, GPIOx_CRH(32位): 2个数据寄存器GPIO ...
- Spring通过AOP实现对Redis的缓存同步
废话不多说 说下思路:使用aop注解,在Service实现类添加需要用到redis的方法上,当每次请求过来则对其进行拦截,如果是查询则从redis进行get key,如果是update则删除key,防 ...