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相关推荐

  1. 深入浅出TCP/IP协议栈

    本文转载于:深入浅出TCP/IP协议栈 https://www.cnblogs.com/onepixel/p/7092302.html TCP/IP 协议栈是一系列协议的总和,是构成网络通信的核心骨架 ...

  2. 深入浅出TCP/UDP 原理-UDP篇(2)及完整MATLAB实现UDP通信

    目录 调试代码在文末 写在前面 3. UDP疑难杂症 3.1 UDP的传输方式:面向报文 3.2 UDP数据包的发送和接收问题 3.3 UDP丢包问题 3.4 UDP冗余传输 4 UDP真的比TCP要 ...

  3. 深入浅出TCP四次挥手 (多图详解)

    文章目录 前言 1.TCP的连接释放 2.TCP通过"四报文挥手"来释放连接 3.四次挥手图文详解 4.四次挥手文字总结 5.相关面试问题 前言 TCP三次握手和四次挥手是面试题的 ...

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

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

  5. TCP的listen和accept函数

    int listen(int sockfd, int backlog); 完成两件事情: 1.将未连接的套接口转换成被动套接口,指示内核应接收指向此套 接的 连接请求.       导致套接口从CLO ...

  6. TCP调用listen处于监听状态,listen的第二个参数含义

    现象 用TCP协议写两个程序,服务器端listen的第二个参数设为1,不调用accept. 说明:只要服务器端处于listen状态,就可以建立连接,与accept无关. #pragma once #i ...

  7. 详解TCP之listen

    int listen(int fd, int backlog); 有几个概念需要在开头澄清一下 TCP socket分两种,监听socket和传输socket两种 监听socket:负责处理网络上来的 ...

  8. 深入浅出TCP/UDP 原理-TCP篇(1)及完整MATLAB实现UDP通信

    源代码在这一篇文章里: https://mp.csdn.net/editor/html/117086464 目录 疑症 1 :TCP 的三次握手.四次挥手 疑症 2 : TCP 连接的初始化序列号能否 ...

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

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

最新文章

  1. 二叉排序树的实现——java
  2. oracle awr windows,windows下的oracle 如何生成awr报告
  3. 如何在Golang中返回错误?
  4. Java日期格式化SimpleDateFormat
  5. java文件快速扫描仪_Java扫描仪具有示例的NextNextShort()方法
  6. golang 数组、指针数组、数组指针使用总结
  7. 《Go学习笔记 . 雨痕》流程控制(if、switch、for range、goto、continue、break)
  8. rtcp webrtc 接收_WebRTC RTP/RTCP 源码分析(四):RTCP 的接收和解析
  9. 安装Docker Desktop报错WSL 2 installation is incomplete
  10. android程序安装空间不足,AndroidStudio提示磁盘空间不足
  11. libevent源码深度剖析-张亮
  12. JavaScript的特效
  13. 【Python】二分法求函数零点
  14. 什么是深度学习的视频标注?
  15. 支付宝小程序唤起支付
  16. 统计检验 单尾还是双尾
  17. 语料标注平台BRAT安装指导
  18. -XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】
  19. 移动APP登录注册(vue+vant)
  20. 轮胎行业通过APS实现自动排产

热门文章

  1. FPGA - 基于FPGA的HDMI显示
  2. (附源码)springboot微信点餐系统的设计与实现 毕业设计221541
  3. 比特元BTY入驻区分平台
  4. 把手机用户的身份验证简化到极致 – IEMI
  5. Dahua IPC 授权问题漏洞(CVE-2021-33045)
  6. 麻省理工学院计算机博士_代码可以自我意识吗? 在麻省理工学院学习计算机科学的思考(第一部分)...
  7. webp2jpg在线图片编辑器网站源码
  8. Micro SD Card参数基本介绍
  9. php 除法,php除法函数有哪些
  10. 汽车之家三季度财报发布,数据正给互联网带来真金白银