【TCP】三次握手 与 四次挥手 详解

news2024/12/24 0:02:44

三次握手 与 四次挥手

  • 1. 三次握手
  • 2. 四次挥手
  • 三次握手和四次挥手的区别

在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接

在这里插入图片描述

1. 三次握手

在这里插入图片描述

服务端状态转化:

  • [CLOSED -> LISTEN]
    服务器端调用 listen 后进入 LISTEN 状态,等待客户端连接;
  • [LISTEN -> SYN_RCVD]
    一旦监听到连接请求(同步报文段 SYN),就将该连接放入内核等待队列中,并向客户端发送 SYN + ACK 确认报文。
  • [SYN_RCVD -> ESTABLISHED]
    服务端一旦收到客户端的确认报文 ACK,就进入 ESTABLISHED 状态,可以进行读写数据了。

客户端状态转化:

  • [CLOSED -> SYN_SENT]
    客户端调用 connect,发送同步报文段 SYN;
  • [SYN_SENT -> ESTABLISHED]
    connect 调用成功,收到服务器的 SYN + ACK 报文段则进入 ESTABLISHED 状态,开始读写数据;

三次握手有啥用 ? 和可靠性有什么关系 ?

  1. 三次握手相当于 “投石问路”, 检查一下当前这个网络的情况是否满足可靠传输的条件。
    如果网络本身效果比较差,强行进行 TCP 传输,也会涉及到大量的数据丢包,更具体的说,三次握手是在检测通信双方的发送能力和接收能力是否都正常。
  2. 让通信双方能协商一些必要的信息,TCP 通信过程中,需要客户端和服务器之间有一些共同的信息,在三次握手过程中相互之间可以交互一些必要的内容。

举个栗子:
以打电话为例, 这个过程就是在检验通信双方的发送能力和接收能力:

在这里插入图片描述

假如说小明麦克风坏了,喂了几次没回应,就会重传,重试几次还没回应就放弃。

为啥是三次握手,两次行不行? 四次行不行 ?

  • 四次?行,但是没必要,分开传输不如合在一起效率高。
  • 两次 ?不行!两次,意味着缺少最后一次
  • 由上面的两张图就可以知道,两次的话,此时客户端知道双方的发送和接收能力都是正常的
  • 但是服务器这边是残缺的,不知道自己的发送能力和客户端的接收能力是否 OK
  • 此时服务器对于当下能否满足可靠传输心里没底
  • 这第三次交互就是为了给服务器吃一个定心丸。

2. 四次挥手

在这里插入图片描述

服务端状态转化:

  • [ESTABLISHED -> CLOSE_WAIT]
    当客户端主动关闭连接(调用 close),服务器会收到结束报文段 FIN ,服务器返回确认报文段 ACK 并进入 CLOSE_WAIT;
  • [CLOSE_WAIT -> LAST_ACK]
    进入 CLOSE_WAIT 后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用 close (用户代码中执行了 socket.close) 关闭连接时,会向客户端发送 FIN,此时服务器进入 LAST_ACK 状态,等待最后一个 ACK 到来(这个 ACK 是客户端确认收到了 FIN )
  • [LAST_ACK -> CLOSED]
    服务器收到了对 FIN 的 ACK,彻底关闭连接。

客户端状态转化:

  • [ESTABLISHED -> FIN_WAIT_1]
    客户端主动调用 close 时,向服务器发送结束报文段,同时进入 FIN_WAIT_1;
  • [FIN_WAIT_1 -> FIN_WAIT_2]
    客户端收到服务器对结束报文段的确认 ACK,则进入 FIN_WAIT_2,开始等待服务器的结束报文段;
  • [FIN_WAIT_2 -> TIME_WAIT]
    客户端收到服务器发来的结束报文段 FIN,进入 TIME_WAIT,并发出 LAST_ACK;
  • [TIME_WAIT -> CLOSED]
    客户端要等待一个 2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入 CLOSED 状态。

为什么还要 TIME_WAIT ?
为的是给最后一次 ACK 提供重传机会,表面上 A 发送完 ACK 后就没有 A 的事了,按理说 A 可以销毁连接了,但是怕最后一个 ACK 丢包,若最后一个 ACK 丢了,那么 B 一定会因为没收到 ACK 重传 FIN,如果 A 已经销毁连接了,那么就无人能够处理这个 FIN 了,因此 A 不应该释放的太早,要等待一段时间,确保 B 不会重传 FIN 后再真正的销毁连接。

为什么是TIME_WAIT的时间是2MSL?

