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. django 基础入门(一)

    1. django 基本命令 新建project django-admin.py startproject project-name 新建app python manage.py startapp a ...

  2. poj 1150 The Last Non-zero Digit

    /** 大意: 求A(n,m)的结果中从左到右第一个非零数 思路: 0是由2*5的得到的,所以将n!中的2,5约掉可得(2的数目比5多,最后再考虑进去即可) 那n!中2 的个数怎么求呢? int ge ...

  3. (IOS)国际本地化设置

    首先New File,在Resource中选择Strings File: 然后命名该strings文件,必须命名为 Localizable : 再者选中该strings文件,在Localization ...

  4. sql中charindex和cast结合使用

    1.CHARINDEX函数常常用来在一段字符中搜索字符或者字符串. 语法 CHARINDEX ( expression1 , expression2 [ , start_location ] ) 返回 ...

  5. C++堆和栈的比较(7个区别)

    基础知识: 堆 栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称 为入栈和出栈.有一组CPU指令可以实现 ...

  6. Hadoop Hive与Hbase整合+thrift

    Hadoop Hive与Hbase整合+thrift 1.  简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...

  7. 【转】Android数字证书

    Android数字证书的作用是非常重要的.Android操作系统每一个应用程序的安装都需要经过这一数字证书的签名. Android手机操作系统作为一款比较流行的开源系统在手机领域占据着举足轻重的地位. ...

  8. STL之优先级队列priority_queue

    摘要: priority_queue,自适应容器(即容器适配器):不能由list来组建: 最大值优先级队列(最大值始终在对首,push进去时候) 最小值优先级队列: 优先级队列适配器 STL  pri ...

  9. stm32之中断系统

    概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...

  10. 静态化 - 伪静态技术(Apache Rewrite 实现)

    打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉.没有则添加,但必选独占一行,使a ...