TCP 建链(三次握手)和断链(四次握手)

news2024/12/24 3:56:48

TCP 建链(三次握手)和断链(四次挥手)

  • 背景
  • 简介
  • 建链(三次握手)
  • 断链(四次挥手)
  • 序号及标志位
  • 延伸问题
    • 为什么建立连接需要握手三次,两次行不行?
    • 三次握手可以携带数据吗?
    • 为什么释放连接是四次,比建立连接多一次?
    • 为什么 `TIME_WAIT` 状态需要经过 `2MSL` 才能返回到 `CLOSED` 状态?

背景

随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全原创,大多是参考其他文章资料整理所得,感谢每位技术人的开源精神。

简介

本文介绍 TCP 的建链和断链过程,即通常所说的三次握手和四次挥手的过程。

建链(三次握手)

TCP 建链需要客户端与服务器之间交互 3 个数据包,主要作用就是为了确认双方的接收和发送能力是否正常,初始序列号、交换窗口大小以及 MSS 等信息。
TCP建链 - 三次握手

  • 第一次握手
    客户端发送请求连接数据包到服务器,标志位 SYN 置为 1,随机生成一个初始序号 seq ,即 SYN=1 seq=x,客户端从 CLOSED 状态进入 SYN_SENT 状态,等待服务器回复。

  • 第二次握手
    服务器收到请求数据包后根据标志位 SYN=1 知道客户端在请求建立连接,服务器将标志位 SYNACK 都置为 1,确认序号 ack=x+1,随机生成一个初始序号 seq=y,并将该数据包 SYN=1, ACK=1, seq=y, ack=x+1 回复给客户端确认连接请求,服务器从 LISTEN 状态进入 SYN_RCVD 状态。

  • 第三次握手
    客户端收到确认后检查确认序号 ack 是否为 x+1ACK 是否为 1,如果正确则将标志位 ACK 置为1,确认序号 ack=y+1,并将该数据包 ACK=1, seq=x+1, ack=y+1 发送给服务器,发送完成后客户端进入 ESTABLISHED 状态,服务器接收到后检查确认序号 ack 是否为 y+1,如果正确则连接建立成功,服务器进入 ESTABLISHED 状态。随后客户端与服务器间可以开始传输数据。

断链(四次挥手)

TCP断链 - 四次挥手

  • 第一次挥手
    客户端发起 FINFIN=1, ACK=1, seq=u, ack=v,客户端从 ESTABLISHED 状态进入 FIN_WAIT_1 状态。TCP 协议规定,即使 FIN 包不携带数据,也要消耗一个序号。此 FIN 包中 ACK=1ack=v 基于断链前正常通信的数据包。

  • 第二次挥手
    服务器收到 FIN 包,发出 ACK 确认包,并带上自己的序号 seq=vACK=1 seq=v ack=u+1),服务器进入从 ESTABLISHED 状态进入 CLOSE_WAIT 状态。此时客户端已经没有数据需要发送给服务器了,但服务器如果仍有数据发送给客户端的话,客户端依然需要接收。客户端接收到服务器发送的 ACK 后进入 FIN_WAIT_2 状态。

  • 第三次挥手
    服务器数据发送完成后向客户端发送 FINFIN=1, ACK=1, seq=w, ack=u+1,半连接状态下服务器可能又发送了一些数据,假设发送 seqw,服务器进入 LAST_ACK 状态。

  • 第四次挥手
    客户端接收到服务器的 FIN 包后发出确认包 ACK=1, seq=u+1, ack=w+1,客户端进入 TIME_WAIT 状态,此时 TCP 连接还没有释放,必须经过 2*MSL 后才进入 CLOSED 状态,而服务器接收到客户端的 ACK 后就进入了 CLOSED 状态,服务器结束 TCP 连接的时间要比客户端早一些。

序号及标志位

TCP 建链(三次握手)和断链(四次挥手)中涉及到几个关键概念字段:

  • 标志位:共有 6 个,分别是:
    • ACK:确认序号有效。
    • FIN:释放一个连接。
    • PSH:接收方应该尽快将这个报文交给应用层。
    • RST:重置连接。
    • SYN:发起一个新连接。
    • URG:紧急指针(urgent pointer)有效。
  • seq:Seq 序号,占 32 位,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  • ack:Ack 序号,占 32 位,只有 ACK 标志位等于 1 时此序号字段才有效,确认方 ack 等于发起方 seq + 1注意:ACKack 是两个不同的概念,不要混淆了。

