TCP详解之三次握手和四次挥手

TCP详解之三次握手和四次挥手

1. TCP基本认识

1.1 什么是 TCP

TCP是面向连接的、可靠的、基于字节流传输层通信协议。

1.2 TCP协议段格式

我们先来看看TCP首部协议的格式

TCP头部协议格式

我们先来介绍一些与本文关联比较大的字段,其他字段不做详细阐述。

序列号:在建立连接时,由计算机随机生成的数作为初始值,通过SYN报文传给接收端。每发送一次,就累加一次该数。用来解决网络包乱序问题。

确认应答号:指下次期望收到的数据的序列号,发送端收到这个确认应答后可以认为这个序号以前的数据都被接收端正常接收了。用来解决丢包问题。

标志位:

  • ACK:该位为1时,确认应答字段是否有效
  • RST:该位为1时,表示TCP连接中出现异常,必须强制断开连接。
  • SYN:该位为1时,表示希望建立连接,并在序列号字段进行序列号初始值的设定。
  • FIN:该位为1时,通知对端以后不会有数据发送,希望断开连接。当通信结束希望断开连接。

1.3 为什么需要 TCP 协议

IP层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中数据的完整性。

如果需要保障网络数据包的可靠性,就需要上层 传输层TCP协议来负责。

因为TCP是一个工作在传输层可靠数据传输服务,它能确保接收端接收的网络包是无损坏的、无间隔的、非冗余和按序的。

2. TCP连接建立

2.1 TCP三次握手过程是怎样的

TCP是面向连接的协议,所以使用TCP前必须先建立连接,而建立连接是通过三次握手来进行的。具体过程如下图所示:

TCP三次握手

  • 一开始,客户端和服务端都处于CLOSE状态。先是服务端主动监听某个端口,处于LISTEN状态。

  • 第一次握手,客户端会随机初始化序号(client_isn),将该序号设置为TCP首部序列号字段,同时把SYN标志位置为1,表示客户端向服务端发起连接,该报文不包含数据,之后客户端处于SYN_SENT状态。

    第一次握手

  • 第二次握手,服务端接收到客户端发来的SYN报文,首先也会随机初始化自己的序列号(server_isn),将此序号设置到TCP首部序列号字段,接着把确认应答号字段设置为client_isn + 1,把SYNACK标志位设置为1。最后把报文发送给客户端,该报文也不包含数据,服务端进入SYN_RCVD状态。

    第二次握手

  • 第三次握手,客户端收到SYN+ACK报文后,向服务端发送一个应答报文,将确认应答号设置为server_isn + 1ACK标志位也设置为1,最后把报文发送给客户端,此次报文可以包含数据,发送后客户端处于ESTABLISHED状态。

    第三次握手

  • 服务端收到报文后,也进入ESTABLISHED状态。

一旦完成三次握手,双方都处于ESTABLISHED状态,此时连接就已经建立完成,客户端和服务端就可以互相发送数据了。

2.2 为什么是三次握手,不是两次、四次

在前面,我们知道了什么是TCP连接:用于保证可靠性流量控制维护的某些状态信息,这些信息的组合称为连接。

接下来,以三个方面分析三次握手的原因:

  1. 三次握手才可以阻止重复历史连接的初始化(主要原因)
  2. 三次握手才可以同步双方的初始序列号
  3. 三次握手才可以避免资源浪费

2.2.1 避免历史连接

简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

假设,客户端先发送了SYN(seq = 90)报文,然后客户端宕机了,而且这个SYN报文还被网络阻塞了,服务器并没有收到,接着客户端重启,又像服务端建立连接,发送SYN(seq = 100)报文(这里不是重传,重传的SYN序号是一样的)。

  • 一个旧SYN报文新SYN报文早到达了服务端,这时服务端会回一个SYN+ACK报文给客户端,此报文中的确认应答号是91(90 + 1)。

  • 客户端收到后,发现自己期望收到的确认应答号应该是101(100 + 1),而不是91,于是就会回RST报文。

  • 服务端收到RST报文后,就会释放连接。

  • 后续新的SYN报文抵达服务器后,客户端与服务端就可以正常的完成三次握手了。

    避免历史连接