MSL 是 TCP 报文的最大生存时间,因此 TIME_WAIT 持续存在 2MSL 的话

  • 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失
    (否则立刻客户端立即重新创建连接时,可能会收到来自上一个进程的迟到的数据(FIN),但是这种数据很可能是错误的);
    在这里插入图片描述

  • 同时也是在理论上保证最后一个报文可靠到达
    (假设最后一个ACK丢失,那么服务器会再重发一个FIN。这时虽然客户端的进程不在了,但是 TCP 连接还在,仍然可以重发 LAST_ACK );

在这里插入图片描述

CLOSE_WAIT
一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态,原因就是服务器没有正确的关闭 socket,没有执行到 socket.close 导致四次挥手没有正确完成。这是一个 BUG。只需要加上对应的 close 即可解决问题。

三次握手和四次挥手的区别

  1. 三次握手一定是客户端发起的(主动发起请求的一方叫做客户端)
    四次握手可能是客户端发起的,也有可能是服务器主动发起的

  2. 三次握手,中间有两次合并和,
    四次握手,中间两次合并不了,不能合并的原因在于 B (被动接收 FIN 的那一方)发送 ACK 和 FIN 的时机不同,
    <1> 四次挥手中,B 发送给 A 的 ACK 是由操作系统内核负责的(除了应用层,TCP/IP … 本身就是属于操作系统层面),那么意味着,当内核收到 FIN 后会立即返回 ACK (我们是感知不到的)
    <2> B 发送给 A 的 FIN,是由用户代码负责的,B 中代码调用了 socket.close() 方法时才触发 FIN 发送,所以要等到用户代码执行到 socket.close() 方法才触发,但是什么时候发送 取决于用户代码,若 <1> <2> 操作之间的时间差较大,就不能合并了,若时间差较小,由于 延时应带和捎带应答 机制,可能会合并。
    而三次握手中 B 发送的 ACK 和 SYN 都是由内核负责的,是同一时机所以能够合并。
    在这里插入图片描述

好啦! 以上就是对 TCP 三次握手 与 四次挥手的讲解,希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

系统架构设计师(第二版)学习笔记----信息安全系统及信息安全技术

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----信息加解密技术 文章目录 一、信息安全系统的组成框架1.1 信息安全系统组成框架1.2 信息安全系统技术内容1.3 常用的基础安全设备1.4 网络安全技术内容1.5 操作系统安全内容1.6 操作系统安全机制1.7 数据…

双节履带机械臂小车实现蓝牙遥控功能

1.功能描述 本文示例所实现的功能为&#xff1a;采用蓝牙远程遥控双节履带机械臂小车进行运动。 2.结构说明 双节履带机械臂小车&#xff0c;采用履带底盘&#xff0c;可适用于任何复杂地形。 前节履带抬起高度不低于10cm&#xff0c;可用于履带车进行爬楼行进。 底盘上装有一…

三维模型3DTile格式轻量化压缩文件大小的技术方法研究

三维模型3DTile格式轻量化压缩文件大小的技术方法研究 倾斜摄影三维模型&#xff0c;由于数据量大、复杂度高&#xff0c;轻量化压缩成为其在网络传输和实时渲染中必不可少的环节。以下是几种常用的3DTile格式轻量化压缩技术方法&#xff1a; 几何简化&#xff1a;这是一种最…

Mac中IntelliJ IDEA每次打开立刻“意外退出”的解决方法

本文介绍在Mac电脑中&#xff0c;无法打开IntelliJ IDEA软件&#xff0c;出现“意外退出”的报错提示&#xff0c;且重启软件依然出现这一情况的通用解决思路与方法。 最近&#xff0c;不知道怎么回事&#xff0c;点击图标准备打开IntelliJ IDEA软件时&#xff0c;很快就会出现…

ADB底层原理

介绍 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…

【逗老师的无线电】艾德克斯TTL串口转网口

最近手搓了一个可以用于艾德克斯ITECH电源或者电子负载的TTL串口转网口的模块&#xff0c;用上之后&#xff0c;上位机软件就可以配置以太网IP连接设备啦。就像这样。 一、ITECH TTL接口定义 二、整体逻辑 嗯&#xff0c;就这么简单。IT9000控制软件的Ethernet功能就是直接S…

【校招VIP】测试方案分析之压力测试

考点介绍&#xff1a; 软件压力测试是校招面试里面经常会碰到的题型。 基本思路是在计算机数量较少或系统资源匮乏的条件下运行测试。要求面试者了解压力测试的基本概念&#xff0c;压测的目的&#xff0c;压测的要求以及说出实例。 测试方案分析之压力测试-相关题目及解析内容…

