Listen(sockfd,backlog)监听函数的第二个参数到底是什么?深度解释

news2024/9/20 18:36:33

listen队列剖析

int listen(int sockfd,int backlog)
  
  backlog : 
监听套接字队列
对于一个调用监听的套接字,系统会维护给这个套接字两个队列
1. 未完成连接队列
  //当客户端发生三次握手的第一次syn包给服务器的时候,服务器就会再未完成队列中创建一个跟这个syn包对应的一项
  //可以看成一个半连接,这个半连接的状态从LISTEN变为SYN_RCVD状态,同时给客户端返回第二次握手 SYN,ACK包
  //这个时候服务器端是在等待完成的第三次握手

2.已完成连接队列
  //当第三次握手完成后,,这个连接就变成了ESTABLISHED,每个已经完成三次握手的客户端,都放在这个队列中作为一项(从未完成连接拿走,不是拷贝,是移动)

 

曾经的backlog:已完成队列和未完成队列的总值不超过backlog

小问题:

(1)问题: 客户端调用connect()的函数的时候什么时候返回?
 收到三次握手的第二次握手包,也就是服务器端返回的 syn ack 包的时候,这时候半连接建立了返回,经过了客户端的一个RTT

accept函数

accept()函数就使用从已完成连接队列中的队首(队头)取出来一项(已经完成三次握手的TCP连接)返回给进程

如果已完成队列里是空呢,那么accept函数会阻塞等待,一直等到已完成连接队列有一项才会被唤醒

所以从编程的角度,我们要尽快的用accept()把已完成队列中的取走

accept返回的是一个套接字,这个套接字代表那个已经用三次握手建立起来的TCP连接 也就是通信文件描述符cfd。因为accept是从已完成队列取的数据;
服务器程序,必须严格区分两个套接字:
  监听lfd,服务器程序存在,lfd也就一直存在;
  当客户端连接的进来,操作系统会为每个建立三次握手的客户端再创建一个套接字(cfd);通信套接字,从已完成连接的队列取出来的

思考题:

(1.)如果已完成未完成队列的和达到了backlog,满了,此时再有客户端发送SYN包请求,服务器什么反应?

实际上服务器会忽略SYN包,不予回应,客户端这边发现没有回应,过一会会重新发送SYN包

(2.)从连接被扔到已完成连接队列的时候,到accept从已完成的队列取出的时候有一个时间差,就是刚来,但是还没被取出,这时候客户端发来数据怎么办

这个数据会保存在已经连接的套接字对应的接收缓冲区里

SYN攻击

匿名地址连续向服务器发送syn包,然后,服务器端并没有发送回ack,也没有收到ack,导致未连接的队列会满掉大于backlog之和,进而导致真正的syn包没有收到

然后backlog又规定了改掉了,是已连接的队列的总值;

尽快需要把已完成的队列里面的连接取走,尽快留出空闲为止给后续已完成三次握手的条目用,那么这个已完成队列一般不会满 backlog300 500左右

backlog深释

参照:https://www.cnblogs.com/yangbodong/p/15344832.html

listen 函数的 backlog 参数在不同的操作系统上可能有不同的实现和含义。一般来说,backlog 参数既涉及到半连接队列(syn queue),也涉及到全连接队列(accept queue)的大小。

半连接队列与全连接队列

  1. 半连接队列(SYN Queue)
  • 当一个客户端发送 SYN 包请求与服务器建立连接时,服务器会在半连接队列中创建一个记录(还没有完成三次握手)。

  • 半连接队列保存的是那些已经发送了 SYN 包但还没有完成三次握手的连接。

  1. 全连接队列(Accept Queue)
  • 当三次握手完成时,连接从半连接队列移到全连接队列。

  • 全连接队列保存的是那些已经完成了三次握手等待被应用程序调用 accept 接受的连接。

listen 函数中的 backlog

listen 函数的定义如下:

int listen(int sockfd, int backlog);
  • sockfd 是套接字描述符。

  • backlog 是请求队列的最大长度。