上述的旧SYN报文成为历史连接,TCP使用三次握手建立连接的最主要原因就是防止历史连接初始化了连接,造成资源浪费。

TIPS:有人可能会问了,如果服务端在收到RST报文之前,就先收到了新SYN报文,这时会发生什么?

当服务端第一次收到SYN报文,也就是收到旧SYN报文时,就会回复SYN+ACK报文给客户端,此时报文中的确认应答号是91(90 + 1)。

然后这时再收到新SYN报文时,就会回Challenge ACK报文给客户端,这个ACK报文并不是确认收到新SYN报文的,而是上一次的ACK确认应答号91(90 + 1)。所以客户端收到此ACK报文时,发现与期望收到的确认应答号101(100 + 1)不符,于是会回RST报文。

如果时两次握手连接,就无法阻止历史连接,在两次握手的情况下,服务端没有中间状态给客户端来阻滞历史连接,导致服务器可能建立一个历史连接,造成资源浪费。

在两次握手的情况下,服务器收到SYN报文后,就进入ESTABLISHED状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入ESTABLISHED状态,假设这次是历史连接,客户端判断到此次连接为历史连接,就会回RST报文来断开连接,而服务端在第一次握手时就进入了ESTABLISHED状态,所以它认为可以发送数据,但是它并不知道这是个历史连接,只有它收到RST报文后,才会断开连接。

两次握手

可以看到,如果两次握手建立TCP连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,不仅白白发送了数据,而且浪费了服务器的资源。

所以,TCP三次握手建立连接的主要原因就是防止历史连接初始化了连接。

2.2.2 同步双方初始序列号

TCP协议的通信双方,都必须维护一个序列号,序列号是TCP可靠传输的一个关键因素。

  • 接收方可以去除重复的数据
  • 接收方可以根据数据包的序列号按顺序接收
  • 可以标识发出去的数据包中,哪些是已经被对方收到的(通过ACK报文中的应答序列号知道)

可见,序列号在TCP连接中占据着非常重要的作用,所以当客户端发送携带初始序列号的SYN报文时,需要服务端回一个ACK应答报文,表示客户端的SYN报文已经被服务端成功接收,当服务端发送的初始序列号给客户端时,依然也要得到客户端的回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

四次握手和三次握手

四次握手也能够可靠的同步双方的初始化序列号,由于第二步和第三步可以优化成一步,所以就成了三次握手

而两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。

2.2.3 避免资源浪费

如果只有两次握手,当客户端发送的SYN报文在网络中阻塞,客户端没有接收到ACK报文,就会重新发送SYN,由于没有第三次握手,服务器不清楚客户端是否收到了字节回复的ACK报文,所以服务端每收到一个SYN就只能先主动建立一个连接,如果客户端大宋的SYN报文在网络中阻塞了,重复发送多次SYN报文,那么服务端在收到请求后就会建立多个冗余的无效连接,造成不必要的资源浪费。

两次握手

总结

TCP建立连接时,通过三次握手就能防止历史连接的建立,帮助双方同步初始序列号,减少双方不必要的资源开销。保证TCP连接的可靠性。

不使用两次握手和四次握手的原因:

  • 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方初始序列号
  • 四次握手:三次握手就已经理论上最少可靠连接建立,不需要更多的通信次数。

3. TCP连接断开

3.1 四次挥手的过程

天下没有不散的宴席,对于TCP连接也是这样。TCP连接断开是通过四次挥手方式。

双方都可以主动断开连接,断开连接后主机的资源将被释放,四次挥手过程如下图所示:

客户端主动关闭连接 —— TCP 四次挥手

  • 客户端打算关闭连接,此时会发送一个TCP首部FIN标志位被置为1的报文,之后客户端进入FIN_WAIT_1状态。
  • 服务端收到FIN报文后,就向客户端发送ACK应答报文,接着服务器进入CLOSE_WAIT状态。
  • 客户端收到ACK应答报文后,进入FIN_WAIT_2状态。
  • 等待服务端处理完数据后,也想客户端发送FIN报文,之后服务端进入LAST_ACK状态。
  • 客户端收到FIN报文后,回复一个ACK应答报文,之后进入TIME_WAIT状态。
  • 服务端收到ACK应答报文后,就进入CLOSE状态,至此服务端已经完成连接的关闭。
  • 客户端在经过2MSL一段时间后,自动进入CLSOE状态,至此客户端也完成连接的关闭。

