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&#…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...