TCP连接(三次握手)(四次挥手)

news2024/11/23 23:58:03

建立TCP连接(三次握手)

以下是简单阐述

在确定目标服务器 IP 地址后,则经历三次握手建立TCP 连接 

三次握手 代表客户端和服务端 之间的传递信息有三次

A说:我想和你聊天 ,你能听到我说话吗

B说:我可以听到你说话,我可以和你聊天,你能听到我说话吗

A说:我也可以听到你说的话,那我们可以聊天了

开始聊天......(确保了双方都可以说话,并且可以听到对方说话)

  1. 第一次握手
    • 客户端向服务器发送一个 TCP 数据包,这个数据包中包含一个 SYN(同步序列号)标志位,其序列号设为一个随机值,假设为 x。这一步就像是客户端在向服务器打招呼:“我想和你建立连接,这是我的初始序列号 x。”
    • 此时客户端进入 SYN - SENT(同步已发送)状态,等待服务器的回应。
  2. 第二次握手
    • 服务器收到客户端的 SYN 包后,会返回一个 TCP 数据包。这个数据包中有两个标志位,分别是 SYN 和 ACK(确认)。SYN 标志位表示服务器也同意建立连接,并且它会生成自己的一个随机序列号,假设为 y;ACK 标志位用于确认客户端的序列号,其确认号为 x + 1,表示服务器已经收到了客户端的序列号为 x 的数据包,并且期望下一个收到的数据包序列号为 x + 1。
    • 此时服务器进入 SYN - RECEIVED(同步收到)状态。
  3. 第三次握手
    • 客户端收到服务器的 SYN/ACK 包后,会发送一个 ACK 包作为回应。这个 ACK 包的确认号为 y + 1,表示客户端已经收到了服务器的序列号为 y 的数据包,并且期望下一个收到的数据包序列号为 y + 1。
    • 当服务器收到这个 ACK 包后,双方就完成了三次握手,进入 ESTABLISHED(已建立)状态,此时 TCP 连接成功建立,可以开始传输数据。

客发=》服收且服发=》客收=》建立连接

服务端收到客户端说我收到你发送的数据后,此时 TCP 连接成功建立,可以开始传输数据。

三次握手的意义

通过三次交互,双方都能确认对方可以正确接收和发送信息

例如,在网络不稳定的情况下,如果只有两次握手,当客户端发送的第一个 SYN 包在网络中延迟,而客户端又重新发送了一个 SYN 包,服务器收到两个 SYN 包后会分别回应两个 SYN/ACK 包,这样就可能导致建立了两个连接,浪费资源。

而三次握手可以避免这种情况的发生。

  HTTP请求

当建立 tcp 连接之后,就可以在这基础上进行通信,浏览器发送 http 请求到目标服务器

 关闭TCP连接(四次挥手)

在服务器响应之后,由于现在 http 默认开始连接 keep-alive ,当页面关闭之后, tcp 链接则
会经过四次挥手完成断开

四次挥手代表客户端和服务端传递信息有四次

A说:要拜拜了,

B说:好的我知道你想走了,马上

B说:我弄好了,要拜拜了

A说:好的拜拜

然后彻底拜拜

 

  1. 第一次挥手(客户端发起连接关闭)

    • 客户端状态客户端发送一个 FIN(结束)标志位的 TCP 数据包后,进入 FIN - WAIT - 1(终止等待 1)状态。在这个状态下,客户端已经没有数据要发送给服务器了,但它还可以接收服务器发送的数据。这就好比客户端已经决定要结束对话,但还在等待对方的回应,并且愿意听完对方最后要说的话。
    • 服务器状态服务器收到客户端的 FIN 包后,进入 CLOSE - WAIT(关闭等待)状态。此时服务器知道客户端想要关闭连接,但自己可能还有数据没发送完,所以它还可以继续发送剩余的数据给客户端
  2. 第二次挥手(服务器回应客户端的第一次挥手)

    • 客户端状态:客户端收到服务器的 ACK 包后,进入 FIN - WAIT - 2(终止等待 2)状态。在这个状态下,客户端继续等待服务器发送完剩余的数据,就像在耐心等待对方把最后的内容说完。
    • 服务器状态:服务器仍然处于 CLOSE - WAIT(关闭等待)状态,继续发送剩余的数据给客户端。
  3. 第三次挥手(服务器发起自己这一侧连接的关闭)

    • 客户端状态:客户端收到服务器发送的 FIN 包后,进入 TIME - WAIT(时间等待)状态。这个状态下客户端会等待一段时间(通常是 2 倍的最大段生存期,即 2MSL),以确保服务器收到了自己发送的 ACK 包。
    • 服务器状态:服务器发送完剩余的数据后,发送一个 FIN 包,表示自己也准备好终止连接了,此时服务器进入 LAST - ACK(最后确认)状态,等待客户端对这个 FIN 包的确认。
  4. 第四次挥手(客户端回应服务器的第三次挥手)

    • 客户端状态:在 TIME - WAIT(时间等待)状态下,客户端发送一个 ACK 包作为对服务器 FIN 包的回应。如果在等待的 2MSL 时间内没有收到服务器要求重传的 FIN 包,就认为服务器已经成功收到了 ACK 包,此时客户端就可以真正关闭连接。
    • 服务器状态:服务器收到客户端的 ACK 包后,就可以立即关闭连接,结束整个 TCP 连接的关闭过程。

四次挥手的意义

因为 TCP 是全双工通信,即双方都可以同时发送和接收数据。

所以在关闭连接时,需要双方都确认对方已经没有数据要发送了,才能安全地关闭连接。