延伸问题

为什么建立连接需要握手三次,两次行不行?

  • 原因一:TCP连接建立前需要确认客户端和服务器双方的收发包能力。
    • 第一次握手可以让服务器知道客户端的发送能力是正常的。
    • 第二次握手可以让客户端知道服务器的接收和发送能力都是正常的。
    • 第三次握手可以让服务器指导客户端的接收能力是正常的。
  • 原因二:确保序列号可靠同步。
    第二次握手服务器向客户端发送了自己的初始序列号,如果第二次握手报文丢失则客户端就无法知道服务器的初始序列号,所以需要第三次握手让服务器知道客户端已确认服务器的初始序列号。
  • 原因三:阻止重复历史连接的初始化。
    客户端由于某种原因发送了两个不同序号的 SYN 包,因为复杂的网络环境中旧的数据包有可能先到达服务器,如果是两次握手则服务器收到旧的 SYN 包就会立刻建立连接,从而造成网络异常。如果是三次握手,服务器需要回复 SYN+ACK 包,客户端会对比应答的序号,如果发现是旧的报文就会给服务器发 RST 包,直至正确的 SYN 包到达服务器后才正常建立连接。
  • 原因四:安全问题。
    TCP 新建连接时内核会为连接分配一系列内存资源,如果采用两次握手可能会放大DDOS 攻击。

三次握手可以携带数据吗?

第一次握手和第二次握手不可以携带数据,第三次握手可以携带数据。假如第一次握手携带数据,如果碰到恶意攻击,那么每次在第一次握手的 SYN 报文中都会加入大量数据,会造成服务器花费大量存储空间来缓存这些数据。

为什么释放连接是四次,比建立连接多一次?

建立连接时服务器的 SYNACK 是合并发送的,而因 TCP 是全双工通信,释放连接过程中在客户端发送 FIN 包后,服务器可能还有数据需要发送,不能立即关闭连接,所以不能同时发送 FIN 包和 ACK 包,只能先确认 ACK,然后等服务器无数据发送时再发送 FIN 包。

为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSED 状态?

MSL 是指报文在网络中的最大生存时间。

  • 原因一:在客户端回复服务器 FIN 包的确认包 ACK 后,这个 ACK 包可能是不可达的,如果服务器收不到 ACK 的话需要重新发送 FIN 包。所以客户端发送 ACK 后需要留出 2MSL 时间(ACK 到达服务器的时间 + 服务器重发 FIN 包时间),如果客户端等到 2MSL 后没有收到服务器重传的 FIN 包,说明可以确认服务器已经收到了客户端发送的 ACK 包。
  • 原因二:客户端发送完最后一个 ACK 包后,再经过 2MSL 时间就可以使当前连接持续的时间内所产生的所有报文都从网络中小时,使下一个新的连接中不会出现这种旧的连接请求报文。

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

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

相关文章

使用GPT-soVITS再4060下2小时训练声音模型以及处理断句带来的声音模糊问题

B站UP主视频 感谢UP主“白菜工厂1145号员工”的“熟肉”,我这篇笔记就不展示整一个训练和推理流程,重点写的4060该注意的一些事项。如何解决断句模糊的问题,在本篇笔记的最末尾。 相关连接: 原项目github UP主的说明文档 1、训…

Java Web学习笔记21——前后端分离开发

前后端混合开发: 沟通成本比较高。 分工不明确。 不便管理,不便于后期的维护和拓展。 前后端分离开发: 当前主流的开发模式:前后端分离开发: 接口文档: 接口并不是interface。 接口指的是业务功能。 …

【c语言】qsort函数及泛型冒泡排序的模拟实现

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 一、qsort函数 1.回调函数 2.qsort函数 3.void* 指针 二、泛型冒泡排序的模拟实现 1.比较函数的编写 2.交换函数的编写 3.冒泡排序的编写 4…

这家叉车AGV巨头2024年一季度销售4075万~

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 一、BALYO公司概览 BALYO,这家来自法国的仓储机器人公司,自2006年成立以来,一直致力于为全球客户提供…

佳禾食品入手逻辑