在许多实现中,backlog 同时限制了半连接队列和全连接队列的大小之和。但具体实现可能会有所不同。例如:

  • 在 Linux 中,backlog 指定了全连接队列的大小,而半连接队列的大小由 tcp_max_syn_backlog 系统参数控制。

  • 在某些其他操作系统中,backlog 可能限制的是总的连接队列大小(包括半连接和全连接)。

SYN 攻击

SYN 攻击是一种拒绝服务攻击(DoS 攻击),攻击者通过发送大量伪造的 SYN 包使目标服务器的半连接队列充满,从而阻止合法用户建立连接。

SYN 攻击的工作原理:
  1. 攻击者发送大量伪造源地址的 SYN 包到目标服务器。

  2. 服务器收到 SYN 包后,为每个连接分配资源并发送 SYN-ACK 包。

  3. 由于源地址是伪造的,攻击者不会响应 SYN-ACK 包,导致这些连接一直停留在半连接队列中。

  4. 半连接队列充满后,服务器无法再处理新的连接请求,导致合法用户无法连接到服务器。

防御 SYN 攻击的方法:
  1. 缩短 SYN-ACK 重传次数和超时时间
  • 减少服务器等待 SYN-ACK 确认的时间,可以加快清理无效连接的速度。

  • 例如,在 Linux 中可以通过调整 tcp_synack_retries 系统参数来实现。

  1. 增加半连接队列的大小
  • 增大 tcp_max_syn_backlog 参数可以增加半连接队列的大小,使其能够承受更多的半连接。
  1. SYN Cookies
  • SYN Cookies 是一种不依赖于半连接队列的防御机制。服务器在 SYN 包中嵌入一个加密的序列号,客户端返回的 ACK 包中包含这个序列号,服务器通过验证这个序列号来确认连接是否有效。

  • 启用 SYN Cookies 可以在半连接队列满时继续处理新连接。

  1. 防火墙和过滤
  • 使用防火墙或入侵检测系统(IDS)来过滤掉明显的 SYN 洪泛攻击流量。

通过这些方法,服务器可以增强对 SYN 攻击的防御能力,从而保障服务的可用性。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库处理表

首先先创建库,然后创建需要的这三个表 用dese表名查看 然后题目要求对表进行修改 用alter table这个语法来对表进行修改 modify为修改字段 需要修改的字段的属性类型改变为的属性 最后用descStudent查看 第二题需要创建索引 创建索引createindex索引名称 cre…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义,就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用,例如最近比较火的阿…

C++客户端Qt开发——Qt窗口(工具栏)

2.工具栏 使用QToolBar表示工具栏对象&#xff0c;一个窗口可以有多个工具栏&#xff0c;也可以没有&#xff0c;工具栏往往也可以手动移动位置 ①设置工具栏 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<…

JavaSE--基础语法--继承和多态(第三期)

一.继承 1.1我们为什么需要继承? 首先&#xff0c;Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程…

开发AI自动直播工具需要了解的源代码!

随着人工智能技术的快速发展&#xff0c;AI自动直播工具成为了现代直播领域的一大创新&#xff0c;这些工具利用先进的算法和机器学习模型&#xff0c;能够自动化地生成、编辑和播出直播内容&#xff0c;极大地提高了直播的效率和质量。 然而&#xff0c;要开发一款功能强大的…

10 个顶级的PPT生成AI工具盘点,一文把所有好用软件尽收囊中!

你是否希望在工作中制作 PPT 演示文稿&#xff0c;与他人分享你的洞见&#xff0c;或是发表演讲&#xff1f;然而&#xff0c;使用传统的 PPT 制作方式既耗时又费力&#xff0c;步入 AI 时代后&#xff0c;人们寻求更智能、更简便的 PPT 演示文稿制作方法。 目前市场上出现了一…

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1&#xff0c;el-form品牌logo图片自定义显示2&#xff0c;重新导入和注册element-ui组件3&#xff0c;修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1&#xff0c;el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…

本地部署VMware ESXi服务实现无公网IP远程访问管理服务器

