【图解计算机网络】TCP协议三次握手与四次挥手

news2024/11/18 21:35:39

TCP协议三次握手与四次挥手

  • 三次握手流程
  • 为什么是三次握手,而不是两次或四次
  • 四次挥手流程
  • TIME_WAIT 为什么要等待 2MSL
  • 为什么握手是三次,挥手是四次?

三次握手流程

在这里插入图片描述

  1. 首先是客户端(也就是我们的浏览器)发送一个SYN标志位为1的请求报文,表示请求建立连接,此时客户端进入SYN-SENT状态;
  2. 然后服务器接收到之后会返回一个SYN和ACK标志位为1的报文,表示响应客户端的连接请求,并请求客户端建立连接,此时服务端进入SYN-RCVD状态;
  3. 最后客户端返回一个ACK标志位为1的报文,于是双方进入ESTABLISHED状态,表示连接建立成功。

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

1、三次握手可以防止历史连接建立请求导致的错误连接初始化。

比如我们有一个客户端向服务器发起握手请求,握手请求报文的seq num是90但是此时网络阻塞,导致握手请求的报文迟迟没有到达服务器。

在这里插入图片描述

然后我们重启了客户端,此时重新发送连接建立请求的报文,这次报文的seq num是100,此时网络通畅了,seq等于90的握手请求比seq等于100的握手请求先到达。

在这里插入图片描述

此时服务器会先响应一个ack等于91的响应报文,然后客户端接收到之后,会返回一个RST标志位为1的报文。RST标志位为1,表示这个连接要终止。

在这里插入图片描述

这样,服务器没有为这个错误的握手请求建立连接并初始化相应的资源。而是等到seq等于100的握手请求到达,走完三次握手,才会真正建立连接,并开始数据的传输。

如果现在两次握手就建立连接了,就会变成这样:

在这里插入图片描述

两次握手就建立了连接,服务端就会为这个连接初始化一系列资源,然后后面收到RST包后又终止连接,这就纯属资源浪费了。

2、三次握手才能确定双方的seq序列号。

首先客户端与服务器的一来回,可以确定客户端的序列号。

在这里插入图片描述

然后服务器到客户端的一来回,可以确定服务端的序列号。

在这里插入图片描述

第二次和第三次可以合为一次握手请求,于是三次握手请求就可以确定双方的序列号。

在这里插入图片描述

至于为什么不是四次、五次握手,那是因为三次就足够,三次握手已经可以处理历史连接建立的请求和确认双方的序列号,再多次数的握手就是多余的。

四次挥手流程

在这里插入图片描述

  1. 客户端发起断开连接请求(也可以是服务端断开连接请求),发送一个FIN标志位为1的报文,代表客户端请求断开连接,此时客户端的状态变成FIN_WAIT_1。
  2. 服务器接收到断开连接的请求报文后,返回一个ACK标志位位1的报文,此时服务端的状态变为CLOSE_WAIT。
  3. 客户端接收到响应报文之后,状态变成FIN_WAIT_2,然后等待服务端传输完剩下的数据后,发送FIN标志位为1的报文。
  4. 服务端等传输完数据后,就会发送一个FIN标志位为1的报文。
  5. 客户端接收到这个FIN标志位为1的报文后,会返回一个ACK标志位为1的报文,然后进入TIME_WAIT状态,等待两个MSL(报文最大生存时间),然后进入CLOSE状态,连接真正关闭。
  6. 服务端接收到客户端返回的这个FIN标志位为1的报文,就会进入CLOSE状态,连接关闭。

TIME_WAIT 为什么要等待 2MSL

当主动断开连接一方(也就是上面的client)最后一个ACK数据包发送的时候丢失了,被动断开连接一方(也就是上面的server)就会重新发送FIN报文。

在这里插入图片描述

等待2MSL目的就在于出现这种情况的时候,主动断开连接一方保证可以接收到被动断开连接一方重发的FIN报文。

如果等待的时长不足2MSL,那么就无法保证能够接收到被动断开连接一方重发的FIN报文;不等待更长的时间,那是因为如果此时网络不可靠,在2MSL时长内也无法让主动断开连接一方接收到被动断开连接一方重发的FIN报文,那么等待再长的时间也是没有意义的,比如现在是丢包率百分之一百的网络,等再长的时间也是白等。

为什么握手是三次,挥手是四次?

因为主动断开连接的一方发送断开连接的请求时,可以确定主动方已经没有数据需要传输了,但是无法确定被动断开连接一方是否已经没有数据需要发送。因此如果当被动方接收到主动方发送的FIN报文之后,返回一个ACK报文给主动方之后,还需要把剩下的数据发送完。

在这里插入图片描述

此时主动方虽然不能再发送数据,但是还可以响应ACK报文,所有还是可以接收被动方发送的数据。

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

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

相关文章

数字电路-可预置倒计时器Multisim仿真

数字电路之于FPGA意义重大。本可预置倒计时器设计采用40106作为振荡电路,由74LSl92、74LS47D和七段共阴数码管构成计时电路,具有启动/预置、暂停/继续计时和报警功能。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易…

鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源?

官方基本概念 从系统的角度看,进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序…

rust前端web开发框架yew使用

构建完整基于 rust 的 web 应用,使用yew框架 trunk 构建、打包、发布 wasm web 应用 安装后会作为一个系统命令,默认有两个特性开启 rustls - 客户端与服务端通信的 tls 库update_check - 用于应用启动时启动更新检查,应用有更新时提示用户更新。nati…

MySQL数据库常见SQL语句宝典

