1. listen函数:

#include <sys/socket.h>

int listen(int sockfd, int backlog);

ret-成功返回0 失败返回-

listen仅由服务器调用,它做两件事情:

(1) 当socket创建一个套接字的时候,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的连接请求;调用listen使得套接字从CLOSED状态转换到LISTEN状态;

(2) backlog规定了内核应该为相应的套接字排队的最大连接个数;

2. backlog含义:

内核为给定的监听套接字维护两个队列,两个队列项之和不超过backlog:

(1) 未完成连接队列,每个syn分节对应其中一项,已经由某个客户端发出并到达服务器,而服务器正在等待完成相应的tcp三次握手过程,这些套接字处于SYN_RCVD状态;

(2) 已完成连接队列,每个已经完成三次握手过程的客户对应其中的一项,这些套接字处于ESTABLISHED状态;

注:如下图,accept是从已完成队列头取一个连接进行服务,所以accept是在三次握手之后的过程;

3. 三次握手和两个队列:

(1) syn到达时,tcp在未完成队列中创建一个新项,然后响应三次握手的第二个分节,这项一直保留在未完成队列中,一直到三次握手的第三个分节到达或者超时为止;

(2) 当一个syn到达时,队列是满的,tcp将忽略该分节,客户端重新发送syn,期望不久就能在这些队列中找到可用空间;发送rst是不对的,因为客户端无法区分rst是无服务还是队列满;

(3) 如果三次握手正常完成,该项从未完成队列移动到已完成队列的队尾;

(4) 当进程调用accept时,已经完成连接队列中的对头项将返回给进程,或者如果该队列为空,那么进程将投入睡眠,直到tcp在该队列中放入一项才唤醒它;

TCP之listen&backlog的更多相关文章

  1. TCP SOCKET中backlog参数的用途是什么? ---图解

    recv_queue中的包大小,为内核的包大小,而不是ip包大小. 如果发出去的包太大,需要修改write_queue和tx_queue两个参数,tx_queue主要是流量控制. 多进程必须在sock ...

  2. 浅谈tcp socket的backlog参数

    最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下. 底 ...

  3. socket listen backlog

    http://stackoverflow.com/questions/4253454/question-about-listening-and-backlog-for-sockets The list ...

  4. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  5. tcp连接listen的backlog剖析

    TCP连接中,最重要的是连接TCP连接上,两个方向之间的各个状态及各个系统调用与状态之间的关系.往往可以以两种图表示,第一种是状态转换图,第二种是连接时序图.如下: 状态图: 时序图:         ...

  6. [TCP/IP] TCP在listen时的参数backlog的意义

    linux内核中会维护两个队列:  1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态  2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态  3)当有一个S ...

  7. 深入浅出TCP之listen

    原文:http://blog.chinaunix.net/uid-29075379-id-3858844.html int listen(int fd, int backlog); 有几个概念需要在开 ...

  8. [python]socket.listen(backlog)中的backlog含义

    http://www.nosa.me/2015/09/16/socket-listenbacklog-%E4%B8%AD-backlog-%E6%8C%87%E7%9A%84%E6%98%AF%E4% ...

  9. listen系统调用

    /* * Perform a listen. Basically, we allow the protocol to do anything * necessary for a listen, and ...

随机推荐

  1. C++面向对象编程,继承,数据抽象,动态绑定

    派生类(derived class)能够继承基类(base class )定义的成员: 1).派生类可以无需改变而使用那些与派生类具体特性不相关的操作 2).可以重新定义那些与派生类相关的成员函数,将 ...

  2. bzoj3998-弦论

    给定一个长度为\(n(n\le 5\times 10^5)\)的字符串,求它的第\(k\)小字串.有两种模式: \(Type=0\),不同位置的相同字串只算一个 \(Type=1\),不同位置相同字串 ...

  3. 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...

  4. POJ3041:Asteroids——题解

    http://poj.org/problem?id=3041 题目大意:激光可以干掉一整行或一整列陨石,求最少激光次数. —————————————————— 二分图匹配,对于每一个陨石将它的横纵坐标 ...

  5. BZOJ3670 [Noi2014]动物园 【KMP计数】

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 3143  Solved: 1690 [Submit][Stat ...

  6. AOJ.866 飞越原野 (三维BFS)

    AOJ.866 飞越原野 (三维BFS) 题意分析 点我挑战题目 相比于普通的BFS,要多一维来记录当前剩余的体力.而且还要额外的一层循环来处理,飞过的路程. 代码总览 #include <io ...

  7. [学习笔记]分治FFT

    一般的分治FFT是指: https://www.luogu.org/problemnew/show/P4721 考虑后面的f和前面的f有关系,但是贡献可以分着计算,逐一累计上去. 考虑cdq分治.算出 ...

  8. dns随笔(部分转载)

    1.allow-notify allow-notify 定义了一个匹配列表并且只应用于从dns区域(slave zone),比如,这个列表是一个ip列表,它 2. 触发同步的过程 http://www ...

  9. FreeRTOS ------ 栈、堆、任务栈

    1.任务的栈资源(创建任务分配的资源,单位是4字节)来自 configTOTAL_HEAP_SIZE 定义的堆,如果任务栈总量超过 configTOTAL_HEAP_SIZE,任务创建失败: 2.如果 ...

  10. (转)python编码问题

    时不时总是会碰到令人头疼的编码问题,这里推荐一篇决定好文,需反复诵读之: http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html . . ...