TCP 三次握手和四次挥手(图解)

news2024/11/15 10:31:36

TCP 三次握手和四次挥手

建立连接-三次握手

什么是三次握手?

简单来说:

  1. 客户端向服务器发送 SYN 报文,请求建立连接。
  2. 服务器收到 SYN 报文后,回复一个 SYN+ACK 的报文,表示同意建立连接。
  3. 客户端收到 SYN+ACK 报文后,再回复一个 ACK 报文,表示确认连接已经建立。

SYN – Synchronize 连接信号;ACK – Acknowledgment 确认信号

建立一个 TCP 连接需要“三次握手”,缺一不可:

  1. 一次握手:
    • 客户端发送带有 SYN(SEQ=x)标志的数据包 -> 服务端,
    • 然后客户端进入 SYN_SEND 状态,等待服务器的确认;
  2. 二次握手:
    • 服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,
    • 然后服务端进入 SYN_RECV 状态
  3. 三次握手:
    • 客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,
    • 然后客户端和服务器端都进入 ESTABLISHED(established) 状态,完成 TCP 三次握手。

当建立了 3 次握手之后,客户端和服务端就可以传输数据了。

具体如下图所示:

TCP三次握手

为什么要三次握手?

三次握手的主要目的是:确保客户端和服务器之间建立了可靠的连接,同时避免因重复的连接请求造成网络资源的浪费。

  1. 第一次握手
    • Client 什么都不能确认;
    • Server 确认了对方发送正常,自己接收正常
  2. 第二次握手
    • Client 确认了:自己发送、接收正常,对方发送、接收正常
    • Server 确认了:对方发送正常,自己接收正常
  3. 第三次握手
    • Client 确认了:自己发送、接收正常,对方发送、接收正常;
    • Server 确认了:自己发送、接收正常,对方发送、接收正常

TCP 为什么是三次握手,而不是两次或四次?

因为,三次握手是为了确保连接的可靠性和避免网络资源的浪费。而两次握手会存在上述的问题四次握手则会增加不必要的开销,所以三次握手是一种较为合理的选择。

第 2 次握手传回了 ACK,为什么还要传回 SYN?

服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。

回传 SYN 则是为了建立并确认从服务端到客户端的通信

什么是 SYN ?

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

断开连接-四次挥手

什么是四次挥手?

简单来说:

  1. 客户端向服务器发送 FIN 报文,请求关闭连接。
  2. 服务器收到 FIN 报文后,回复一个 ACK 报文,确认已经收到客户端的请求。
  3. 服务器再向客户端发送一个 FIN 报文,表示服务器也准备关闭连接。
  4. 客户端收到服务器的 FIN 报文后,回复一个 ACK 报文,确认已经收到服务器的请求,并关闭连接。

具体如下图所示:
TCP四次挥手

断开一个 TCP 连接则需要“四次挥手”,缺一不可:

  1. 第一次挥手

    • 客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送

    • 然后,客户端进入 FIN-WAIT-1 状态。

  2. 第二次挥手

    • 服务器收到这个 FIN(SEQ=X)标志的数据包,它发送一个 ACK(ACK=x+1)标志的数据包 -> 客户端
    • 然后,此时服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  3. 第三次挥手

    • 服务端关闭与客户端的连接并发送一个 FIN(SEQ=y) 标志的数据包 -> 客户端,请求关闭连接,
    • 然后,服务端进入 LAST-ACK 状态。
  4. 第四次挥手

    • 客户端发送 ACK (ACK=y+1) 标志的数据包 -> 服务端并且进入 TIME-WAIT 状态,
    • 服务端在收到 ACK (ACK=y+1) 标志的数据包后进入 CLOSE 状态。
    • 此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

为什么要四次挥手?

TCP四次挥手的主要目的是:确保客户端和服务器之间的连接能够正常关闭,并且避免因为未处理完的数据包而造成数据的丢失和不完整。

即:为了确保连接的正常关闭和数据的完整性

为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。

ACK 的作用是: 确认收到对方发送的数据包,

而 FIN 的作用是: 请求关闭连接。

如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?

客户端没有收到 ACK 确认,会重新发送 FIN 请求

为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?

因为第四次挥手时,客户端发送给服务器的 ACK 有可能会丢失

如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,

如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN

假设客户端在发送 ACK 之后立即进入 CLOSED 状态(即关闭连接),同时 服务端没有接收到客户端的 ACK 确认,就会一直重发 FIN – 请求关闭连接。

什么是 MSL?

MSL(Maximum Segment Lifetime): 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

imum Segment Lifetime)**: 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

学习参考

  • TCP 三次握手和四次挥手(传输层) | JavaGuide(Java面试 + 学习指南)

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

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

相关文章

数据结构—小堆的实现

前言:前面我们已经学习了二叉树,今天我们来学习堆,堆也是一个二叉树,堆有大堆有小堆,大堆父节点大于子节点,小堆父节点总小于子节点,我们在学习C语言的时候也有一个堆的概念,那个堆是…

MYSQL基础知识之【创建,删除,选择数据库】

