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导致再次连接再次建立,浪费资源

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法-递归

单路递归 二分查找 /*** 主函数:执行二分查找。* * param a 要搜索的数组(必须是已排序的)* param target 目标值* return 返回目标值在数组中的索引;如果未找到,则返回 -1*/ public static int binarySearch(int[] …

Termux安装ssh实现电脑ssh

Termux下载 点击下载 在 Termux 中安装并使用 SSH,按照以下步骤操作: 1. 更新软件包列表 pkg update && pkg upgrade2. 安装 OpenSSH pkg install openssh3. 设置 SSH 密码(必须,否则无法使用 SSH 服务器&#xff09…

深入理解 C++17 std::is_swappable

文章目录 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的变体注意事项结论 深入理解 C17 std::is_swappable 引言 在 C 编程中,交换两个对象的值是一个常见的操作。为了确保代码的通用性和安全性&am…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上,其内部结构如图4-1所示。作为单一芯片的计算机,它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU,由运算器和控制器两个部分构成;…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太强~~ DeepMind 表示,他们提出的算法蒸馏(AD)是首个通过对具有模仿损失的离线数据进行顺序建模以展示上下文强化学习的方法。同时基于观察…

c#对接deepseek 聊天AI接口

注意:不是免费 对接文档:对话补全 | DeepSeek API Docs 注册地址:DeepSeek 申请key 在线请求示例 apifox deepseek - deepseek

23.PPT:校摄影社团-摄影比赛作品【5】

目录 NO12345​ NO6 NO7/8/9/10​ 单元格背景填充表格背景填充文本框背景填充幻灯片背景格式设置添加考生文件夹下的版式 NO12345 插入幻灯片和放入图片☞快速:插入→相册→新建相册→文件→图片版式→相框形状→调整边框宽度左下角背景图片:视图→…

创新领先!珈和科技获评省级企业技术中心

为充分发挥中小企业创新主体作用,提高自主创新、集成创新和引进消化吸收再创新能力,增强创新驱动发展的动力,做好专精特新“小巨人”企业的培育工作。 近日,湖北省经信厅对申报2024年湖北省中小企业技术中心的企业进行审核认定并…

初次体验Tauri和Sycamore (2)

原创作者:庄晓立(LIIGO) 原创时间:2025年2月8日(首次发布时间) 原创链接:https://blog.csdn.net/liigo/article/details/145520637 版权所有,转载请注明出处。 关键词:Sy…

vs封装dll 给C#使用

一,vs创建控制台应用 创建控制台应用得好处时,我们可以自己测试接口,如果接口没有问题,改成dll重新编译一遍就可以。 二, 创建一个c 类,将所需提供得功能 封装到类中。 这样可以将 所有功能,进…

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code(简称 VSCode)是一款由微软开发的免费开源代码编辑器,自 2015 年发布以来,凭借其轻便、强大、且拥有丰富扩展生态的特点,迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统,包…

html 列动态布局

样式说明: /* 列动态布局,列之间以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }

从O(k*n)到O(1):如何用哈希表终结多层if判断的性能困局

【前言】   本文将以哈希表重构实战为核心,完整展示如何将传统条件匹配逻辑(上千层if-else判断)转化为O(1)的哈希表高效实现。通过指纹验证场景的代码级解剖,您将深入理解:   1.哈希函数设计如何规避冲突陷阱   2.链式寻址法的工程实现…

第 26 场 蓝桥入门赛

3.电子舞龙【算法赛】 - 蓝桥云课 问题描述 话说这年头,连舞龙都得电子化!这不,蓝桥村的老程序员王大爷突发奇想,用LED灯带和一堆传感器鼓捣出了一条“电子舞龙”,它能根据程序指令在村里的广场上“翩翩起舞”。 广…

0012—数组

存取一组数据,使用数组。 数组是一组相同类型元素的集合。 要存储1-10的数字,怎么存储? C语言中给了数组的定义:一组相同类型元素的集合。 创建一个空间创建一组数: 一、数组的定义 int arr[10] {1,2,3,4,5,6,7,8,…

详细教程 | 如何使用DolphinScheduler调度Flink实时任务

Apache DolphinScheduler 非常适用于实时数据处理场景,尤其是与 Apache Flink 的集成。DolphinScheduler 提供了丰富的功能,包括任务依赖管理、动态调度、实时监控和日志管理,能够有效简化 Flink 实时任务的管理和部署。通过 DolphinSchedule…

了解传输层TCP协议

目录 一、TCP协议段格式 二、TCP原理 1.确认应答 2.超时重传 3.连接管理 建立连接 断开连接 4.滑动窗口 5.流量控制 6.拥塞控制 7.延时应答 8.捎带应答 9.面向字节流 10.TCP异常情况 TCP,即Transmission Control Protocol,传输控制协议。人如…

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台: DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…

Linux之kernel(1)系统基础理论(1)

Linux之Kernel(1)系统基础理论(1) Author: Once Day Date: 2025年2月6日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Linux内核知识_Once-Day的…

【读书笔记·VLSI电路设计方法解密】问题46:什么是bug覆盖率

在IC设计项目的验证过程中,功能测试(通过使用测试平台)有助于定位设计错误或漏洞。这个验证过程有三个阶段:构建和启动测试平台、验证基本测试用例以及验证边界情况。 在前两个阶段,漏洞很容易被检测到,因…