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參数的含义的更多相关文章

  1. 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 ...

  2. listen()函数中backlog参数分析

    实例分析1 将服务器端的listen函数backlog设置为2,用20个客户端与服务器建立连接,查看连接的建立情况. 服务器代码: #include <stdio.h> #include& ...

  3. TCP/IP 协议图--网络层中的 IP 协议

    IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层——网络层.网络层的主要作用是“实现终端节点之间的通信”.这种终端节点之间的通信也叫“点对点通信”. 网络的下一层——数据链路层的主要作用是 ...

  4. TCP/IP协议图--网络层中的IP协议

    IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层--网络层.网络层的主要作用是"实现终端节点之间的通信".这种终端节点之间的通信也叫"点对点通信". ...

  5. C++ 中获取 可变形參函数中的參数

    #include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * st ...

  6. 网络编程的基本概念,TCP/IP协议简介

    8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...

  7. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  8. tcp ip 协议安全

    ARP(地址解析协议) 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求 ...

  9. 计算机网络协议OSI TCP/IP协议--001

    网桥:连接同构的LAN的网络互联设备,(同构的LAN 网是,应用层到逻辑层)   实  现的功能是:MAC子层和物理层.1.帧的发送与接收.2.缓冲的管理.3.协议转换. 路由器:在网络层实现互联,他 ...

随机推荐

  1. 「OC」内存管理

    一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空 ...

  2. day4作业

    作业内容:计算器 #!/usr/bin/env python # -*- coding:utf-8 -*- import re,time #加减字符处理函数 def handle_symbol(cal ...

  3. open和fopen的区别:

    1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量.执行 ...

  4. Spring Boot gradle

    最近有写一个电子订单商务网站,使用JAVA8,SPRING,ANGULARJS对项目使用的技术和大家分享. 第一次写博客,哪有不对需要改正的请联系改正. 因为是项目是我给别人做的无法提供源码见谅,我尽 ...

  5. Deep Learning论文笔记之(六)Multi-Stage多级架构分析

    Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些 ...

  6. SQL Server SQL高级查询语句小结(转)

    --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select disti ...

  7. Centos6.4下tar包安装最新版Mysql5.6

    1.下载 mysql:http://www.mysql.com/downloads/ (须要注冊ORACLE账号) 版本号:mysql-advanced-5.6.21-linux-glibc2.5-x ...

  8. 队列的定义与实现(C语言实现)

    小时候.我们做早操的时候或者军训的时候,都排成一列,有头有尾.如果你迟到了,仅仅能站到最后面一个.退场的时候.都是由第一个先走的.这就是队列雏形. 队列的定义 队列是一种特殊的线性表 队列仅在线性表的 ...

  9. stm32之GPIO

    stm32有5组GPIO口,GPIOA GPIOB GPIOC GPIOD GPIOE 每个GPIO端口有: 2个配置寄存器GPIOx_CRL, GPIOx_CRH(32位): 2个数据寄存器GPIO ...

  10. Spring通过AOP实现对Redis的缓存同步

    废话不多说 说下思路:使用aop注解,在Service实现类添加需要用到redis的方法上,当每次请求过来则对其进行拦截,如果是查询则从redis进行get key,如果是update则删除key,防 ...