TCP:三次握手四次挥手及相关问题:

连接—三次握手:

流程图:

过程详解:

客户端(connect)连接服务器(listen)

  1. Client将标志位SYN置为1,随机产生一个值seq=x, 并将该数据包发送给Server, Client进入SYN_ SENT状态,等待Server确认。
  2. Server收到数据包后由标志位SYN=1知道Client请求建立连接, Server将标志位SYN和ACK都置为1, ack=x+1, 随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求, Server进入SYN_ RCVD状态。
  3. Client收到确认后,检查ack是否为x+1, ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server;

Server检查ack是否为y+1, ACK是否为1,如果正确则连接建立成功,Client 和Server进入ESTABLISHED状态, 完成三次握手,随后Client与Server之 间可以开始传输数据了。

断开—四次挥手:

流程图:

断连详解:

首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

  1. 数据传输结束后,Cli的应用进程发出连接释放报文段FIN,并停止发送数据,客户端进入FIN WAIT 1状态,此时客户端依然可以接收服务器发送来的数据
  2. 服务器接收到FIN后,发送一个ACK给客户端, 确认序号ack=收到的序号+1,服务器进入CLOSE WAIT状态。客户端收到服务器的ACK后进入FIN WAIT_2状态。
  3. 服务器完成了自己的发送工作后没有数据要发送时,服务器发送一个FIN报文, 此时服务器进入LAST_ ACK状态,等待客户端的确认
  4. 客户端收到服务器的FIN报文后,给服务器发送一个ACK报文, ack=收到的序号+1。此时客户端进入TIME_ WAIT状态,等待2MSL (MSL: 报文段最大生存时间),然后关闭连接。

断连原理:

TCP是全双工,每个方向都需要单独关闭,一方完成了自己的发送任务后,主动发送终止报文FIN结束此方向连接,代表从此刻开始这个方向不会再发送除了断连工作的必要报文外一切信息数据,直至对面方向也发送了FIN结束报文。

1. 三次握手容易出现的攻击---syn泛洪攻击

泛洪攻击、syn溢出攻击,DoS(拒绝服务攻击)的一种形式。

  • 出现在第二次握手阶段
  • 流程:攻击者伪造大量不存在的IP地址,一时间发送大量的第一次握手的同步报文,导致服务器需要在短时间内完成对客户端信息的保存发送确认和自己的同步报文信息,为每一个建立连接的客户端开辟内存空间,而洪范攻击无第三次握手即第三次确认报文,服务器最终会连接失败,在判断识别失败需要的时间内,服务器就会因为短时间内的大量syn报文导致资源耗尽,正常的客户端连接需求亦无法得到满足

  • Land攻击

在这种攻击中,攻击者发送一个SYN包,其源地址和目标地址都是受害服务器的IP地址。当服务器回复SYN+ACK包时,这个包实际上又被发送回服务器自己。这种攻击可能导致服务器资源耗尽,因为它不断地处理自己发送的包。

  • Connection Flood攻击:

攻击者利用真实的IP地址向服务器发起大量的连接请求,建立连接后长时间不释放,并定期发送垃圾数据包以保持连接活性。这会导致服务器上残余连接(WAI-time状态)过多,效率降低,甚至资源耗尽,无法正常响应其他客户的连接请求。

2. 为了防范这些攻击,可以采取以下措施:

  1. 限制每个源IP的连接数:防止单个IP地址建立过多的连接
  2. 恶意连接的IP进行封禁:一旦发现某个IP地址在进行异常行为,可以将其封禁。
  3. 降低SYN timeout时间:使得服务器尽快释放半连接的占用,减少资源消耗
  4. 采用SYN cookie技术:如果短时间内连续收到某个IP的重复SYN请求,则视为攻击,并丢弃后续请求。
  5. 在网关处设置过滤拒绝将源IP地址不属于其来源子网的包进行路由。

请注意,这些防范措施并非绝对安全,应结合实际情况和安全需求进行选择和部署

3. 两次握手可以吗?

不可以

举反例以证实三次不可或缺

失效的连接报文请求:

客户端发出的SYN同步报文在传输过程中未及时到达服务器,在网络结点停滞到客户端与服务器连接、已经断联2MSL以后才到达

在此情况下,若只有两次握手便可以达成连接,服务器同意连接发送同步、确认报文。

