当前位置: 首页 > news >正文

TCP三握四挥

TCP三握(简述)

  • 一开始,客户端和服务端都处于closed状态,服务端主动监听某个端口,处于listen状态

  • 一握要进行C-S的第一个SYN发送,客户端会随机初始化序列号(client_isn)并将其置于TCP首部的序列号字段中,并且将SYN标志位设置为1,表示这是一条SYN报文,将报文发送给服务端(报文中不包含应用层数据),客户端处于SYN-SENT状态

  • 二握要进行S-C的SYN+ACK发送(SYN和ACK集成在一个报文中)。此时服务端已经收到了客户端的报文,知道了client_isn。他会生成一个随机序列号(server_client),放到响应报文的序列号中然后把(client_isn+1)放到确认应答号字段中将SYN和ACK字段设置为1.(该报文也不包含应用层数据),服务端处于SYN-RCVD状态

  • 三握要进行C-S的第二个SYN发送客户端把收到的(server-isn+1)放到确认应答号字段中,(本次报文中可以包含应用层数据),客户端处于ESTABLISHED状态

  • 服务端收到三握信息,进入ESTABLISHED状态

初始序列号ISN是如何随机产生的

ISN = M + F(localhost,localport,remotehost,remoteport)

M是一个计时器,这个计时器每隔四微秒加以1一

F是一个Hash算法,根据源IP,源端口,目的IP,目的端口生成一个随机数值

三次握手丢失分别发生什么

一握丢失

客户端发送的第一个SYN如果长时间没有收到响应会触发超时重传,并且重新传输的SYN报文的序列号不会发生改变

第一次超时重传一般第一次在1秒后,第二次在2秒后,三次4秒后,4次8秒后,每次超时重传的时间是上一次的两倍

一般来说还会有一个超时重传次数上限,达到这个上限连接就会断开

二握丢失

二次握手内容分为两部分,对客户端的ACK和服务端自己的SYN

对第一次握手的ACK丢失,客户端一直收不到第一次握手的响应,可能触发客户端的超时重传机制

对于服务端自己的SYN丢失,服务端在完成握手后会等待第三次握手客户端发来的ACK报文,如果一直等不到,可能触发服务端的超时重传机制

不论是谁触发超时重传,只要到达他的最大超时重传次数,就会断开连接

三握丢失

三握是客户端给服务端发送SYN,服务端收不到SYN,就会触发超时重传机制,达到服务端的超时重传次数上限就服务端就会断开连接。

ACK报文不会有重传的,当ACK丢失了,就要由对方重传对应的报文

SYN攻击

什么是SYN攻击

在TCP三次握手时Linux内核会维护两个队列

  • 半连接队列,也称SYN队列

  • 全连接队列,也称accept队列

黑客会在短时间内伪造多个IP发送SYN请求给服务端,服务端会一一恢复ACK-SYN报文,进入SYN_RCVD状态,但是一直收不到客户端的ACK应答,久而久之,服务端的半连接队列就会被占满,使得服务端不能正常服务用户

format,png-20230309230622886

如何避免SYN攻击

  1. 增大TCP半连接队列

  2. 使用syncookie功能,当半连接队列满了后,后续的SYN包不会丢弃,而是计算出一个cookie的值,夹在ACK的序列号中返回给客户端,收到客户端的ACK后验证cookie,放进Accept队列,再从Accept队列中取出连接使用

  3. 减少SYN-ACK重传次数,加速处于SYN_REVC状态的TCP连接断开,减少TCP半连接队列的压力

TCP四次挥手

开始处于正常连接状态,客户端和服务端都处于ESTABLISHED状态

  • 此时,客户端想要断开连接,向服务端发送一个TCP首部FIN标志位被标记为1的报文,即FIN报文客户端进入FIN_WAIT_1状态

  • 服务端收到报文后,向客户端发送ACK报文服务端进入CLOSED_WAIT状态

  • 客户端收到服务端的ACK报文后,进入FIN_WAIT_2状态

  • 服务端接着处理未处理完的数据,处理完后也向客户端发送FIN报文服务端进入LAST_ACK阶段

  • 客户端收到FIN报文后,回应一个ACK报文,进入TIME_WAIT状态

  • 服务端收到回应,进入CLOSED状态

  • 客户端等待2MSL后,自动进入CLOSED状态

为什么要挥手四次

