TCP 连接管理 之 三次握手详解

(一)TCP三次握手详细过程及状态变化

1. 第一次握手(客户端 → 服务器)
  • 报文标志位SYN=1(同步序列号),ACK=0(首次握手无确认)
  • 序列号:客户端随机生成初始序列号(例如 seq=x
  • 过程:客户端发送SYN报文,进入SYN_SENT状态
  • 状态变化
    • 客户端:CLOSEDSYN_SENT
    • 服务器:LISTEN(等待连接)
2. 第二次握手(服务器 → 客户端)
  • 报文标志位SYN=1ACK=1(确认客户端的SYN)
  • 序列号:服务器随机生成初始序列号(例如 seq=y),确认号为 ack=x+1(第一次握手不携带数据,但SYN=1会消耗一个序列号)
  • 过程:服务器发送SYN+ACK报文,进入SYN_RCVD状态
  • 状态变化
    • 服务器:LISTENSYN_RCVD
    • 客户端:保持SYN_SENT
3. 第三次握手(客户端 → 服务器)
  • 报文标志位ACK=1SYN=0(非同步)
  • 序列号seq=x+1(收到的确认号),确认号为 ack=y+1(第二次握手不携带数据,但SYN=1会消耗一个序列号)
  • 过程:客户端发送ACK报文,双方进入ESTABLISHED状态
  • 状态变化
    • 客户端:SYN_SENTESTABLISHED
    • 服务器:SYN_RCVDESTABLISHED

(二)连接建立后数据传输的序列号规则

1. 客户端先发送数据
  • 客户端发送数据
    • seq=x+1(第三次握手没有数据部分,沿用第三次握手的序列号)
    • ack=y+1(保持对服务器序列号的确认)
  • 服务器响应ACK
    • seq=y+1(服务器初始序列号+1)
    • ack=x+1+数据长度(确认客户端数据)
2. 服务器先推送数据
  • 服务器发送数据
    • seq=y+1(握手最后使用的序列号)
    • ack=x+1(第三次握手没有数据部分,保持对客户端序列号的确认)
  • 客户端响应ACK
    • seq=x+1(客户端初始序列号+1)
    • ack=y+1+数据长度(确认服务器数据)
3. 关键点总结
  1. 初始序列号:双方随机生成,防止历史连接冲突。
  2. ACK确认机制:总是对已接收数据长度+1进行确认(期待下一个字节的序列号)。
  3. 数据传输:先发送数据的一方使用自己最后一次ACK的序列号作为起始值。

(三)TCP三次握手服务端资源建立的详细过程

1. 服务端内核在第一次握手(收到客户端的SYN报文)时为客户端生成套接字
2. 详细过程分析

① 第一次握手前(服务端状态:LISTEN

  • 服务端调用listen()后,进入LISTEN状态,此时仅有一个监听套接字(Listening Socket),用于接收所有客户端的连接请求。
  • 监听套接字不直接关联具体客户端,而是等待SYN报文触发新连接。

② 第一次握手(客户端发送SYN,服务端收到)

  • 内核动作
    当服务端内核收到客户端的SYN报文(标志位SYN=1)时,会立即创建一个普通套接字(Socket),称为未完成连接套接字(Incomplete Connection Socket),并进入SYN_RCVD状态。

    该套接字记录客户端的IP、端口、初始序列号(client_isn)等信息。
    此时套接字尚未完全建立(未通过第三次握手),但已占用资源(进入了半连接队列)。

  • 为什么此时生成?

    资源预留:为防止SYN Flood攻击,内核需要限制半连接队列大小(net.ipv4.tcp_max_syn_backlog)。
    状态跟踪:服务端需维护客户端的seq和连接状态,以完成后续握手。

③ 第二次握手(服务端发送SYN+ACK

  • 服务端使用新生成的套接字发送SYN+ACKseq=server_isn, ack=client_isn+1),但仍处于SYN_RCVD状态。
  • 此时套接字仍在半连接队列中,等待客户端的最终ACK

④ 第三次握手(客户端发送ACK,连接完成)

  • 服务端收到ACK后,将套接字从半连接队列移到全连接队列(Accept Queue),状态变为ESTABLISHED
  • 当服务端应用调用accept()时,从全连接队列中取出该套接字,交给应用程序使用。
3. 总结
阶段服务端动作套接字状态
第一次握手前仅有监听套接字(LISTEN无客户端套接字
第一次握手收到SYN后,内核生成新套接字半连接队列(SYN_RCVD
第三次握手后套接字移至全连接队列,等待accept()可用的ESTABLISHED套接字

① 为什么不在第三次握手后再生成套接字?

  • 如果在第三次握手后才生成,服务端无法在第二次握手时发送SYN+ACK(需要记录客户端信息)。
  • 提前生成可确保资源分配和状态跟踪,但需防范SYN Flood攻击(通过半连接队列限制)。

② 半连接队列 vs 全连接队列

  • 半连接队列(SYN Queue):存储未完成三次握手的套接字(SYN_RCVD状态),队列大小由net.ipv4.tcp_max_syn_backlog参数决定。
  • 全连接队列(Accept Queue):存储已完成握手但未被accept()的套接字(ESTABLISHED状态),队列大小由backlog参数和net.core.somaxconn决定。

③ 如果第三次握手的ACK丢失怎么办?

  • 服务端会重传SYN+ACK(次数由net.ipv4.tcp_synack_retries控制),超时后删除半连接套接字。

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

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

相关文章

day066-内容分发网络(CDN)与web应用防火墙(WAF)

文章目录0. 老男孩思想-老男孩名言警句1. 云产品日常管理2. 创建快照策略3. CDN 内容分发网络3.1 添加域名3.2 配置CNAME3.3 测试3.4 CDN刷新/预热3.5 命中率3.5.1 查看命中率3.5.2 CDN命中率低怎么办?3.6 访问控制3.7 流量限制4. WAF web应用防火墙4.1 使用WAF4.2 …

Redis高频问题全解析

Q1: Redis为什么这么快? Redis速度快主要有四个核心原因。首先是基于内存操作,所有数据都存储在内存中,避免了磁盘I/O的开销,内存读写速度比磁盘快几万倍。其次采用单线程模型,避免了多线程环境下的线程切换和锁竞争带…

【MATLAB】(三)数据类型与运算符

一.MATLAB的数据存储类型一般而言,在 MATLAB 中数据的存储与计算都是以双精度进行的,但有多种显示形式。在默认情况下,若数据为整数,就以整数表示;若数据为实数,则以保留小数点后4位的精度近似表示。用户可以改变数字显…

智能客服 VS 人工客服:电商企业该选哪种服务模式?

在数字化浪潮的推动下,电商企业对客户服务的效率和质量提出了更高要求。智能客服与人工客服作为两种主流服务模式,各有优劣。本文将从服务效率、成本投入、客户体验等维度,客观分析两者的特点,帮助电商企业做出合理选择。一、服务…

前端基础之《Vue(28)—Vue3 ref相关API》

ref相关API介绍1、ref()(1)ref介绍 ref用于定义基本数据类型,比如:string / boolean / number等(因为这几个没办法代理)。 ref的背后是使用reactive来实现的响应式。 使用.value来访问变量的值。&#xff0…

项目管理中如何避免延期?核心策略分析

在项目管理中避免延期,并非依赖于单一技巧,而是要构筑一个系统性的、多维度的防御体系。其核心策略涵盖了:进行全面细致的前期规划与估算、实施严格的范围管理与变更控制、建立主动式全过程风险管理机制、维持高透明度的持续沟通、以及采用数…

【计算机视觉与代码大模型全景解析:从理论基础到学习路线】

📘计算机视觉与代码大模型全景解析:从理论基础到学习路线📑 目录1️⃣ 摘要2️⃣ 计算机视觉与大模型基础理论  2.1 🧠 深度卷积神经网络基础原理  2.2 👁️‍🗨️ 计算机视觉的技术发展与视觉图灵概念…

力扣-104. 二叉树的最大深度

题目链接 104. 二叉树的最大深度 class Solution {public int maxDepth(TreeNode root) {if (root null)return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }小结:秒了!!!

在超算平台异构加速卡AI * 1卡的Ubuntu20.04环境下安装docker服务(未成功)

为了使用dify,需要安装docker服务,于是在超算平台异构加速卡AI * 1卡的Ubuntu20.04环境下尝试安装docker服务 首先要看下系统是Ubuntu的哪个版本: cat /etc/os-release NAME"Ubuntu" VERSION"20.04.1 LTS (Focal Fossa)"…

[特殊字符] 深入解析String的不可变性:Java字符串设计的精妙之处

一、什么是String的不可变性? String的不可变性是Java语言中一个基础但极其重要的概念。简单来说:一旦一个String对象被创建,它的值就永远不能被改变。任何看似"修改"字符串的操作,实际上都是创建了一个全新的String对象。 生活中的类比 想象一个刻在石头上的文字…

基于FRP + ttyd 的远程Web终端控制:无SSH环境下的救急方案

基于FRP ttyd 的远程Web终端控制:无SSH环境下的救急方案一、背景:当远程访问陷入困境时二、方案:FRP内网穿透 ttyd Web终端三、操作步骤详解(Linux环境)0. 前提条件1. 在被控服务器上创建工作目录2. 下载必要的软件3…

用 AI 自动生成口型同步视频,短视频内容也能一人完成

近几年做跨境电商或内容运营的同学,应该都能感受到视频内容正逐渐从“锦上添花”变成了“必选项”。尤其是 TikTok、Instagram Reels、Facebook 短视频、甚至一些独立站内嵌视频讲解页,对带讲解、有人脸、自然语音的视频内容都有显著的转化提升作用。但实…

全基因组关联分析(GWAS)中模型参数选择:MLM、GLM与FarmCPU的深度解析

全基因组关联分析(GWAS)是识别与复杂性状相关的遗传变异的重要工具。然而,模型选择不当会导致假阳性率升高或统计功效降低。本文将为大家介绍GWAS中如何选择合适的模型参数,重点解析广义线性模型(GLM)、混合线性模型(MLM)和FarmCPU三种主流模型的原理、区…

6.苹果ios逆向-过ssl证书检测-安装SSL Kill Switch 3

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

Tomcat,WebLogic等中间件漏洞实战解析

1.tomactCVE-2017-12615首先启动环境,这里所有的漏洞都是在vulhub中的然后去访问我们的网站点击打开哥斯拉去生成一个jsp木马然后打开抓包,刷新一下页面,修改put方法将我们的木马上传一下,这里需要在jsp后加一个/,来绕…

15、点云<—>深度图转换原理

* 定义虚拟相机分辨率. Width := 800 Height := 800* 定义一个系数用于在3D模型中计算图像的边缘 BorderFact := 1.5* 是否选择镜头. IsTelecentric := false GenParamName := [lut,intensity,disp_pose_0,alpha_0,disp_background] GenParamValue := [hsi,coord_z,true,0.3,tr…

大疆无人机开发:MQTT 赋能机场系统集成的Java实战之旅

目录 集成实现步骤​ 项目初始化​ MQTT 连接配置​ 大疆无人机与 MQTT 集成​ 机场系统功能实现​ 代码实战与案例分析​ 示例代码展示​ 案例分析​ 数据格式不匹配问题​ 指令冲突问题​ 性能优化与安全保障​ 性能优化策略​ 安全保障措施​ 集成实现步骤​ …

逻辑回归详解:从数学原理到实际应用

文章目录一、逻辑回归的核心思想:从线性到概率1. 线性回归的局限与突破Sigmoid函数特性(代码可视化):2. 逻辑回归的预测公式二、损失函数:如何学习最优参数?1. 对数损失函数的数学定义损失函数解析&#xf…

粒子群优化算法(Particle Swarm Optimization, PSO) 求解二维 Rastrigin 函数最小值问题

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

【GitHub Workflows 基础(二)】深入理解 on、jobs、steps 的核心语法与执行逻辑

📘 GitHub Workflows 基础(二):深入理解 on、jobs、steps 的核心语法与执行逻辑继第一篇讲完 .github/workflows/ 中多个工作流的结构后,本篇将深入 GitHub Actions 的核心三要素:on(触发器&…