客户端收到服务器发来的报文以无效处理,并不会给服务器发送信息,也不会主动断连,而服务器将会在等待中白白浪费内存资源

若有客户端第三次确认连接则不会发生以上问题

Dos攻击无法防范:

黑客会伪造大量SYN请求发送给服务器,服务器立即确认并建立连接,分配资源,但是这一系列连接并不是真实存在的, 这大大浪费了服务器的资源并且阻塞了正常用户的连接,这种也叫SYN洪泛攻击。

        第二种是服务器返回给客户端的ACK数据包可能会在传输的过程中丢失

客户端没有收到该ACK数据包拒绝接收服务器接下来发送的数据,于是服务器因TCP可靠传输的超时重发和确认应答机制一直重复发送,客户端一直在拒绝, 形成死锁。

反之三次握手就可以解决以上问题.

4. 四次挥手可以变为三次挥手吗?

  • 不能,四次挥手是必要的:

TCP全双工通信,所以各个方向都需要进行关闭连接,在主动断开放完成发送任务后向连接端发送结束FIN报文后,表示此方向已不会再发送信息数据(不排除TCP断连报文),而被动断开方接收到FIN结束报文后,首先确认发送ACK确认报文,以免主动断开放误以为FIN结束报文发送失败重新发送,然而被动断开方仍需处理自己的发送工作内容,直至完成后才向主动断开方再发送FIN报文,来表示现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的,这也是为什么释放连接时需要交换四次报文了。

  • 偶尔,当客户端与服务器同时选择断开连接时,即代表双方都没有需要发送的数据信息后,即可以合并ACK 和 FIN 报文,变成三次挥手

5. 三次握手第二个阶段的异常

第二阶段:

服务器的端口号未打开,会回复 RST 复位报文,握手失败

服务器listen异常,监听队列达到上限,也可能失败

6. TCP三次握手第一次产生的SEQ

由ISN算法得到的。

seq=C + H (源IP地址,目的IP地址,源端口,目的端口)

C 计时器,每隔一段时间值就会变大;

H 消息摘要算法,输入是一个四元组(源IP地址,目的IP地址, 源端口,目的端口)

7. TCP的同时握手与同时挥手

同时打开连接是指通信的双方在接收到对方的SYN包之前,都进行了主动打开的操作并发出了自己的

SYN包。如之前所说一个四元组标识一个TCP连接,因此如果一个TCP连接要同时打开需要通信的双方知

晓对方的IP和端口信息才行,这种场景在实际情况中很少发生(NAT穿透中可能会多一些)。 同时打开的流

程如下图:

注意上图中,TCP连接同时打开的时候与三次握手的主要区别如下

1)我们同时称呼A和B为Client,他们都执行主动J开的操作(Active Opener)。

2)同时两端的状态变化都是由CLOSED->SYN SENT->SYN _RCVD->ESTABLISHED。

3)建立连接的时候需要四个数据包的交换,并且每个数据包中都携带有SYN标识,直到收到SYN的ACK为止同时关闭连接.

相对于四次握手过程基本类似,注意两者状态转换的区别,同时关闭的状态变化是:

ESTABLISHED->FIN_WAIT 1->CLOSING->TIME WAIT->CLOSED

8. TCP第三次握手携带数据

第三次携带,当客户端最后一次握手后发送确认报文后,对客户端来说已经建立连接,已经明确服务器的接收发送能力

第一次不能,客户端以确认报文中夹杂恶意信息,频繁发送SYN ,服务器将浪费大量时间、空间接收处理

第二次不能,服务器并不确认客户端是否真实有效,不是虚拟的恶意连接、或攻击,在大量连接请求时,携带数据会使得服务器更快的资源耗尽

9. TIME_WAIT 状态存在的意义

TIME_WAIT 指第四次挥手时,发送完确认报文后

  1. 保证在接收FIN报文后一切迟来报文被识别并丢弃
  2. TCP可靠连接的保证,使得对方成功接收ACK 报文,若ACK丢失对方会重发FIN报文并重新期待收到ACK
  3. TIME_WAIT 时间在2MSL报文的最大传输时间1MSL:2分钟)

10. 在 Linux 系统上,一个TCP端口无法短时间建立两个或以上连接