每个方向都需要一个FIN和一个ACK,因此通常被称为四次挥手。

这里需要注意的是:主动关闭连接的,才有TIME_WAIT状态

3.2 为什么挥手需要四次

再来回顾一下四次挥手双方发FIN包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送FIN报文时,仅仅表示客户端不再发送数据了,但是还能接收数据。
  • 服务端收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN报文给客户端表示同意关闭连接。

从上面过程可知,服务端通畅需要等待完成数据的发送和处理,所以服务端的ACKFIN一般会分开发送,因此是需要四次挥手。

但是在特定情况下,四次挥手是可以变成三次挥手的

3.3 什么情况会出现三次挥手

当被动关闭方(这里是服务端)在TCP挥手过程中,没有数据要发送并且开启了TCP延迟确认机制,那么第二次和第三次挥手就会合并发送,这样就出现了三次挥手。

三次挥手

什么是延迟确认机制?

当发送没有携带数据的ACK报文时,它的网络效率是很低的,因为它也有40个字节的IP首部和TCP首部,但却没有携带数据报文。为了解决ACK传输效率低的问题,就衍生出了TCP延迟确认。TCP延迟确认的具体策略如下:

  • 当有响应数据要发送时,ACK会随着响应数据一起立刻发送给对端。
  • 当没有响应数据要发送时,ACK将会延迟一段时间,等待是否有响应数据可以一起发送。
  • 如果在延迟等待发送ACK期间,对方的第二个数据报文又到达了,这时会立刻发送ACK

TCP延迟确认

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

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

相关文章

2023面试知识点一

