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

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.mzph.cn/web/22245.shtml

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

相关文章

智领未来,安全无忧:智能网联汽车监控大屏的守护之旅

在繁忙的都市中,驾驶者往往面临着诸多安全隐患。传统的驾驶辅助系统虽然能够提供一定的帮助,但在复杂多变的交通环境中,其局限性也逐渐显现。而智能网联汽车安全监控大屏,正是为了解决这一问题而诞生的。 山海鲸可视化大屏 大屏采…

基础篇04——多表查询

多表关系 一对多 多对多 多对多是通过中间表实现的 -- 创建学生表 create table student (id int auto_increment primary key comment ID,name varchar(10) comment 姓名,no varchar(3) comment 学号 ) comment 学生表;insert into student values (null, 黛绮丝, 001),(…

SLAM中四元数、流形、李群、李代数是啥?

知识点得逻辑关系如下 引言 非线性问题由于复杂的数学结构,多样的解空间,局部极值等问题求解难度大大增加。所以在求解时需要把非线性问题转化为更容易处理的形式,例如 数值优化方法:数值优化方法包括梯度下降、共轭梯度法、牛顿…

Spring boot实现基于注解的aop面向切面编程

Spring boot实现基于注解的aop面向切面编程 背景 从最开始使用Spring,AOP和IOC的理念就深入我心。正好,我需要写一个基于注解的AOP,被这个注解修饰的参数和属性,就会被拿到参数并校验参数。 一,引入依赖 当前sprin…

寒武纪:“国产平替”道阻且长

英伟达的一季报反映了AI装备竞赛白热化,科技巨头们正疯狂加码投资。 不过,因为众所周知的原因,英伟达最先进的产品卖不到国内,虽然说一定程度上限制了咱们AI的发展,但也给国产AI芯片公司们提供了机会,其中就包括我们今…

K8S==ingress简单搭建和使用

基础环境 D:\DOCKER_REPO\K8S>kubectl version Client Version: v1.29.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.29.2 D:\DOCKER_REPO\K8S>kubectl get nodes NAME STATUS ROLES AGE VERSION docker-…

01_深度学习基础知识

1. 感知机 感知机通常情况下指单层的人工神经网络,其结构与 MP 模型类似(按照生物神经元的结构和工作原理造出来的一个抽象和简化了模型,也称为神经网络的一个处理单元) 假设由一个 n 维的单层感知机,则: x 1 x_1 x1​ 至 x n x_n xn​ 为 n 维输入向量的各个分量w 1 j…

【大学物理】Interference,diffraction,polarization:光学

nature of light definition speed of light reflection dispersion huygenss principle:惠更斯原理

OBD诊断协议

上周领导需要做个OBD相关的功能,我对OBD没有啥概念,于是周末就了解下这到底是个啥东西。了解过后发现很简单,其实就是个UDS协议的简化版,OBD是英文On-Board Diagnostics的缩写,中文翻译为“车载自动诊断系统”&#xf…

链表反转--理解链表指针的基本操作

链表反转--理解链表指针的基本操作 链表反转的方法--主要是理解链表指针链表心得类节点是对象和指针区别: 链表反转的方法–主要是理解链表指针 根据值创建新列表 用一个链表指针代替整个新链表 两个链表的赋值 递归求解反向链表 用一个链表代替前后链表数…

Qt应用程序发布

一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…

构建高效稳定的短视频直播系统架构

随着短视频直播的迅猛发展,构建一个高效稳定的短视频直播系统架构成为了互联网企业的重要挑战。本文将探讨如何构建高效稳定的短视频直播系统架构,以提供优质的用户体验和满足日益增长的用户需求。 ### 1. 短视频直播系统的背景 短视频直播近年来蓬勃发…

Pycharm 添加内容根

解决问题:包未能被正常引入时

try…except…finally语句

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 完整的异常处理语句应该包含finally代码块,通常情况下,无论程序中有无异常产生,finally代码块中的代码都会被执行…

2024 年该如何利用 MidJourney 创作AI艺术(详细教程)

什么是 Midjourney Midjourney 是根据文本提示创建图像的生成式人工智能的优秀范例。与 Dall-E 和 Stable Diffusion 一样,它已成为最受欢迎的人工智能艺术创作工具之一。与竞争对手不同的是,Midjourney 是自筹资金和封闭源代码的,因此对它的…

【WRF理论第二期】模型目录介绍

WRF理论第二期:模型目录介绍 1 WRF主目录2 WPS主目录3 编译后的可执行文件4 运行目录参考 了解 WRF 模型的目录结构有助于有效地管理和操作模型,从而确保模拟和分析工作的顺利进行。以下分解介绍WRF主目录、WPS主目录等。 Github-wrf-model/WRF 1 WRF…

leetCode-hot100-二分查找专题

二分查找 简介原理分析易错点分析例题33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置35.搜索插入位置240.搜索二维矩阵 Ⅱ 简介 二分查找,是指在有序(升序/降序)数组查找符合条件的元素,或者确定某个区间左右…

找不到steam_api64.dll,无法继续执行的原因及解决方法

电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们经常会遇到一些常见的问题,其中之一就是找不到某个特定的动态链接库文件,比如steamapi64.dll。这个问题可能会导致某些应用程序无法正常运行,给…

关于博图17安装体验过程—博图17安装失败原因(STEP7 许可证找不到)

目录 一、序言 二、正片 一、序言 该失败原因是在我使用Win11专业版安装博图17时出现的问题,也仅代表我的体验过程!以下我将安装过程和解决问题的过程描述一下,希望可以帮助和我一样自己安装博图时能够解决出现的问题。 二、正片 如果阁下…

linux驱动学习(五)之字符设备

需要板子一起学习的可以这里购买(含资料):点击跳转 一、 linux设备驱动分类 1、字符设备---char 应用程序与驱动程序在进行数据传输时,数据以"字节"为单位。 特点: [1] 按照顺序进行数据传输 [2] 数据传…