TCP 在连接后释放处于TIME_WAIT 状态时,无法使用占用端口建立连接

强制进程立即使用处于 TIME_WAIT 状态的连接所占用的端口,可以通过 setsockopt()方法设置 socket 选项 SO_REUSEADDR 来完成。

11. TIME_WAIT 和 CLOSE_WAIT的区别

CLOSE_WAIT:第二次挥手,已发送对对方FIN 的确认ACK 报文

等待自己发送工作完成,未关闭

TIME_WAIT :第四次挥手,已发送最后的ACK确认报文

保证ACK 报文可靠传输,识别并丢弃迟来的报文信息,避免快速的经行下次连接而将以往无效报文接收

12. 服务器端出现大量的CLOSE_WAIT

第二次挥手阶段:已收到FIN 并回复ACK

总原因:服务器未完成工作内容且时间过长,没有发送FIN完成第三次挥手

  • 服务器内部业务处理占用了过多时间,都没能处理完业务;
  • 或者还有数据需要发送
  • 或者服务器的业务逻辑有问题,没有执行close()方法
  • 服务器的父进程派生出子进程,子进程继承了socket,收到FIN的时候子进程处理但父进程没有处理该信号,导致socket的引用不为0无法回收

处理方法:

  • 停止应用程序
  • 修改程序里的bug

13. TIME_ WAIT期间收到数据包

要根据包的情况,做出很多种的判断

RST 包

序列号是下一个要接受的序列号

立即释放time_ wait传输控制块,丢掉RST包。

不是下一个要接受的序列号:

丢弃

ACK 包

序列号是下一个要接受的序列号:

启动TIME WAIT定时器,丢弃ACK。

不是下一个要接受的序列号:

启动TIME WAIT定时器,然后给对端发送ACK。

SYN 包

上一个结束序列号大

可以接受,并建立新的连接

是上次结束前序列号

不会启动TIME _WAIT定时器,只会给对端发送ACK,告诉对端已经收到SYN包,避免重传,但连接应该不会继续建立。

14. 什么是RST?

tcp报头:

复位RST (ReSeT)当 RST= 1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一一个连接。RST也可称为重建位或重置位。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Cloud】feign调用携带token

