深入浅出TCP之listen
原文:http://blog.chinaunix.net/uid-29075379-id-3858844.html
int listen(int fd, int backlog);
有几个概念需要在开头澄清一下
TCP socket分两种,监听socket和传输socket两种
监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手);
传输socket:负责在网络上的两个端点之间传输TCP数据。
未决socket:pending socket,就是某客户端的syn包到达,内核为这个syn包对应的tcp请求生成一个socket,但是此时三次握手并没有完成,这样的socket就是pending socket,是未决连接,没有经过三次握手认证的tcp连接。
已建立连接的socket:established socket,tcp服务器利用三次握手完成对客户端的简单认证之后,未决socket就变成已连接socket,后续可以用这个socket传输数据。
内核为每个tcp服务器维护两个socket队列:未决socket队列和已建立连接的socket队列

图 1
现在进入主题:)
在TCP服务器端创建socket完毕,调用listen函数的时候,系统下层发生了以下动作:
1. 将刚才创建的(fd所标示的)socket转换为此tcp服务器的监听socket,让此socket进入监听请求模式,此socket的tcp状态由CLOSE转至LISTEN.
2.内核为此监听socket所对应的tcp服务器建立一个未决socket队列和一个已建立连接socket队列
backlog这个参数用来决定未决socket队列的长度,有个映射关系,0表示长度可以无限大。
现在来串一串整个过程
监听socket收到某客户端的syn包,第一次握手完成;
然后内核为此syn请求生成一个pending socket,例如图1中的socket5,标记状态为SYN_RECV,并且将socket5加入相应的pending socket队列,并且服务器发出ack和syn,第二次握手完成。
后续针对此socket5有两种可能
1可能
过会儿客户端响应了服务器的syn(第三个ack到达),第三次握手结束。内核触发accept函数执行,将socket5状态标记为ESTABLISHED,并且将此socket5由pending socket queue移至establishedsocket queue,如图2

图2
2可能
客户端的最后一个ack并未来到,过很久,图1中的socket5超时了,被移除,如图3

图3
到这儿,listen的作用应该清楚了
另外针对此listen,有两个极限情况导致的拒绝服务情况需要考虑
backlog设置过小,pending socket队列已满,此时客户端调用connect发送syn分节给服务器端请求连接,服务端会忽略此syn包,客户端收不到syn的ack,会触发syn超时,这个超时时间比较长,重发syn,导致客户端长时间连接不上。
backlog设置为0或者过大,只要收到syn包,就会在pending socket队列中增加节点,这个容易导致物理内存耗尽
Syn flood就是攻击pending socket队列的
linux内核可以全局设置此pending socket队列大小
/proc/sys/net/ipv4/tcp_max_syn_backlog
深入浅出TCP之listen的更多相关文章
- 深入浅出TCP之半关闭与CLOSE_WAIT
转自:https://www.2cto.com/net/201309/243585.html(相关链接) 深入浅出TCP之半关闭与CLOSE_WAIT 终止一个连接要经过4次握手.这由TCP的半关闭( ...
- 深入浅出TCP与UDP协议
深入浅出TCP与UDP协议 网络协议是每个前端工程师的必修课,TCP/IP协议族是一系列网络协议的总和,而其中两个具有代表性的传输层协议,分别是TCP与UDP,本文将介绍这两者以及他们之间的区别. 一 ...
- 从Linux源码看Socket(TCP)的listen及连接队列
从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...
- tcp连接listen的backlog剖析
TCP连接中,最重要的是连接TCP连接上,两个方向之间的各个状态及各个系统调用与状态之间的关系.往往可以以两种图表示,第一种是状态转换图,第二种是连接时序图.如下: 状态图: 时序图: ...
- TCP之listen&backlog
1. listen函数: #include <sys/socket.h> int listen(int sockfd, int backlog); ret-成功返回0 失败返回- list ...
- 深入浅出TCP协议的三次握手过程
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放.“三次握手”就发生在连接建立阶段. 1.三次握手( ...
- 深入浅出TCP/IP簇
TCP/IP是“transmission Control Protocol/Internet Protocol”的简写,中文译名为传输控制协议/互联网络协议.TCP/IP不是一个协议,而是一个协议簇的 ...
- 深入浅出TCP/IP协议栈
TCP/IP协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP协议采用4层结构,分别是应用层.传输层.网络层和链路层, ...
- 深入浅出 TCP/IP 协议
TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP 协议采用4层结构,分别是应用层.传输层.网络层和链路 ...
随机推荐
- laravel调用sql server存储过程并取得ReturnValue
alter proc [dbo].[aaa]( @AgencyID int,--代理商ID @AdminID int --结算操作人ID(管理员ID))asbegin select ...
- LeetCode 47 Permutations II(全排列)
题目链接: https://leetcode.com/problems/permutations-ii/?tab=Description 给出数组,数组中的元素可能有重复,求出所有的全排列 使 ...
- tornado web开发
tornado是python的web框架,这里简单记录下利用tornado怎么实现文件的上传,其中web.py上传功能类似. 直接用代码说明: 代码来自:http://my.oschina.net ...
- "will you marry me" vs "would you marry me"
will you marry me 表示我现在问你,能不能嫁给我,我现在就需要答案. 如果回答是yes,那么对方就算是同意嫁给你了. would you marry me 表示你能不能考虑嫁给我. w ...
- PHP----实现压缩HTML
很多时候,我们在做优化处理的时候,会考虑压缩HTML,去掉HTML里面的空格和换行. 具体实现: public function change(){ echo "change"; ...
- 如何搭建SoC项目的基本Testbench【zz】
原文地址:http://bbs.eetop.cn/thread-442797-1-8.html 写这个文档的目的是让大家对搭建SoC项目的Testbench有一个比较清晰的认识,可以根据这个文档来一步 ...
- php里面向指定的页面提交数据
在jquery里用 load post 等等,无法得到我想要的结果!于是突然-----这几天想的东西都白想了,现在只好这样了 现在想在php里面向指定的页面提交数据,应该有,还可以有返回值 于是找了这 ...
- Cglib 与 JDK动态代理的运行性能比较
都说 Cglib 创建的动态代理的运行性能比 JDK 动态代理能高出大概 10 倍,今日抱着怀疑精神验证了一下,发现情况有所不同,遂贴出实验结果,以供参考和讨论. 代码很简单,首先,定义一个 Test ...
- Scala学习笔记(3)-表达式归纳
语法:使用表达式定义值和变量 val <identifier>[:<type>]=<expression> 字面值类型 var <identifier> ...
- POJ 2342 - Anniversary party - [树形DP]
题目链接:http://poj.org/problem?id=2342 Description There is going to be a party to celebrate the 80-th ...