1、新生代和老年代的比例 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。其中,新生代 ( …

213. 打家劫舍 II

文章目录 Tag题目来源题目解读解题思路方法一:动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 213. 打家劫舍 II 题目解读 你是一个专业的小偷,现在要偷一排屋子,但是你不能偷相邻的两间屋子(这一排房子的首尾是相连的&…

什么是性能调优?方法有哪些?流程是怎样的?

一、性能调优的含义 性能调优通俗来讲就是对计算机硬件、操作系统和应用有相当深入的了解,调节三者之间的关系,实现整个系统(包括硬件、操作系统、应用)的性能最大化,并能不断的满足现有的业务需求。 在判定软件存在…

Hadoop-Hbase

1. Hbase安装 1.1 安装zookeeper、 hbase 解压至/opt/soft,并分别改名 配置环境变量并source生效 #ZK export ZOOKEEPER_HOME/opt/soft/zk345 export PATH$ZOOKEEPER_HOME/bin:$PATH #HBASE_HOME export HBASE_HOME/opt/soft/hbase235 export PATH$HBASE_HOME/b…

浅显易懂理解傅里叶变换

说起电子硬件专业,那不得不提的就是傅里叶变换了。 大学课程中应该吓倒了很多人,谈傅里叶色变了。 本次就来重新认识一下电子硬件中的傅里叶变化。 首先理解之前,当然是需要先知道傅里叶这位大牛的人物百科啦。 傅里叶是法国数学家&#xff0…

【集成学习】对已训练好的模型进行投票

在不同的数据预处理情况下训练得到了三个SVM模型,结果都差不多,对这三个模型的分类结果进行投票 1、三个模型的model_path # 最终model的path self.model_path log_path/model_name_model.gz self.time_log log_path/model_name_time_log.csv# 模型1…

无涯教程-JavaScript - EXP函数

描述 EXP函数返回e升至数字的幂。常数e等于自然对数的底数2.71828182845904。 语法 EXP (number)争论 Argument描述Required/OptionalNumberThe exponent applied to the base e.Required Notes 要计算其他碱基的幂,请使用幂运算符(^) EXP是LN的倒数,LN是数字的自然对数…

免费:CAD批量转PDF工具,附下载地址

分享一款CAD 批量转PDF、打印的工具插件。能自动识别图框大小、自动识别比例、自动编号命名。重点!重点!重点!自动将CAD的多张图纸一次性地、批量地转为PDF,或者打印。效果看下图: 适用环境: 32位系统 Auto…

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。 例如: nn.Linear, nn.Flatten, nn.Dropout, nn.BatchNorm2d, nn.Embedding nn.Conv2d,nn.AvgPool2d,nn.Conv1d,nn.ConvTr…

layui框架学习(45: 工具集模块)

layui的工具集模块util支持固定条、倒计时等组件,同时提供辅助函数处理时间数据、字符转义、批量事件处理等操作。   util模块中的fixbar函数支持设置固定条(2.7版本的帮助文档中叫固定块),是指固定在页面一侧的工具条元素&…

小程序引入vant-Weapp保姆级教程及安装过程的问题解决

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。 本文同时参与 「掘力星计划」,赢取创作大礼包,挑战创作激励金 当你想在小程序里引入vant时,第一步:打开官方文档,第二步&#xff…

RK3399平台开发系列讲解(入门篇)VIM的基础命令

🚀返回专栏总目录 文章目录 一、Vim 命令速查二、其他命令三、Vim模式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 一、Vim 命令速查 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步…

elasticsearch5-RestAPI操作

个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…

typeScript 类型推论

什么是类型推论? 类型推论是 TypeScript 中的一个特性,它允许开发人员不必显式地指定变量的类型。相反,开发人员可以根据变量的使用情况让 TypeScript 编译器自动推断出类型。例如,如果开发人员将一个字符串赋值给一个变量&#…

【大数据】Neo4j 图数据库使用详解

目录 一、图数据库介绍 1.1 什么是图数据库 1.2 为什么需要图数据库 1.3 图数据库应用领域 二、图数据库Neo4j简介 2.1 Neo4j特性 2.2 Neo4j优点 三、Neo4j数据模型 3.1 图论基础 3.2 属性图模型 3.3 Neo4j的构建元素 3.3.1 节点 3.3.2 属性 3.3.3 关系 3.3.4 标…

智囊AI-基于 ChatGPT 的 AI 工具产品 你的私人AI助手

智囊AI是一款基于 ChatGPT 的 AI 工具产品,主打免费、智能、方便,可以在此雇佣各种各样的免费智囊进行对话、自己创造和分享智囊、共享有趣有用的对话等。不过使用需要注册登录,可以使用自己的openai key或者使用网站提供的api key&#xff0…

常见的API

常见的 API Math 从 JDK 版本 1 开始的, 用来计算的一些方法 这里面定义了两个常量的 PI 和 E 这两个是最接近 pi 的值和最接近对数的值 Abs (int a ) 取绝对值Ceil (double a)向上取整Floor (double a )向下取整Round (float a)四舍五入Max (int a, int b) 取最大值Pow (dou…

yarn的资源优化的调整参数

yarn的资源优化的调整参数 官网: https://hadoop.apache.org/docs/r3.3.6/hadoop-yarn/hadoop-yarn-common/yarn-default.xml 没事多看官网哈 yarn.nodemanager.resource.memory-mb:用于设置NodeManager节点的总内存容量,单位为MB。根据集…

PostgreSQL缓存管理

缓冲区管理器、存储和后端进程之间的关系 缓存管理结构 PostgreSQL 缓冲区管理器由buffer table、buffer descriptors和buffer pool组成。buffer pool层存储表和索引等数据文件页,以及空闲空间映射和可见性映射。buffer pool是一个数组,每个槽存储数据文…

TensorFlow与pytorch特定版本虚拟环境的安装

TensorFlow与Python的版本对应,注意,一定要选择对应的版本,否则会让你非常痛苦,折腾很久搞不清楚原因。 建议使用国内镜像源安装 没有GPU后缀的就表示是CPU版本的,不加版本就是最新 pip install tensorflow -i https:…