当我们再用feign调用的时候,如果对应服务需要token验证则需要我们传递token 网上提供的方法都是添加如下配置: Configuration public class FeignConfig implements RequestInterceptor {Overridepublic void apply(RequestTemplate requestTemplate) {ServletReq…

flowable-ui部署

版本 java: java8+tomcat: apache-tomcat-9.0.87flowable: flowable-6.8.1mysql驱动: mysql-connector-java-8.0.30.jar 注意:版本一定要对,否则启动报错执行数据库脚本 创建数据库flowable执行脚本,脚本位于解压flowable-6.8.1.zip后的flowable-6.8.1/database/create/all/…

2024图表分析网页模版大数据可视化大屏电子沙盘合集包含金融行业智慧大厅智慧交通智慧门店智慧物流智慧小区

2024图表分析网页模版大数据可视化大屏电子沙盘合集包含金融行业智慧大厅智慧交通智慧门店智慧物流智慧小区 项目介绍: 图表分析网页模版 大数据可视化大屏电子沙盘合集,项目基于html/css/js,包含行业: 智慧政务 智慧社区 金融行…

如何高效接入 Flink: Connecter / Catalog API 核心设计与社区进展

本文整理自阿里云实时计算团队 Apache Flink Committer 和 PMC Member 任庆盛在 FFA 2023 核心技术专场(二)中的分享,内容主要分为以下四部分: Source APISink API将 Connecter 集成至 Table /SQL APICatalog API 在正式介绍这些 …

100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别

文章目录 专栏导读一、前言二、ddddocr库使用说明1. 介绍2. 算法步骤3. 安装4. 参数说明5. 纯数字验证码识别6. 纯英文验证码识别7. 英文数字验证码识别8. 带干扰的验证码识别 三、验证码识别登录代码实战1. 输入账号密码2. 下载验证码3. 识别验证码并登录 书籍推荐 专栏导读 …

TCP-IP 知识汇总

开放式系统互联模型------国际化标准组织ISO提出----协议组(协议模型) 应用层:接收用户数据,人机交互的接口 表示层:将编码转换为二进制(加密、解密)---统一格式 会话层:针对传输…

Docker进阶:离线安装docker社区版(docker-18.06.3-ce)

Docker进阶:离线安装docker社区版(docker-18.06.3-ce) 1、准备离线安装所需的文件2、传输文件至目标Linux系统3、卸载旧版Docker4、离线安装Docker1、解压上传的Docker安装包2、拷贝文件到/usr/bin目录3、将 Docker 注册为系统服务4、重新加载…

linux 使用docker安装 postgres 教程,踩坑实践

linux 使用docker安装 postgres 教程 踩坑实践,安装好了不能远程访问。 防火墙已关闭、postgres 配置了允许所有ip 访问、网络是通的。端口也是开放的,就是不能用数据库链接工具访问。 最后发现是云服务器端口没开 ,将其打开 到这一步完全正确了,但是…

如何培养员工应用六西格玛解决问题的能力?

近年来,为了提高工作效率和产品质量,许多企业开始引入六西格玛管理方法。然而,仅仅引入六西格玛并不足以确保成功,培养员工应用六西格玛解决问题的能力才是关键。那么,如何培养员工应用六西格玛解决问题的能力呢&#…

【强化学习】安装gym==0.18.3报错的解决方法

安装gym0.18.3报错的解决方法 Collecting gym0.18.3 Using cached gym-0.18.3.tar.gz (1.6 MB) Preparing metadata (setup.py) … error error: subprocess-exited-with-error python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [1 lines of o…

Linux查看进程的一些方法

ps ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些…

第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录 1.固定Hash算法分片的概念1.1.固定Hash算法的概念1.2.固定Hash算法是如何将数据路由到分片节点的 2.使用固定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现固定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分…

微信开发者工具如何使用?使用注意事项

(1)单位如何进行换算? 1 px 750/屏幕宽度 rpx 1 rpx 屏幕宽度/750 px (2)如何新建文件? 1> 点开app.json 2> 在“pages/index/index”后面接“,pages/自定义文件夹名/自定义文件名”…

FPGA 学习需要哪些东西?

FPGA 学习需要哪些东西? 三样东西:第一就是完整的理论,第二一套开发板,第三可练手的项目 第一,一套完整的课程, 这个课程必须是紧跟技术发展的,适应市场的,这样不至于学完后发现太…

开源Ai对话系统(MNAi)系统

支持对接gpt,阿里云,腾讯云/chatGPT源码/AI绘画系统/AI创作系统/AI写作系统 具体看截图 后端环境:PHP7.4MySQL5.6 软件:uniapp 部署教程请看源码内的【使用教程】文档 源码免费下载地址抄笔记 chaobiji.cn

【计算机网络篇】物理层(3)编码与调制

文章目录 🍔编码与调试⭐基本概念 🍔基本的带通调制方法和混合调制方法⭐基本的带通调制方法⭐混合调制方法 🍔编码与调试 物理层是OSI模型中的第一层,它负责在物理媒体上传输原始比特流。在物理层的编码和调试中,我们…

leetcode106从中序与后序遍历序列构造二叉树

目录 1.解题关键2.思路3.变量名缩写与英文单词对应关系4.算法思路图解5.代码 本文针对原链接题解的比较晦涩的地方重新进行说明解释 原题解链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/solutions/50561/tu-jie-…

3D Tiles语义分割流水线

Dylan Chua 和 Anne Lee 开发了一个处理管线,用于对 3D Tiles 中包含的 GL 传输格式 (glTF) 模型进行语义分割。 该管道读取并遍历 3D Tileset,以输出包含元数据的经过转换的划分对象集。 该项目为 3D 语义分割器提供了最小可行产品,作为各种…

STM32CubeIDE基础学习-BEEP蜂鸣器实验

STM32CubeIDE基础学习-BEEP蜂鸣器实验 文章目录 STM32CubeIDE基础学习-BEEP蜂鸣器实验前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 前面学习了LED闪烁实验,现在来学习一下蜂鸣器发声实验&am…

JVM工作原理与实战(四十四):JVM常见面试题目

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JVM常见面试题目 1.有哪些常用的垃圾回收器? 2.什么是内存泄漏,如何解决内存泄漏问题? 3.请列举并简要描述一些常用的JVM工具及其主要功能。 …