可以看到,在回复了客户端的FIN之后服务端可能仍然有要处理的数据和没来得及给客户端发送的响应,所以,要等服务端处理完手头的事务之后再给客户端发送FIN报文来同意断开连接,所以需要四次挥手

四次挥手丢失分别发生什么

第一次挥手

第一次挥手主要是客户端向服务端发送FIN报文,客户端已经进入FIN_WAIT_1状态了,如果一直收不到ACK,就触发超时重传机制,如果超过最大重传次数,就断开连接

第二次挥手

第二次挥手主要是服务端给客户端发送ACK,此时服务端进入CLOSE_WAIT状态,如果ACK丢失,ACK不会重传,客户端出发超时重传,重新发送FIN报文,超过次数上限连接断开

第三次挥手

处于CLOSE_WAIT状态的服务端会给客户端发送FIN报文,进入LAST_ACK状态,如果FIN丢失,一直收不到响应,服务端就进入超时重传,客户端再FIN_WAIT_2状态会有一个60秒的时间上限,等待超过60秒客户端就会主动断开连接

第四次挥手

客户端收到FIN报文,回复ACK报文,进入TIME_WAIT状态,这个状态会持续2MSL,如果服务端没有收到ACK,就会重传FIN,如果客户端在2MSL时间内收到了新的FIN,就会刷新等待时间,当然,超过服务端的超时重传次数限制之后服务端就会主动断开连接

TIME_WAIT状态

为什么TIME_WAIT等待时间是2MSL

MSL是报文最大生存时间,他是任何报文在网络上存在的最长时间,超过这个时间就会被丢弃。

网络中某些数据包可能来自发送方,这些发送方的数据包被接收方处理后又会向对方发送响应,一来一回需要等待两倍的时间

所以2MSL就是允许一次请求丢失

为什么需要TIME_WAIT状态

主动发起关闭连接的一方才会有TIME_WAIT状态

主要有两个原因

  • 防止历史连接中的数据被后面相同四元组的链接错误的接收

  • 保证被动关闭连接的一方能正确地关闭

TIME_WAIT过多有什么危害

  • 占用系统资源

  • 占用端口资源

如何优化TIME_WAIT

  • 将长时间处于TIME_WAIT状态的socket为新的连接所用

  • 限制系统中处于TIME_WAIT状态的连接数量

服务器出现大量TIME_WAIT状态的原因

  • HTTP没有使用长连接,这种情况一般都是由服务端主动断开连接的,所以服务端会存在处于TIME_WAIT状态的连接

  • HTTP长连接超时,此时服务端主动断开连接,就会产生处于TIME_WAIT状态的连接

  • HTTP长连接的请求数量达到上限,一般服务端都会设置长连接数量上限,长连接超过上限服务端就会主动关闭连接,产生TIME_WAIT状态的连接

连接建立后客户出问题怎么办

在连接建立后,服务端处于ESTABLISHED状态,如果客户端出问题,一直不关闭这个连接,就会占用资源,TCP有保活机制,会在连接建立后每隔一个时间段发送一个探测报文(报文中数据很少),如果连续几个报文都没有得到回应则认为该TCP连接已经死亡,会关闭该链接。

连接建立后服务端出问题怎么办

TCP的链接信息是内核维护的,当服务端出问题后,内核会介入,给客户端发送FIN报文,开始四次挥手,断开连接

TCP重传、滑动窗口、流量控制、拥塞控制

相关文章:

TCP三握四挥

TCP三握(简述) 一开始,客户端和服务端都处于closed状态,服务端主动监听某个端口,处于listen状态 一握要进行C-S的第一个SYN发送,客户端会随机初始化序列号(client_isn)并将其置于TCP首部的序列号字段中,并且将SYN标志…...

java项目之大型商场应急预案管理系统(源码+文档)

项目简介 大型商场应急预案管理系统实现了以下功能: 大型商场应急预案管理系统的主要使用者管理员功能有个人中心,员工管理,预案信息管理,预案类型管理,事件类型管理,预案类型统计管理,事件类…...

【C++】--内存管理

👾个人主页: 起名字真南 👻个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 C/C内存分布2 C语言中动态内存管理方式 :3 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4 operator new与operator delete4.1 opera…...

【设计模式系列】模板方法模式

一、什么是模板方法模式 模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些存在共同行为的类&#x…...

java8 Stream流详细API及用法

