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

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.mzph.cn/diannao/50089.shtml

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

相关文章

深入探索 Postman:使用 API 性能测试优化你的 Web 服务

引言 在当今快速发展的互联网时代,Web 服务的性能至关重要。API 作为服务之间的桥梁,其性能直接影响到整个应用的响应速度和用户体验。Postman,作为一个多功能的 API 开发工具,提供了强大的性能测试功能,帮助开发者评…

2024第29届郑州全国商品交易会

第29届郑州全国商品交易会 2024第四届餐饮与供应链专题展 邀 请 函郑州全国商品交易会(简称郑交会)是全国大型性经贸活动,一直秉承“政府指导,市场化运作”的模式,自1995年以来已成功举办了二十八届,是国内…

【java】BIO,NIO,多路IO复用,AIO

在Java中,处理I/O操作的模型主要有四种:阻塞I/O (BIO), 非阻塞I/O (NIO), 异步I/O (AIO), 以及IO多路复用。下面详细介绍这四种I/O模型的工作原理和应用场景。 1. 阻塞I/O (BIO) 工作原理 阻塞I/O是最传统的I/O模型。在这种模型中,当一个线…

CSS 自适应图片根据 div 大小进行均匀填充

目录 前言使用 object-fit 属性示例代码 HTMLCSS 总结相关阅读 1. 前言 在Web开发中,经常需要图片根据其容器的大小进行自适应填充,使得图片在任何设备和屏幕尺寸下都能保持良好的显示效果。本文将介绍如何使用CSS中的 object-fit 属性来实现这一需求…

安装caffe-CPU版本并进行训练

目录 前言 0、安装Ubuntu 18.04 版本 输入ls没有反应 ubuntu换源 换源出现的问题 1、安装caffe出现E:Unable to locate package caffe-cpu问题 2、把 code 文件夹下载到 ubuntu 3、在本地使用caffe-CPU,并部署数据标注工具 ATool 问题1 问题2 问题3 命令行…

vector(STL)

文章目录 定义访问函数.push_back().pop_back()insert():erase(): 定义 vector<typename> name;typename是类型名 访问 1.定义为vector v 的vector容器&#xff0c;可以使用 v[0]、v[1]、v[2]…这种方式来访问。 但不能这样赋值比如v[0]10&#xff0c;这样是不行的 2.…

leedcode-数组-15 最接近的三数之和

原理 1、对数组进行升序排列&#xff1b; 2、定义变量_min&#xff0c;初始值是升序后数组的前3个元素之和&#xff0c;默认当前3个数之和离目标值最近&#xff1b; 3、遍历数组&#xff1b; 4、定义首指针为start&#xff0c;表示当前遍历元素的下一个元素&#xff0c;即i…

URL过滤、DNS过滤和内容过滤的总结

目录 URL过滤 URL和URI URL -- 统一资源定位符 URI --- 统一资源的标识符 URL和URI之间的区别 URL过滤的方式 HTTP协议获取URL的方式 HTTP协议做控制管理的流程 HTTPS协议做控制管理的流程 1&#xff0c;配置SSL的解密功能 2&#xff0c;直接针对加密流量进行过滤 例…

svelte - 1. 基础知识

svelte中文官网 vue和svelt语法对比 掘金-svelte入门简介 文章目录 1、基本页面框架2、动态属性3、嵌套组件4、@html: 插入html标签,显示真实dom元素5、点击事件 on:click={handleClick}6、响应式声明7、父子组件通信8、if-else(1)if(2)if - else(3)if - else if - else…

解决 Shiro 重复调用 doGetAuthenticationInfo 导致异常处理错误的问题

遇到一个 Shiro 中反复调用 doGetAuthenticationInfo 导致异常没有被成功处理的问题&#xff0c;经过一些源码调试&#xff0c;发现了问题的所在&#xff0c;只需在继承 BasicHttpAuthenticationFilter 的类中重写 onAccessDenied 方法即可。 文章目录 1.问题环境2.问题描述3.问…

kubectl命令收集

#查看node节点的IP信息&#xff1a; kubectl get nodes -o wide PV是一个抽象的存储资源&#xff0c;它定义了存储的类型、大小和访问模式&#xff0c;而不包含节点的具体信息。 要查看PV所在节点的IP地址&#xff0c;您可以通过PV所绑定的PVC来查找绑定了PV的Pod&#xff0c…

2024-07-23 Unity AI行为树2 —— 项目介绍

文章目录 1 项目介绍2 AI 代码介绍2.1 BTBaseNode / BTControlNode2.2 动作/条件节点2.3 选择 / 顺序节点 3 怪物实现4 其他功能5 UML 类图 项目借鉴 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 项目介绍 ​ 本项目使用 Unity 2022.3.32f1c1&#xff0c;实现基…

mysql.connector库

mysql-connector-python 和 PyMySQL的区别 mysql-connector-python 和 PyMySQL 都是 Python 语言中用于连接和操作 MySQL 数据库的库。它们之间有一些关键的区别&#xff1a; 起源和兼容性&#xff1a; mysql-connector-python 是 MySQL 官方提供的连接器&#xff0c;完全支持…

25.x86游戏实战-理解发包流程

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【iOS】——Block循环引用

循环引用原因 如果在Block中使用附有_ _strong修饰符的对象类型自动变量&#xff0c;那么当Block从栈复制到堆时&#xff0c;该对象为Block所持有&#xff0c;这样容易引起循环引用。 HPPerson *person [[HPPerson alloc] init];person.block ^{NSLog("person.age--- …

常用Jetpack库简析

Jetpack是一组Android软件组件库&#xff0c;旨在帮助开发者更轻松地构建健壮、高效且易于维护的Android应用程序。以下是常用的Jetpack库及其主要功能和用途的理解&#xff1a; 1. ViewModel 功能与用途&#xff1a; 存储和管理与UI相关的数据&#xff0c;如Activity或Fragm…

服务韧性工程(SRE)论坛演讲实录 | 雅菲奥朗: 人工智能的未来之路引领智能运维新纪元

2024年5月24日&#xff0c;第二届服务韧性工程&#xff08;SRE&#xff09;论坛在杭州成功举办。本次会议由中关村人才协会作为指导单位&#xff0c;中国移动通信集团浙江有限公司和SRE创新联合体&#xff08;中关村人才协会SRE专委会&#xff09;联合主办,中移动信息技术有限公…

Linux 某进程 CPU 高问题,用 Shell 脚本发现处理

发现高CPU使用率进程 首先&#xff0c;我们需要编写一个Shell脚本来发现系统中CPU使用率最高的进程。以下是一个简单的脚本示例&#xff1a; #!/bin/bash# 设置 CPU 使用率的阈值,一般设置90&#xff1b;这里是demo&#xff0c;所以用30 CPU_THRESHOLD30# 获取占用 CPU 最高的…

pikauchu之Unsafe Fileupload(不安全的文件上传)

Client check&#xff08;客户检查&#xff09; 第一步先新建一个一句话木马 <?php eval($_POST[1]);?> 然后上传文件 有限制&#xff0c;只能上传那几种类型 现在看看源代码 我们将一句话木马文件的后缀改为png 然后用burp抓包&#xff0c;将png改成php 就能上传成功 …

运维上云/直播上云EasyNVS视频上云管理平台配置域名时的注意事项

EasyNVS视频上云管理平台拥有完整的视频流媒体服务能力和运维管理服务能力&#xff0c;不仅可以通过平台对EasyNVR、EasyGBS进行统一管理&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反馈&#xff0c;在项目现场配置了EasyNVS的HTTPS证书&#…