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

TCP三次握手全方面详解

文章目录

  • (1) 三次握手各状态
    • CLOSE状态
    • SYN_SENT状态
    • SYN_RECV状态
    • ESTABLISHED状态
  • (2) 为什么握手时的seqnum是随机值,以及acknum的功能
  • (3) 三次握手中的半连接队列(SYN队列)和全连接队列(ACCEPT队列)
    • 半连接队列
    • 全连接队列
  • (4) 怎么缓解SYN泛洪
  • (5) TCP实现P2P
  • (6) 为什么需要三次握手?

在这里插入图片描述

(1) 三次握手各状态

CLOSE状态

发起连接和listen之前的初始状态

SYN_SENT状态

第一次握手,客户端向服务器发起连接请求,发送一个SYN数据包,该数据包中包含了客户端的初始序列号等信息,用于请求与服务器建立TCP连接
SYN_SENT: 初始状态发送SYN报文后,即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。

SYN_RECV状态

第二次握手,服务器接着会向客户端发送一个SYN+ACK数据包,这是对客户端SYN请求的响应。该数据包包含了服务器的初始序列号以及对客户端SYN包的确认信息,表示服务器同意与客户端建立连接。
SYN_RCVD: 这个状态表示LISTEN状体时接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态

ESTABLISHED状态

第三次握手,客户端收到服务器的SYN+ACK包后,会 向服务器发送一个ACK数据包 ,用于确认收到了服务器的SYN+ACK包。这个ACK包标志着客户端和服务器之间的TCP连接已经基本建立成功,此时连接处于ESTABLISHED状态。

当服务端收到收到ack包以后会进入ESTABLISHED状态。

(2) 为什么握手时的seqnum是随机值,以及acknum的功能

在第一次握手的时候,tcp包头部的Sequence number是一个随机值,就算自己随便设置一个值后续的TCP连接也是可以正常运作的(上图的seqnum = 1234),但是在第二次握手回复的TCP包中的acknum会比第一次握手的Sequence number多一(acknum 1235),这里的1235表示表示 1235以前的所有包都收到了,作用:保证了tcp包的不丢失,不重复
包括第二次握手时服务端发出的seqnum也是随机值(4567),但是第三次握手时的acknum是seqnum+1(4568)
作用:避免被抓包以后被别人知道之前发过多少个包

(3) 三次握手中的半连接队列(SYN队列)和全连接队列(ACCEPT队列)

在这里插入图片描述

半连接队列

当服务器收到客户端发送的 SYN 报文段时,会创建一个半连接节点并放进半连接队列,该节点记录了该连接的相关信息,如客户端的 IP 地址、端口号等,此时连接处于半连接状态,

SYN队列的作用:在服务器处理能力有限的情况下,SYN 队列可以暂时缓存客户端的连接请求,避免因为同时处理过多连接请求而导致系统崩溃。

全连接队列

服务器收到客户端的ACK包后,会检查这个ACK包的合法性和有效性,如确认序列号是否正确等。如果检查通过,服务器会将对应的连接从SYN队列中取出,并放入accept队列。Accept 队列用于存放已经完成三次握手的 TCP 连接,此时,应用程序就可以通过调用accept系统调用从accept队列中获取已经建立好的连接,开始进行数据传输等操作。

Accept队列的作用
(1)Accept 队列将网络层已经建立好的连接与应用层的处理隔离开来。应用层可以按照自己的节奏从 Accept 队列中获取连接,而不会受到网络层连接建立速度的直接影响。

(2)缓冲连接数据:在应用程序暂时无法处理新连接时,Accept 队列可以作为一个缓冲区域,存储这些已经建立的连接,避免连接因为等待处理时间过长而出现问题。

(4) 怎么缓解SYN泛洪

(1)net.ipv4.tcp_max_syn_backlog:在 Linux 系统中,该参数用于设置 SYN 队列的最大长度。默认值通常为 1024 或 2048,可以根据服务器的性能和实际需求进行调整。
通过限制 SYN 队列的长度,可以在一定程度上抵御 SYN Flood 攻击。当 SYN 队列已满时,服务器会丢弃新的 SYN 请求,从而避免被大量伪造的 SYN 报文淹没。

(2)somaxconn:这是系统级别的参数,用于限制 Accept 队列的最大长度。在不同的操作系统中,默认值可能不同。例如在 Linux 中,默认值通常为 128。
listen(int socketfd, int backlog):在网络编程中,listen 函数backlog 参数用于设置服务器端监听套接字的 Accept 队列长度。它会覆盖系统默认的 somaxconn 值,但通常不能超过 somaxconn。
当 Accept 队列已满时,服务器会拒绝新的 SYN 请求,从而避免服务器因处理大量的 SYN 请求而耗尽资源,在一定程度上可以缓解 SYN 泛洪攻击对服务器造成的影响。

(5) TCP实现P2P

在这里插入图片描述
P2P中没有客户端和服务端的概念

(6) 为什么需要三次握手?