文章目录 前言1. 下载安装ESXi2. 安装Cpolar工具3. 配置ESXi公网地址4. 远程访问ESXi5. 固定ESXi公网地址 前言 在虚拟化技术日益成熟的今天&#xff0c;VMware ESXi以其卓越的性能和稳定性&#xff0c;成为了众多企业构建虚拟化环境的首选。然而&#xff0c;随着远程办公和跨…

Codeforces Round 955 (Div. 2, with prizes from NEAR!) B. Collatz Conjecture(数学)

这道题考察的主要是通过数学对过程进行优化&#xff0c;而不是通过数学而得到结论&#xff08;让人摸不着头脑&#xff09;。 我们不需要把k次直接一次次的加&#xff0c;这样时间复杂度太大&#xff0c;那么我们现在探讨一次要加多少。 我们想要实现加一个数n&#xff0c;满足…

事务、函数和索引

什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;&#xff0c;就是将一组SQL语句放在同一批次内去执行&#xff0c;如果一个SQL语句出错&#xff0c;则该批次内 的所有SQL都将被取消执行。 特点 一个事务中如果有一个数据库操作失败&#xff0c;那么整个事务…

Linux网络-pingtelnet

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

vue3前端开发-小兔鲜项目-关于详情页图片渲染的一些技术

vue3前端开发-小兔鲜项目-关于详情页图片渲染的一些技术&#xff01;经过前面几天的努力&#xff0c;我们现在已经可以正常渲染产品详情了。是时候汇总一下&#xff0c;基础的技术知识点了。 1&#xff1a;单页面组件内的抽离&#xff0c;是一种很重要的思想。当我们遇到了&…

leetcode日记(49)旋转链表

其实不难&#xff0c;就是根据kk%len判断需要旋转的位置&#xff0c;再将后半段接在前半段前面就行。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : …

World of Warcraft [CLASSIC] Timebadge

游戏币【每个服务器实时金价不一样&#xff0c;本例子是5000-6000金】 1枚【魔兽世界时光徽章】 30天游戏时间。 5760金币游戏币&#xff0c;策划如何消耗游戏里面的金币总量&#xff0c;以及如何留住那些非人民币玩家呢 30天加上去了 World of Warcraft [CLASSIC] [魔兽世界…

VitePress Index.md 的设置:开发者指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

使用vcpkg

概述 vcpkg 是 Microsoft 和 C 社区维护的免费开放源代码 C/C 包管理器。 它于 2016 年推出&#xff0c;可帮助开发人员将项目迁移到较新版本的 Visual Studio。 vcpkg 已演变成 Windows、macOS 和 Linux 上开发人员使用的跨平台工具。 vcpkg 拥有大量开放源代码库注册表和企业…

Linux-安装VMware-01

一、认识linux Linux 是一个开源的类 Unix 操作系统&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。Linux 是许多计算机硬件的底层操作系统&#xff0c;特别是服务器、嵌入式系统和个人电脑。它支持多种架构&#xff0c;包括 x86、x64、A…

linux编译gcc源码详解

linux编译gcc源码详解 一、下载依赖包二、安装依赖2.1 安装m42.2 编译GMP2.3 编译MPFR2.4. 编译MPC2.5 设置环境变量三、gcc编译3.1 下载gcc3.2 编译gcc源码3.3 环境变量的配置一、下载依赖包 https://gcc.gnu.org/pub/gcc/infrastructure 命令下载依赖库,注意gcc编译时的依…

stm32cubeIDE与stm32cubeMX库文件安装路径自定义设置

1、 stm32cubeMX库文件安装路径自定义设置 打开stm32cubeMX软件&#xff0c;依次点击标题栏【Help】→【Updater Settings】 点击图中的【Browser】&#xff0c;选择自己想要存放库文件的文件夹&#xff0c;选择完成后点击【OK】即可设置成功。 PS&#xff1a;这里的路径建议…

python实现接缝雕刻算法

python实现接缝雕刻算法 接缝雕刻算法步骤详解Python实现详细解释优缺点应用领域接缝雕刻算法(Seam Carving Algorithm)是一种内容感知的图像缩放技术,可以智能地改变图像的尺寸,而不会明显影响其重要内容。它通过动态规划的方式寻找图像中的“接缝”,即在图像中从上到下或…