四次挥手的过程就保证了在关闭连接时,双方的数据都能完整地发送和接收,避免数据丢失。

例如,如果只有三次挥手,当服务器还在发送剩余数据时,连接就被强制关闭了,那么这些剩余的数据就会丢失。

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

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

相关文章

【MySQL实战45讲笔记】基础篇——事务隔离

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 目录 系列文章1. 事务隔离1.1 隔离性与隔离级别1.2 如何实现事务隔离1.3 事务的启动方式1.4 思考: 使用什么方案来避免长事务 1. 事务隔离 简单来说,事务就是要保证一组数据库操作&…

upload-labs-master第12关详细教程

成功了别忘了回来留下你的评论哦,嘻嘻 目录 环境配置闯关 环境配置 需要的东西 phpstudy-2018 链接: https://pan.baidu.com/s/1D9l13XTQw7o6A8CSJ2ff9Q 提取码:0278 32位 vc9和11运行库 链接: https://pan.baidu.com/s/1pBV3W…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本: 在终端(Terminal)中运行以下命令,查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本: 找到 Java 8 的安装路…

uniapp奇怪bug汇总

H5端请求api文件夹接口报错 踩坑指数:5星 小程序、APP之前都是用api文件夹的接口引用调用,在h5端启动时报错,研究半天,发现把api文件夹名字改成apis就能调用,就像是关键字一样无法使用。 import authApi from /api/…

交换机配置从IP(Switch Configuration from IP)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

大语言模型---ReLU函数的计算过程及其函数介绍

文章目录 1. 概要2. ReLU定义 1. 概要 **ReLU 作用:**主要用于为神经网络引入非线性能力,作用是将输入中的整数保留原值,负数置为 0。 从而在层与层之间引入非线性,使神经网络能够拟合复杂的非线性关系。 **ReLU使用场景&#xf…

QT如何共享文件+拷贝文件

QString sharedFolderPathImg "\\\\" IP "/profileImage/"; // 更换为你的共享文件夹路径QDir dirImg(sharedFolderPathImg);dirImg.setFilter(QDir::NoDotAndDotDot | QDir::AllEntries);QVector<QString> curFileEntryArrayImg dirImg.entryList…

sourceTree无效的源路径问题解决

1.点击工具 2.点击选项 3.修改ssh客户端为OpenSSH 4.点击确定&#xff0c;然后重新打开软件

智慧营区整体解决方案

智慧军营概述智慧军营以信息化平台为基础&#xff0c;整合物联网、大数据、云计算、AI智能等技术&#xff0c;构建集人员、车辆、安防管理于一体的物联网平台。通过信息技术和网络技术&#xff0c;提高管理可控性&#xff0c;减少管理流程&#xff0c;降低成本&#xff0c;实现…

node实战:创建第一个简单的应用项目

1、确保node已安装 node -vnpm -v 2、创建项目文件夹 mkdir first-node-app-demo 3、初始化项目 3.1 执行&#xff08;输入&#xff09;命令 cd first-node-app-demo npm init -y 3.2 控制台输出 3.3 查看项目中的package.json文件 3.4 修改package.json文件 {"name…

STL——vector(1)

博客ID&#xff1a;LanFuRenC系列专栏&#xff1a;C语言重点部分 C语言注意点 C基础 Linux 数据结构 C注意点 今日好题 声明等级&#xff1a;黑色->蓝色->红色 欢迎新粉加入&#xff0c;会一直努力提供更优质的编程博客&#xff0c;希望大家三连支持一下啦 目录 尾…

pycharm在使用conda虚拟环境时Terminal爆红问题

问题&#xff1a; 解决方法&#xff1a; 复制cmd.exe后面所有路径 添加到pycharm的shell path中&#xff1a;

嵌入式LVGL自定义纯数字键盘

嵌入式LVGL自定义纯数字键盘 一、前言二、设置自定义数字键盘三、使用一、前言 嵌入式UI项目中有时候会使用到纯数字密码的需求,所以打算使用LVGL构建自定义的纯数字键盘。 二、设置自定义数字键盘 参考这个文章,以LV_KEYBOARD_MODE_USER_1为例,增加一个数字键盘,如下图所…

太速科技-512-基于ZU19EG的4路100G 8路40G的光纤汇流计算卡

基于ZU19EG的4路100G 8路40G的光纤汇流计算卡 一、板卡概述 本板卡系我司自主设计研发&#xff0c;基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构&#xff0c;ARM端搭载一组64-bit DDR4&#xff0c;总容量达4GB&#xff0c;可稳定运行在2400MT/s…

【java-Neo4j 5开发入门篇】-最新Java开发Neo4j

系列文章目录 前言 上一篇文章讲解了Neo4j的基本使用&#xff0c;本篇文章对Java操作Neo4j进行入门级别的阐述&#xff0c;方便读者快速上手对Neo4j的开发。 一、开发环境与代码 1.docker 部署Neo4j #这里使用docker部署Neo4j,需要镜像加速的需要自行配置 docker run --name…

时间请求参数、响应

&#xff08;7&#xff09;时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

Java的方法、基本和引用数据类型

个人的黑马程序员java笔记 目录 方法 例&#xff1a;方法定义和调用 方法的重载 对于byte, short, int, long类型 方法的内存 基本数据类型 引用数据类型 方法的值的传递的内存原理 方法 方法&#xff08;method&#xff09;是程序中最小的执行单元格式 方法定义&a…

分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下&#xff0c;IM 系统采用分层架构方式&#xff0c;如下图。 分层架构的 IM 系统&#xff0c;整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】&#xff0c;我们在上篇文章&#xff08;分层架构 IM 系…