计算机网络——三次握⼿、四次挥手

TCP 三次握手在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1、第⼀个SYN报⽂
客户端随机初始化序列号client_isn,放进TCP⾸部序列号段,
然后把SYN置1。把SYN报⽂发送给服务端,表⽰发起连接,
之后客户端处于SYN-SENT状态。

2、第⼆个报⽂SYN+ACK报⽂
服务端收到客户端的SYN报⽂,把⾃⼰的序号server_isn放进TCP⾸部序列号段,
确认应答号填⼊client_ins + 1,把SYN+ACK置1
SYN+ACK报⽂发送给客户端,然后进⼊SYNRCVD状态。

3、第三个报⽂ACK
客户端收到服务端报⽂后,还要向服务端回应最后⼀个应答报⽂

  • ⾸先应答报⽂ TCP ⾸部 ACK 标志位置为 1 ,
  • 其次「确认应答号」字段填⼊ server_isn + 1
  • 最后把报⽂发送给服务端,
    这次报⽂可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。
    服务器收到客户端的应答报⽂后,也进⼊ ESTABLISHED 状态

三次握手的过程:

  • 一开始,客户端和服务端都处于 CLOSED 状态。客户端主动打开连接,服务端被动打卡连接,结束CLOSED z状态,开始监听,进入 LISTEN状态。

一次握手

  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文
  • 接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

二次握手

  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,
  • 其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1
  • 最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

三次握手

  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,
  • 其次「确认应答号」字段填入 server_isn + 1 ,
  • 最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

好了,经过三次握手的过程,客户端和服务端之间的确定连接正常,接下来进入ESTABLISHED状态,服务端和客户端就可以快乐地通信了。

在这里插入图片描述

为什么需要三次握⼿?

总结:

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

解释:
1、阻⽌重复历史连接的初始化(主因)

  1. 当旧的SYN报⽂先到达服务端,服务端回⼀个ACK+SYN报⽂
  2. 客户端收到后可以根据⾃⾝的上下⽂,判断这是⼀个历史连接(序列号过期或超
    时),那么客户端就会发送 RST 报⽂给服务端,表⽰中⽌这⼀次连接。

两次握⼿在收到服务端的响应后开始发⽣数据,不能判断当前连接是否是历史连接。

三次握⼿可以在客户端准备发送第三次报⽂时,客户端因有⾜够的上下⽂来判断当前连接是否是历史连接。

在这里插入图片描述

客户端连续发送多次 SYN(都是同一个四元组)建立连接的报文,在网络拥堵情况下:

  • 一个「旧 SYN 报文」比「最新的 SYN」 报文早到达了服务端,那么此时服务端就会回一个 SYN + ACK 报文给客户端,此报文中的确认号是 91(90+1)。
  • 客户端收到后,发现自己期望收到的确认号应该是 100 + 1,而不是 90 + 1,于是就会回 RST 报文。
  • 服务端收到 RST 报文后,就会释放连接。
  • 后续最新的 SYN 抵达了服务端后,客户端与服务端就可以正常的完成三次握手了。

上述中的「旧 SYN 报文」称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止「历史连接」初始化了连接。


如果是两次握手连接,就无法阻止历史连接,那为什么 TCP 两次握手为什么无法阻止历史连接呢?

我先直接说结论,主要是因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费

你想想,在两次握手的情况下,服务端在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入 ESTABLISHED 状态,

  • 假设这次是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,
  • 而服务端在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。

在这里插入图片描述
可以看到,如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。

因此,要解决这种现象,最好就是在服务端发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手。

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

2、同步双⽅的初始序列号
TCP 协议的通信双⽅, 都必须维护⼀个「序列号」, 序列号是可靠传输的⼀个关键因素。

  • 接收端可以去除重复数据。
  • 接收端可以按照序列号顺序接收。
  • 标识发送的数据包,哪些已经被收到。

这样⼀来⼀回,才能确保双⽅的初始序列号能被可靠的同步

3、避免资源浪费。

  1. 两次握⼿会造成消息滞留情况下,服务器重复接受⽆⽤的连接请求 SYN 报⽂,⽽造成重复分配资源。
  2. 只有两次握⼿时,如果客户端的SYN请求连接在⽹络中阻塞,客户端没有收到服务端的ACK报⽂,会重新发送SYN。
  3. 由于没有第三次握⼿,服务器不清楚客户端是否收到了⾃⼰发送的建⽴连接的
    ACK 确认信号,所以每收到⼀个 SYN 就只能先主动建⽴⼀个连接