文章目录 前言MySQL 创建数据库使用 mysqladmin 创建数据库使用 PHP脚本 创建数据库 MySQL 删除数据库使用 mysqladmin 删除数据库使用PHP脚本删除数据库 MySQL 选择数据库从命令提示窗口中选择MySQL数据库使用PHP脚本选择MySQL数据库 后言 前言 hello world欢迎来到前端的新世…

电路 buck-boost相关知识

BUCK-BOOST 文章目录 BUCK-BOOST前言一、DC-DC工作模式电容电感特性伏秒积平衡原理 二、BUCK电路三、BOOST电路四、BUCK-BOOST电路总结 前言 最近需要用到buck-boost相关的电路知识,于是便写下这篇文章复习一下。 一、DC-DC 在学习buck-boost电路之前我们先来看一…

python排序算法_归并排序

什么是归并排序: 归并排序是一种基于分治法的排序算法。它的基本思想是将待排序的序列分成若干个子序列,分别进行排序,然后再将已排序的子序列合并成一个有序的序列。 基本思想: 归并排序是用分治思想,分治模式在每一…

基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码

基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工兔优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

深入解析Selenium动作链:精通点击、拖拽、切换等操作

背景: 一些交互动作都是针对某个节点执行的。比如,对于输入框,我们就调用它的输入文字和清空文字方法;对于按钮,就调用它的点击方法。其实,还有另外一些操作,它们没有特定的执行对象&#xff0…

大模型微调技术

全量微调 部分参数微调 Adaper-Tuning 降维的意义 计算和存储成本去除冗余和噪声—特定任务训练数据有限减少模型复杂度避免过拟合风险适应任务需求过拟合 是指模型在训练数据上表现得很好,但在新的未见过的数据上表现较差的现象模型过于复杂,训练数据量不足等因素引起的 LO…

ubuntu22.04中ros2 安装rosbridge

ros2 启动rosbridge: 要启动ROS2中的rosbridge,需要先安装ROS2的rosbridge_suite软件包。使用以下命令安装: 更新过可忽略 sudo apt-get update安装命令 sudo apt-get install ros--rosbridge-suite 注意: 将替换为正在使用的R…

超实用:通过文字就可以操纵这款AI表格,不需要你懂Excel函数

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 工具介绍 今天给大家分享超实用的AI表格ChatExcel,这个工具是由北大团队在2022年3月开始开发的AI表格处理神器,上传你的表格后,只需要用文字描述你…

NX二次开发UF_CURVE_ask_int_curves 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_int_curves Defined in: uf_curve.h int UF_CURVE_ask_int_curves(tag_t int_curve_object, int * num_curves, tag_t * * intersection_curves ) overview 概述 Ret…

基于厨师算法优化概率神经网络PNN的分类预测 - 附代码

基于厨师算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于厨师算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于厨师优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

leetCode 226.翻转二叉树 递归 + 非递归 + 前中后序 + 层序遍历 【深度和广度优先遍历】

我的往期文章: leetCode 226.翻转二叉树-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134613347?spm1001.2014.3001.5501 (一)递归做法(深度) C代码:前序遍历 class Solution { pu…

电力感知边缘计算网关产品设计方案-网关软件设计方案

网关采用网络协议和软件技术在通信网络中针对工业协议、互联网通用协议进行分析和记录,提升工业控制系统环境的安全防护能力。A类和B类网关采用容器技术的软件架构,采用C/S架构软件客户端提供应用软件平台,为管理员提供功能丰富的图形管理控制界面。 因A类和B类网关在产品定…

Loadrunner安装大全

目录 一 、下载篇 二、安装篇 三、破解篇 四、Loadrunner支持哪些操作系统? 五、安装Loadrunner需要满足哪些系统要求? 六、安装Loadrunner时是否需要注意什么问题? 七、安装完成后如何验证Loadrunner是否正常工作? 八、如…

“升级图片质量:批量提高或缩小像素,赋予图片全新生命力!“

如果你想让你的图片更加清晰、更加美观,或者符合特定的像素要求,那么现在有一个好消息要告诉你!我们推出了一款全新的图片处理工具,可以帮助你批量提高或缩小图片像素,让你的图片焕发出新的生机! 第一步&a…

栈和队列OJ题目——C语言

目录 LeetCode 20、有效的括号 题目描述: 思路解析: 解题代码: 通过代码: LeetCode 225、用队列实现栈 题目描述: 思路解析: 解题代码: 通过代码: LeetCode 232、用栈…

基于微信小程序的员工宿舍报修系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…

路由器DHCP分配IP地址规则

路由器DHCP分配IP地址的机制: 先设置一个IP地址池,假设是192.168.1.100-192.168.1.199一共100个。 来一个请求,看一下是不是以前请求过的地址,如果是,还是返回以前给过的IP,然后将到期时间(有些路由器默认…

8款优秀的MYSQL管理工具与应用程序推荐

文章目录 前言介绍InductionPinbaDB NinjaDB Tools ManagerDbeaverMyWebSQLNavicat后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努…

html实现各种瀑布流(附源码)

文章目录 1.设计来源1.1 动态响应瀑布流1.2 分页瀑布流1.3 响应瀑布流 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134613121 html实现各种瀑布流(附源码),…