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应答,久而久之,服务端的半连接队列就会被占满,使得服务端不能正常服务用户

如何避免SYN攻击
-
增大TCP半连接队列
-
使用syncookie功能,当半连接队列满了后,后续的SYN包不会丢弃,而是计算出一个cookie的值,夹在ACK的序列号中返回给客户端,收到客户端的ACK后验证cookie,放进Accept队列,再从Accept队列中取出连接使用
-
减少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题 古塔的变形 由于长时间承受自重、气温、风力等各种作用,偶然还要受地震、飓风的影响,古塔会产生各种变形,诸如倾斜、弯曲、扭曲等。为保护古塔,文物部门需适时对古塔进行观测,了解各种变…...
web 0基础第一节 文本标签
这是一个html文件的基本结构 在vs code 中使用英文的 ! 可快捷设置这样的结构 <!-- --> 是在html写注释的结构 <!DOCTYPE html> <!--标识当前文档类型为html--> <html> …...
Zookeeper快速入门:部署服务、基本概念与操作
文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载: 一定要下载编译后的文件,后缀为bin.tar.gz w…...
【Sqlite】sqlite内部函数sqlite3_value_text特性
目录 ⚛️1 结论 ☪️2 说明 ☪️3 传入数值转成科学计数法 ♋3.1 只有整数部分 ♏3.2 只有小数部分 ♐3.3 整数小数 ⚛️1 结论 整数(sqlite视为int64)位数 > 20位,sqlite3_value_text 采用科学计数法。否则正常表示。 浮点数(sqlite视为double)的整数部…...
树莓派应用--AI项目实战篇来啦-4.OpenCV读取、写入和显示视频
1. 介绍 视频是由一张一张图片组成的,所以读取视频就相当于读取很多张图片,然后将其连起来cv2.VideoCapture可以捕获摄像头,但是针对树莓派的CSI摄像头调用方式采用了之前介绍的Picamera2 库,所以在调用的时候是有区别的ÿ…...
智能电子后视镜,汽车驾驶更安全,会是一种趋势
相比于传统的后视镜,智能电子后视镜的确有很多的优点。在下雨天和夜晚场景,电子后视镜可以说是表现优秀。 我之前一直以为我们国内是有规定不能使用电子后视镜。没想到,偶然刷到享界S9的视频,这电子后视镜,妥妥的给安排…...
IEC104规约的秘密之九----链路层和应用层
104规约从TCP往上,分成链路层和应用层。 如图,APCI就是链路层,ASDU的就是应用层 我们看到报文都是68打头的,因为应用层报文也要交给链路层发送,链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…...
最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)
使用指南 直接复制在AI工具助手中使用(提问前) 可以前往已经添加好Prompt预设的AI系统测试使用(可自定义添加使用) SparkAi系统现已支持自定义添加官方GPTs(对专业领域更加专业,支持多模态文档࿰…...
DockerCompose 启动 open-match
背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架,已有多家游戏厂商在生产环境使用,官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力,但是UOS目前不支持自建的Dedicated servers 集群&#x…...
Chainlit集成Dashscope实现语音交互网页对话AI应用
前言 本篇文章讲解和实战,如何使用Chainlit集成Dashscope实现语音交互网页对话AI应用。实现方案是对接阿里云提供的语音识别SenseVoice大模型接口和语音合成CosyVoice大模型接口使用。针对SenseVoice大模型和CosyVoice大模型,阿里巴巴在github提供的有开…...
Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))
1.Canal介绍 Canal把自己伪装成从数据库,获取mysql主数据库的日志(binlog)信息,所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量…...
顺序表的定义
一.顺序表的定义 顺序表--用顺序存储的方式实现线性表 顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关 系由存储单元的邻接关系来体现。 二.顺序表的实现--静态分配 #include<stdio.h> #define MaxSize 10 //定义最大长度 …...
青少年编程能力等级测评CPA C++一级试卷(1)
青少年编程能力等级测评CPA C一级试卷(1) 一、单项选择题(共20题,每题3.5分,共70分) CP1_1_1.在C中,下列变量名正确的是( )。 A.$123 B&#…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