一 、常用操作数据库的命令 1.查看所有的数据库 : show databases;2.创建一个数据库 : create database if not exists 数据库名;3.删除一个数据库 : drop database if exists 数据库名;4.选择一张表 (注意在建表之前必须要选择数据库) : use 表名;* --tab 键的上面&#x…

【学习笔记三十】EWM和PP集成的后台配置和前台演示

一、EWM和PP集成概述 在S4HANA版本中,PP模块强化了生产线的概念,并与EWM集成,使用生产供应区(PSA)的功能。PSA的基本配置包括在ERP系统中创建PSA、定义工作中心、将PSA分配给工作中心、在EWM中创建PSA、匹配ERP和EWM中…

【JavaSE】_继承

目录 1.继承的概念 2. 继承语法 3. 父类成员的访问 3.1 子类中访问父类的成员变量 3.1.1 子类和父类不存在同名成员变量 3.1.2 子类和父类成员变量同名 3.2 子类中访问父类的成员方法 3.2.1 成员方法名不同 3.2.2 成员方法名相同 4. super关键字 5. 子类构造方法 6.…

Swin Transformer—— 基于Transformer的图像识别模型

概述 Swin Transformer是微软研究院于2021年在ICCV上发表的一篇论文,因其在多个视觉任务中的出色表现而被评为当时的最佳论文。它引入了移动窗口的概念,提出了一种层级式的Vision Transformer,将Shifted Windows(移动窗口&#x…

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

mysql主库delete一个没主键的表导致从库延迟很久问题处理

一 问题描述 发现线上环境一个从库出现延迟,延迟了2天了,还没追上主库。 查看当前运行的sql及事务,发现这个sql语句是在delete一个没主键的表。 二 问题模拟 这里在测试环境复现下这个问题。 2.1 在主库造数据 use baidd; CREATE TABL…

《QT实用小工具·四十三》历史编辑器(支持历史搜索 关键字匹配)

1、概述 源码放在文章末尾 该项目实现了在输入框中输入部分信息能全部展现之前的历史输入信息&#xff0c;支持历史搜索和关键词匹配&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "historymodel.h" #include <QM…

C语言自定义类型【联合体与枚举】

文章目录 1.联合体1.1联合体的声明1.2联合体的特点1.3联合体的大小计算联合体的使用案例 2.枚举2.1枚举类型的声明2.2枚举类型的优点(为什么使用枚举)2.3枚举类型的使用 结语 1.联合体 1.1联合体的声明 和结构体一样&#xff0c;联合体也是由一个或多个成员构成&#xff0c;同…

ffmpeg中stream_loop参数不生效原因分析

问题 使用ffmpeg把一个视频文件发布成一个rtmp流&#xff0c;并设置成循环推流&#xff0c;此时需要使用参数stream_loop&#xff0c;命令如下: ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/te…

BIO、NIO与AIO

一 BIO 同步并阻塞(传统阻塞型)&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器端就需要启动一个线程进行处理. BIO&#xff08;Blocking I/O&#xff0c;阻塞I/O&#xff09;模式是一种网络编程中的I/O处理模式。在BIO模式中&#xf…

杂项基础知识-部分

** 杂项基础知识 ** 一.常见的各类文件的文件头和文件结尾 列举常见文件头编码特征&#xff1a; JPEG&#xff1a; PNG&#xff1a; GIF&#xff1a; RAR&#xff1a; ZIP&#xff1a; 十六进制特征&#xff1a; 图片文件&#xff1a; JPEG&#xff1a;文件头格式为…

K8s 使用 CephFS 作为后端存储(静态供给、动态供给)

一、K8s 使用 CephFS CephFS是 Ceph 中基于RADOS&#xff08;可扩展分布式对象存储&#xff09;构建&#xff0c;通过将文件数据划分为对象并分布到集群中的多个存储节点上来实现高可用性和可扩展性。 首先所有 k8s 节点都需要安装 ceph-common 工具&#xff1a; yum -y ins…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

PotatoPie 4.0 实验教程(41) —— FPGA实现RISC-V 扩展 GPIO UART Timer功能

TD工程介绍 我们提供的TD工程里的RISC-V核默认就开启了GPIO UART扩展&#xff0c;可以看到还有SPI和I2C扩展。因此后面的实验中TD的工程我们基本不怎么修改TD的内容&#xff0c;只需要修改TD工具中Soc_Top.v文件中的TCM0_INITFILE为FD生成的固件名称即可&#xff0c;主要修我以…

实时通讯技术 WebRTC 介绍

WebRTC WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音对话或视频对话的技术。 历史 2010年5月&#xff0c;Google以6820万美元收购VoIP软件开发商Global IP Solutions的GIPS引擎&#xff0c;并改为名为“WebRTC”。WebRTC使用…

C++ ─── 匿名对象+变量的创建顺序

目录 1. 匿名对象&#xff08;临时对象&#xff09; 2. 编译器的优化 3.变量的创建与销毁 1. 匿名对象&#xff08;临时对象&#xff09; 我们先来看有名对象的创建 Date d1; Date d2(2024,4,27);匿名对象的创建 Date(2024,56,1); 生成了一个匿名对象&#xff0c;执行完Da…

数据仓库是什么

写在前面 刚接触大数据的新手小白可能会对数据仓库这个词比较陌生&#xff0c;本文将介绍数据仓库的主要特征及OLTP&OLAP的区别&#xff0c;帮助读者更好理解数据仓库。 一、什么是数据仓库 数据仓库&#xff0c;简称数仓&#xff0c;是一个对数据进行加工&#xff0c;集…