过程

  1. 客户端发送第⼀个报⽂,携带客户端初始序列号的SYN报⽂。
  2. 服务器发送第⼆个报⽂,携带服务器初始序列号的ACK + SYN的应答报⽂
    表⽰收到客户端的SYN报⽂。
  3. 客户端发送第三个报⽂,携带服务器的ACK应答报⽂。

TCP 四次挥手过程

在这里插入图片描述

断开过程

  1. 假设客户端打算关闭连接,发送⼀个TCP⾸部FIN被置1的FIN报⽂给服务端
  2. 服务端收到以后,向客户端发送ACK应答报⽂
  3. 等待服务端处理完数据后,向客户端发送FIN报⽂
  4. 客户端接收到FIN报⽂后回⼀个ACK应答报⽂。
  5. 服务器收到ACK报⽂后,进⼊close状态,服务器完成连接关闭
  6. 客户端在经过 2MSL ⼀段时间后,⾃动进⼊close状态,客户端也完成连接的关闭。

为什么挥⼿需要四次?

关闭连接时,客户端发送FIN报⽂,表⽰其不再发送数据,但还可以接收数据

客户端收到FIN报⽂,先回⼀个ACK应答报⽂,服务端可能还要数据需要处理和发送,

等到其不再发送数据时,才发送FIN报⽂给客户端表⽰同意关闭连接

从上⾯过程可知:

  1. 服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN⼀般都会分开发送,从⽽⽐三次握⼿导致多了⼀次

  2. 第⼀次ACK应答报⽂可以省略,因为下⼀个报⽂段携带了ACK信息,ACK是否出现取决于延迟确认特性。

  3. 延迟确认:即接收⽅收到包后,如果暂时没有内容回复给发送⽅,则延迟⼀段时间再确认,假如在这个时间范围内刚好有数据需要传输,则和确认包⼀起回复。这种也被称为数据捎带。延迟确认只是减轻⽹络负担,未必可以提升⽹络性能,有些情况下反⽽会影响性能。

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

  1. MSL是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最长时间,超过这个时间报⽂将被丢弃。

  2. 等待MSL两倍:⽹络中可能存在发送⽅的数据包,当这些发送⽅的数据包被接收⽅处理后又会向对⽅发送响应,所以⼀来⼀回需要等待 2 倍的时间

  3. 2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的
    如果在 TIME-WAIT时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的FIN 报⽂,那么 2MSL 时间将重新计时。

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

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

相关文章

MQTT协议在物联网环境中的应用及代码实现解析(一)

MQTT协议全称是Message Queuing Telemetry Transport,翻译过来就是消息队列遥测传输协议,它是物联网常用的应用层协议,运行在TCP/IP中的应用层中,依赖TCP协议,因此它具有非常高的可靠性,同时它是基于TCP协议…

TCP/IP协议是什么?

78. TCP/IP协议是什么? TCP/IP协议是一组用于互联网通信的网络协议,它定义了数据在网络中的传输方式和规则。作为前端工程师,了解TCP/IP协议对于理解网络通信原理和调试网络问题非常重要。本篇文章将介绍TCP/IP协议的概念、主要组成部分和工…

深度学习 / 数据处理:如何处理偏态数据

1 前言 当我们使用一个线性回归模型时,通常这个模型是在很大假设的前提下才有一个很好的结果: 1、假设预测因子和预测目标之间的关系是线性的2、数据不存在外在噪声:不存在一些极端的数据3、非共线性( collinearity)…

新增进程管理、SSH会话管理功能,1Panel开源面板v1.4.0发布

2023年7月17日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.4.0版本。 在这个版本中,1Panel新增了进程管理和SSH会话管理功能;支持容器编辑和升级,数据库兼容MySQL 5.6;备份账号可以添加微软OneDrive&…

github简单使用

留个链接等着吃灰 链接github的使用 举例 先选择需要上传的文件夹 比如db -main文件夹 gitbash 打开shell 进行如下的操作 一般都得写的东西 git init git remote add origin 想要上传的地址 git pull 将远程库拉过来 如果远程没有文件的话 那么shell就显示没有文件 git …

【Vue】 在 vue 中使用 iframe 挂载 html 文件

文章目录 首先需要将要挂载的html文件放到public 文件夹中 路径的引用形式 <iframe ref"sheet" src"/luckysheet.html" width"100%" height"100%"></iframe>通过绑定 ref 获取到 iframe&#xff0c;data为我需要传递的数…

Vscode自定义注释模板

首先安装插件Doxygen Documentation Generator&#xff0c;安装完成之后点击Doxygen插件的设置&#xff0c;按照下面的步骤打开settings.json进行编辑&#xff1a; 在settings.json中追加如下代码&#xff1a; "doxdocgen.file.copyrightTag": ["Copyright (C),…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