从理解js双重递归执行顺序到用递归方式实现二叉树中序遍历

今天在学习力扣上94题二叉树的中序遍历时&#xff0c;js的实现方法之一是递归&#xff0c;但是函数内递归是双重&#xff0c;花了一些时间来理解双重递归调用的执行顺序。 先看如下例子&#xff0c;参考文章&#xff08;双递归的执行过程理解&#xff09; 示例代码如下&#xf…

Vue基础之模板语法介绍

前言 上篇我分享了关于Vue的入门&#xff0c;简单的入了个门。本篇文章将要分享的内容为Vue的模板语法。 一、插值 1.1、文本 1.2、html 1.3、属性 1.4、class、style绑定 1.5、表达式 在Vue的模板语法中&#xff0c;插值是一种常用的方式来动态地将数据渲染到视图中。Vue使用双…

CentOS 7 安装Libevent

CentOS 7 安装Libevent 1.下载安装包 新版本是libevent-2.1.12-stable.tar.gz。&#xff08;如果你的系统已经安装了libevent&#xff0c;可以不用安装&#xff09; 官网&#xff1a;http://www.monkey.org/~provos/libevent/ 2.创建目录 # mkdir libevent-stable 3.解压 …

数字森林:无人机航测技术在林业调查中的应用

林业调查是林业工作的基础&#xff0c;对于森林资源的管理、规划、保护、经济发展和农业种植等方面都具有重要的意义。传统林业调查主要依赖人工进行&#xff0c;存在工作效率低、数据精度低、数据分析困难、受地形限制、无法实时监测等缺陷。 随着科技的不断发展&#xff0c;无…

DJYOS开源往事三:DJYOS源码发布网络实证

在DJYOS经营开发社区的时候&#xff0c;DJYOS的代码更新记录是在自己的官网上。然后散发到各种技术论坛上。这里我实证的举例以第三方网站为数据源头&#xff0c;罗列2009年之后发布的一些源码实证信息。 1、2009年2月2日&#xff1a;djyos含example的0.2.0版本发布了&#xf…

JDK1.8下载

https://www.oracle.com/cn/java/technologies/downloads/#java8-windows

git log和git reflog命令

工作区 版本历史库 ,暂存区 (1)git log (2)git log --oneline (3)git log -n4 --graph (4)git log -n4 --graph --oneline (5)git log --all (6)git log master 查看master分支历史记录(1)HEAD指向当前工作commit,是个变量 (2)git reset HEAD^,git log找不到之前的commi…

函数式编程------JDK8新特性

函数式编程式jdk 8中的语法糖,在许多地方都有用到,以下是一些优点. 能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱 Lamda表达式 lamda表达式是函数是编程的基础,先看一个列子 新建一个线程,参数是匿名类内部类(匿名内部类是一个匿名子类对象。这里使…

Web应用系统的小安全漏洞及相应的攻击方式

写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为。 主要目的如下&#xff1a; 了解什么叫安全漏洞 知道什么是api 了解一些获取api的工具 通过对API的认识了解白盒接口测试基本概念和技术 免责声明&#xff1a; 本文主要是以学习交流为目的&a…

python抠图(去水印)开源库lama-cleaner入门应用实践

1. 关于 Lama Cleaner Lama Cleaner 是由 SOTA AI 模型提供支持的免费开源图像修复工具。可以从图片中移除任何不需要的物体、缺陷和人&#xff0c;或者擦除并替换&#xff08;powered by stable diffusion&#xff09;图片上的任何东西。 特征&#xff1a; 完全免费开源&am…

axios取消上一页面的请求

请求拦截 声明变量用于存放请求请求拦截存放请求导出请求 导航守卫 导入请求集合路由前置守卫中遍历取消所有请求 登录失效取消后续请求

Go学习视频整理(总共59门课程,860GB)

由阿里P8 Golang架构师亲自精心筛选整理的全网最新最具价值的Golang进阶学习课程&#xff01; 培训机构原版教程&#xff01; 课程知识点和一线大厂完美匹配&#xff01; 所有课程资源完整成套&#xff0c;不残缺&#xff0c;不拼凑&#xff0c;不拆开乱发&#xff01; 这系…

深度学习——线性神经网络一

深度学习——线性神经网络一 文章目录 前言一、线性回归1.1. 线性回归的基本元素1.1.1. 线性模型1.1.2. 损失函数1.1.3. 解析解1.1.4. 随机梯度下降1.1.5. 用模型进行预测 1.2. 向量化加速1.3. 正态分布与平方损失1.4. 从线性回归到深度网络 二、线性回归的从零开始实现2.1. 生…