深入浅出TCP之listen
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队列的
深入浅出TCP之listen相关推荐
- 深入浅出TCP/IP协议栈
本文转载于:深入浅出TCP/IP协议栈 https://www.cnblogs.com/onepixel/p/7092302.html TCP/IP 协议栈是一系列协议的总和,是构成网络通信的核心骨架 ...
- 深入浅出TCP/UDP 原理-UDP篇(2)及完整MATLAB实现UDP通信
目录 调试代码在文末 写在前面 3. UDP疑难杂症 3.1 UDP的传输方式:面向报文 3.2 UDP数据包的发送和接收问题 3.3 UDP丢包问题 3.4 UDP冗余传输 4 UDP真的比TCP要 ...
- 深入浅出TCP四次挥手 (多图详解)
文章目录 前言 1.TCP的连接释放 2.TCP通过"四报文挥手"来释放连接 3.四次挥手图文详解 4.四次挥手文字总结 5.相关面试问题 前言 TCP三次握手和四次挥手是面试题的 ...
- 从Linux源码看Socket(TCP)的listen及连接队列
从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...
- TCP的listen和accept函数
int listen(int sockfd, int backlog); 完成两件事情: 1.将未连接的套接口转换成被动套接口,指示内核应接收指向此套 接的 连接请求. 导致套接口从CLO ...
- TCP调用listen处于监听状态,listen的第二个参数含义
现象 用TCP协议写两个程序,服务器端listen的第二个参数设为1,不调用accept. 说明:只要服务器端处于listen状态,就可以建立连接,与accept无关. #pragma once #i ...
- 详解TCP之listen
int listen(int fd, int backlog); 有几个概念需要在开头澄清一下 TCP socket分两种,监听socket和传输socket两种 监听socket:负责处理网络上来的 ...
- 深入浅出TCP/UDP 原理-TCP篇(1)及完整MATLAB实现UDP通信
源代码在这一篇文章里: https://mp.csdn.net/editor/html/117086464 目录 疑症 1 :TCP 的三次握手.四次挥手 疑症 2 : TCP 连接的初始化序列号能否 ...
- [TCP/IP] TCP在listen时的参数backlog的意义
linux内核中会维护两个队列: 1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态 2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态 3)当有 ...
最新文章
- 二叉排序树的实现——java
- oracle awr windows,windows下的oracle 如何生成awr报告
- 如何在Golang中返回错误?
- Java日期格式化SimpleDateFormat
- java文件快速扫描仪_Java扫描仪具有示例的NextNextShort()方法
- golang 数组、指针数组、数组指针使用总结
- 《Go学习笔记 . 雨痕》流程控制(if、switch、for range、goto、continue、break)
- rtcp webrtc 接收_WebRTC RTP/RTCP 源码分析(四):RTCP 的接收和解析
- 安装Docker Desktop报错WSL 2 installation is incomplete
- android程序安装空间不足,AndroidStudio提示磁盘空间不足
- libevent源码深度剖析-张亮
- JavaScript的特效
- 【Python】二分法求函数零点
- 什么是深度学习的视频标注?
- 支付宝小程序唤起支付
- 统计检验 单尾还是双尾
- 语料标注平台BRAT安装指导
- -XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】
- 移动APP登录注册(vue+vant)
- 轮胎行业通过APS实现自动排产
热门文章
- FPGA - 基于FPGA的HDMI显示
- (附源码)springboot微信点餐系统的设计与实现 毕业设计221541
- 比特元BTY入驻区分平台
- 把手机用户的身份验证简化到极致 – IEMI
- Dahua IPC 授权问题漏洞(CVE-2021-33045)
- 麻省理工学院计算机博士_代码可以自我意识吗? 在麻省理工学院学习计算机科学的思考(第一部分)...
- webp2jpg在线图片编辑器网站源码
- Micro SD Card参数基本介绍
- php 除法,php除法函数有哪些
- 汽车之家三季度财报发布,数据正给互联网带来真金白银