三次握手的主要目的是为了确认服务器端和客户端的发送和接受能力是否正常

  • 第一次握手:客户端发送网络包,服务端收到了。 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

  • 第二次握手:服务端发包,客户端收到了。 这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。

  • 第三次握手:客户端发包,服务端收到了。 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

假设只有两次握手。
当客户端发送第一个SYN,但由于网络延迟或其他原因,第一个SYN没有及时到达服务端,于是客户端又发送一次SYN,这次的SYN成功到达了服务端,在连接结束后,第一个SYN终于到了服务端,此时服务端以为客户端再次发起连接请求,于是回复ACK+SYN导致再次连接再次建立,浪费资源

相关文章:

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值,以及acknum的功能(3) 三次握手中的半连接队列(SYN队列)和全连接队列(ACCEPT队列)半连接队列全连接队…...

【C#】一维、二维、三维数组的使用

在C#中,数组是用于存储固定数量相同类型元素的数据结构。根据维度的不同,可以分为一维数组、二维数组(矩阵阵列)、三维数组等。每增加一个维度,数据的组织方式就会变得更加复杂。 一维数组 一维数组是最简单的数组形…...

MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索

自OpenAI的o1发布以来,研究社区为提升开源LLM的高级推理能力做出了诸多努力,包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索(MCTS)以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向:使LLM具备自回…...

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种: class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示: 每个 class 的字节码文件中都有一个常量池,里面是编译后即知的该 class 会用到的字面量与符号引…...

w200基于spring boot的个人博客系统的设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...

【算法】快速排序算法的实现:C 和 C++ 版本

1. 算法简介 快速排序(Quick Sort)是由英国计算机科学家霍尔(C.A.R. Hoare)在1960年提出的一种高效的排序算法。它采用了分治法(Divide and Conquer)策略,通常具有很好的性能。在平均情况下,快速排序的时间复杂度为 O(n log n),但在最坏情况下可能退化为 O(n^2),不过…...

前沿科技一览未来发展趋势

脑机接口技术在医疗康复领域有了新进展。这技术让机器读懂大脑信号,帮助病人找回身体功能。 比如,瘫痪人士可以用它来控制假肢。在美国,一名瘫痪者通过这个技术,能用自己意念控制机械臂,喝到饮料。这种技术对提升患者…...

js滚动到页面最底部

setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...

视觉硬件选型和算法选择(CNN)

基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术,通过光学系统、图像传感器等设备获取图像,并运用图像处理和分析算法来提取信息,以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…...

Mybatis篇

1,什么是Mybatis ( 1 )Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…...

【Python】元组

个人主页:GUIQU. 归属专栏:Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…...

【AI实践】deepseek支持升级git

当前Windows 11 WSL的git是2.17,Android Studio提示需要升级到2.19版本 网上找到指导文章 安装git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…...

【AI实践】Cursor上手-跑通Hello World和时间管理功能

背景 学习目的:熟悉Cursor使用环境,跑通基本开发链路。 本人背景:安卓开发不熟悉,了解科技软硬件常识 实践 基础操作 1,下载安装安卓Android Studio 创建一个empty project 工程,名称为helloworld 2&am…...

Redis数据库(二):Redis 常用的五种数据结构

Redis 能够做到高性能的原因主要有两个,一是它本身是内存型数据库,二是采用了多种适用于不同场景的底层数据结构。 Redis 常用的数据结构支持字符串、列表、哈希表、集合和有序集合。实现这些数据结构的底层数据结构有 6 种,分别是简单动态字…...

【计组】实验五 J型指令设计实验

目录 一、实验目的 二、实验环境 三、实验原理 四、实验任务 代码 一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握lw, sw, beq, bne, lui, j, jal指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 …...

ubuntu 本地部署deepseek r1 蒸馏模型

本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署:基于docker安装,且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线操作。它支持各种 LLM…...

RestTemplate Https 证书访问错误

错误信息 resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.c…...

MySQL内存使用率高且不释放问题排查与总结

背景 生产环境mysql 5.7内存占用超过90%以上,且一直下不来。截图如下: 原因分析 1、确定mysql具体的占用内存大小,通过命令:cat /proc/Mysql进程ID/status查看 命令执行后的结果比较多(其他参数的含义想了解可参考这…...

mysql8 从C++源码角度看sql生成抽象语法树

在 MySQL 8 的 C 源码中,SQL 语句的解析过程涉及多个步骤,包括词法分析、语法分析和抽象语法树(AST)的生成。以下是详细的解析过程和相关组件的描述: 1. 词法分析器(Lexer) MySQL 使用一个称为…...

【DeepSeek】DeepSeek概述 | 本地部署deepseek

目录 1 -> 概述 1.1 -> 技术特点 1.2 -> 模型发布 1.3 -> 应用领域 1.4 -> 优势与影响 2 -> 本地部署 2.1 -> 安装ollama 2.2 -> 部署deepseek-r1模型 1 -> 概述 DeepSeek是由中国的深度求索公司开发的一系列人工智能模型,以其…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

uniapp中使用aixos 报错

问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...