佳禾食品 公司名称:佳禾食品工业股份有限公司 A股简称:佳禾食品 成立日期:2001-05-15 上市日期:2021-04-30 所属行业:食品制造业 否 主营业务:植脂末、咖啡及其他固体饮料等产品的研发、生产和销售。 产品类…

LLVM Cpu0 新后端7 第一部分 DAG调试 dot文件 Machine Pass

想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1V_tZkt9uvxo5bnUufhMQ_Q?…

MySQL—多表查询—联合查询

一、引言 之前学习了连接查询。现在学习联合查询。 union:联合、联盟 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集 涉及到两个关键字:union 和 union all 注意: union 会把上面两个SQL查询…

ACDSee Photo Studio Ultimate v17 解锁版安装教程 (图片编辑器)

前言 ACDSee Photo Studio Ultimate 2024,一款适合各类摄影师和创意人士的综合解决方案,具备了经过省时的本地人工智能 (AI) 强化的全新特性和改进功能,使您能够以最小的投入获得最大的控制,从而更轻松地管理、检索和编辑您的照片…

【Python】数据处理:OS目录文件操作

Python的os模块是一个用于与操作系统进行交互的标准库模块。它提供了丰富的功能来处理文件和目录、执行系统命令、获取和设置环境变量等。 工作目录操作 获取当前工作目录 os.getcwd()参数:无返回值:一个字符串,表示当前工作目录的路径。这…

微信小程序学习笔记(4)

文章目录 1、< template >< / template >2、样式导入i、wxmlii、wxss 3、flex布局i、容器属性ii、项目属性 1、< template >< / template > 模板可以重复调用 首先要定义一个模板&#xff1a; <template name"test"><view>{{…

OpenCV 双目相机标定

文章目录 一、简介1.1单目相机标定1.2双目相机标定二、实现代码三、实现效果参考资料一、简介 1.1单目相机标定 与单目相机标定类似,双目标定的目的也是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要…

基础数据结构 -- 队列

1. 简介 Java中的数据结构队列&#xff08;Queue&#xff09;是一种线性表&#xff0c;其特殊之处在于它只允许在表的后端进行插入操作&#xff0c;在表的前端进行删除操作。这种先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的结构类似于现实生活中的排…

线性回归例子, 学习笔记[机械学习]

参考书籍, [pythonによる機械学習入門] y ax b # 直线的线性回归 import numpy as np import matplotlib.pyplot as plt # 求最小二乘法的回归直线,用到的库 from sklearn import linear_model# x 和 y的单点图 x np.random.rand(100, 1) x x*4-2 y 3*x-2 # 增加一部分乱…

Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

html--宇航员404

<!doctype html> <html> <head> <meta charset"utf-8"> <title>太空404</title><style> html {margin: 0;padding: 0;background-color: white; }body, html {width: 100%;height: 100%;overflow: hidden; }#svgContainer…

【设计模式】行为型设计模式之 职责链模式,探究过滤器、拦截器、Mybatis插件的底层原理

一、介绍 职责链模式在开发场景中经常被用到&#xff0c;例如框架的过滤器、拦截器、还有 Netty 的编解码器等都是典型的职责链模式的应用。 标准定义 GOF 定义&#xff1a;将请求的发送和接收解耦&#xff0c;让多个接收对象都有机会处理这个请求&#xff0c;将这些接收对象…

Leetcode1161. 最大层内元素和

Every day a Leetcode 题目来源&#xff1a;1161. 最大层内元素和 解法1&#xff1a;层序遍历 每次以「层」为单位进行拓展&#xff0c;统计该层的元素和&#xff0c;维护处理过程中的最大值层数和&#xff0c;以及层深度。 代码&#xff1a; /** lc appleetcode.cn id116…

高通开发系列 - 制作非root用户权限的debian镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述环境配置制作Debian base文件系统root权限构建Debian文件系统非root权限制作Debian文件系统制作image并运行概述…

Objective-C 学习笔记 | 基础

Objective-C 学习笔记 | 基础 参考书&#xff1a;《Objective-C 编程&#xff08;第2版&#xff09;》 第1部分 入门 Objective-C语言是以C语言为基础的&#xff0c;但增加了对面向对象编程的支持。Objective-C语言是用来开发在苹果iOS以及OS X操作系统上运行的应用的编程语…