FlinkCDC第四部分-同步mysql到mysql,ctrl就完事~(flink版本1.17.1)

本文介绍了不同源单表-单表同步&#xff0c;不同源多表-单表同步。 注&#xff1a;此版本支持火焰图 Flink版本&#xff1a;1.17.1 环境&#xff1a;Linux CentOS 7.0、jdk1.8 基础文件&#xff1a; flink-1.17.1-bin-scala_2.12.tgz、 flink-connector-jdbc-3.0.0-1.16.…

人工智能与Chat GPT

一本书全面掌握ChatGPT&#xff0c;既有向ChatGPT提问的技巧&#xff0c; 也有构建自己的ChatGPT模型的方法&#xff0c;涵盖开发背景、关联技术、使用方法、应用形式、实用案例等 人工智能是我们这个时代最热门的话题&#xff0c;人们既希望它能代替我们做一些工作&#xff0c…

云原生——Docker容器化实战

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 "Docker"一词指代了多个概念&#xff0c;包括开源…

uniapp调接口出现跨域问题。

今天在写uniapp项目的时候&#xff0c;使用在线模拟接口的时候&#xff0c;出现跨域问题。 【问题描述】&#xff1a; ①在内嵌浏览器运行&#xff0c;不会出现跨域问题&#xff0c;好像是内嵌浏览器自动去掉了跨域问题。 ②在外部浏览器调用的时候会出现跨域问题。&#xf…

IDEA 搭建Android 开发环境

项目实战 废话不多说开始创建先第一个 Android 项目 步骤一 FILE → New → Project 步骤二-选择 Android 项目模板 选那个安卓机器人,如果没有这个选项,需要升级IDEA版本或者安装安卓插件 选择*Basic Activity* Next-下一步 步骤三-项目初始化 名称、包名、安装位置自行调整…

3DE重客户端安装

3DE重客户端安装 一、百度网盘下载路径二、详细安装步骤 一、百度网盘下载路径 https://pan.baidu.com/s/16TltMRbrWuSe7p-Vn1x4Dw?pwdfku7 提取码&#xff1a;fku7 二、详细安装步骤 1、将\3deinstall\2022x_install_GA目录下的所有.tar文件全选解压 2.点击\3deinstall\…

ubuntu 20.04, 22.04网络配置比较

1.ubuntu 20.04网络配置&#xff0c;配置静态IP&#xff1a;切换roote用户&#xff0c;vi /etc/netplan/00-installer-config.yaml&#xff0c;修改网络配置&#xff0c;格式如下&#xff1a; network: ethernets: ens33: dhcp4: false addresses: [172.22.…

切换.net Framework 版本后,出现NuGet 包是使用不同于当前目标框架的目标框架安装的,可能需要重新安装

问题现象&#xff1a; 由于添加新的dll文件&#xff0c;依赖的.NET Framework版本与当前的不一致&#xff0c;在vs 中切换了目标框架版本后&#xff0c;运行程序&#xff0c;出现以下的warnning信息&#xff1a; 一些 NuGet 包是使用不同于当前目标框架的目标框架安装的&#…

【稳定性验证】视频流mesh环境下稳定性验证

目录 正常保持上线状态 延时丢包 丢包&#xff08;很稳&#xff09; 延时 丢包 乱序 &#xff08;也很稳&#xff09; webGL lost 正常保持上线状态 延时丢包 丢包&#xff08;很稳&#xff09; 延时 丢包 乱序 &#xff08;也很稳&#xff09; webGL lost

手写Spring框架---MVC实现

目录 预备 自研框架MVC的实现 MVC架构草图&#xff1a; 大致流程 实现思路 自定义注解 JavaBean 请求的拦截-建立DispatcherServlet 责任链处理请求 RequestProcessor矩阵 Render矩阵 预备 在DispatcherServlet&#xff1a; 解析请求路径和请求方法依赖容器&#xf…

水库大坝安全监测系统是由什么组成的?

水库大坝是防洪抗灾的重要设施&#xff0c;它们的安全性直接关系到人民群众的生命财产安全。因此&#xff0c;水库大坝的安全监测必不可少。水库大坝安全监测系统是一种集成了数据采集、传输、处理和分析的技术平台&#xff0c;能够实时、准确地监测大坝的状态&#xff0c;及时…

一.《某三国》人物属性及其相关属性

人物属性 1.找一个可以操控变化的属性来找 比如血量.坐标或者五铢(绑定金币),这里我们用五铢找 五铢只要打一个怪就会加一点 2.我们直接搜变化即可搜到 五铢地址0AD64EAC 3.我们CE给地址下访问 4.这里我们最后找第一条访问 因为他是被改变的 或者你CE给地址下写入 5.然后我…