目录 整理的更全面的API及用法 创建Stream流 中间操作 filter 过滤 map 映射 flatMap 扁平映射 sorted 排序 limit 截断 skip 跳过 distinct 去重 peek 遍历 终端操作 forEach 遍历 forEachOrdered 顺序遍历 min 统计最小值 max 统计最大值 count 统计元素数量 f…...

Redis——持久化

文章目录 Redis持久化Redis的两种持久化的策略定期备份:RDB触发机制rdb的触发时机:手动执行save&bgsave保存测试不手动执行bgsave测试bgsave操作流程测试通过配置,自动生成rdb快照RDB的优缺点 实时备份:AOFAOF是否会影响到red…...

川字结构布局/国字结构布局

1.串字结构布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&g…...

2013年国赛高教杯数学建模C题古塔的变形解题全过程文档及程序

2013年国赛高教杯数学建模 C题 古塔的变形 由于长时间承受自重、气温、风力等各种作用&#xff0c;偶然还要受地震、飓风的影响&#xff0c;古塔会产生各种变形&#xff0c;诸如倾斜、弯曲、扭曲等。为保护古塔&#xff0c;文物部门需适时对古塔进行观测&#xff0c;了解各种变…...

web 0基础第一节 文本标签

这是一个html文件的基本结构 在vs code 中使用英文的 ! 可快捷设置这样的结构 <!-- --> 是在html写注释的结构 <!DOCTYPE html> <!--标识当前文档类型为html--> <html> …...

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载&#xff1a; 一定要下载编译后的文件&#xff0c;后缀为bin.tar.gz w…...

【Sqlite】sqlite内部函数sqlite3_value_text特性

目录 ⚛️1 结论 ☪️2 说明 ☪️3 传入数值转成科学计数法 ♋3.1 只有整数部分 ♏3.2 只有小数部分 ♐3.3 整数小数 ⚛️1 结论 整数(sqlite视为int64)位数 > 20位&#xff0c;sqlite3_value_text 采用科学计数法。否则正常表示。 浮点数(sqlite视为double)的整数部…...

树莓派应用--AI项目实战篇来啦-4.OpenCV读取、写入和显示视频

1. 介绍 视频是由一张一张图片组成的&#xff0c;所以读取视频就相当于读取很多张图片&#xff0c;然后将其连起来cv2.VideoCapture可以捕获摄像头&#xff0c;但是针对树莓派的CSI摄像头调用方式采用了之前介绍的Picamera2 库&#xff0c;所以在调用的时候是有区别的&#xff…...

智能电子后视镜,汽车驾驶更安全,会是一种趋势

相比于传统的后视镜&#xff0c;智能电子后视镜的确有很多的优点。在下雨天和夜晚场景&#xff0c;电子后视镜可以说是表现优秀。 我之前一直以为我们国内是有规定不能使用电子后视镜。没想到&#xff0c;偶然刷到享界S9的视频&#xff0c;这电子后视镜&#xff0c;妥妥的给安排…...

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…...

最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)

使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; SparkAi系统现已支持自定义添加官方GPTs&#xff08;对专业领域更加专业&#xff0c;支持多模态文档&#xff0…...

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架&#xff0c;已有多家游戏厂商在生产环境使用&#xff0c;官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力&#xff0c;但是UOS目前不支持自建的Dedicated servers 集群&#x…...

Chainlit集成Dashscope实现语音交互网页对话AI应用

前言 本篇文章讲解和实战&#xff0c;如何使用Chainlit集成Dashscope实现语音交互网页对话AI应用。实现方案是对接阿里云提供的语音识别SenseVoice大模型接口和语音合成CosyVoice大模型接口使用。针对SenseVoice大模型和CosyVoice大模型&#xff0c;阿里巴巴在github提供的有开…...

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…...

顺序表的定义

一.顺序表的定义 顺序表--用顺序存储的方式实现线性表 顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中&#xff0c;元素之间的关 系由存储单元的邻接关系来体现。 二.顺序表的实现--静态分配 #include<stdio.h> #define MaxSize 10 //定义最大长度 …...

青少年编程能力等级测评CPA C++一级试卷(1)

青少年编程能力等级测评CPA C一级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; CP1_1_1&#xff0e;在C中&#xff0c;下列变量名正确的是&#xff08; &#xff09;。 A&#xff0e;$123 B&#…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...