TCP协议的三次握手和四次挥手(面试)

三次握手

首先可以简单的回答:

      1、第一次握手:客户端给服务器发送一个 SYN 报文。

      2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。

      3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。

      4、服务器收到 ACK 报文之后,三次握手建立完成。 

也可以详细的介绍:

刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后
      1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。

      2、第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。

      3、第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。

      4、服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。

为什么只有三次握手才能确认双方的接受与发送能力是否正常

 这里先解释一下为啥只有三次握手才能确认双方的接受与发送能力是否正常,而两次却不可以:
          第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
          第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
          第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

      因此,需要三次握手才能确认双方的接收与发送能力是否正常。

三次握手的作用:

三次握手的作用也是有好多的,多记住几个,保证不亏。例如:
      1、确认双方的接受能力、发送能力是否正常。
      2、指定自己的初始化序列号,为后面的可靠传送做准备。
      3、如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。

为什么要进行三次握手?

当进行第一次握手,网络不好可能会堵塞,所以连接的请求并没有到达服务器端;
但是tcp连接有超时重传的机制,所以再一次发送请求,这时候服务器端接收到了你的请求,他也会返回一个请求给你,这是第二次握手;
但是这时候网络环境突然又好了起来,那个堵塞的请求到达了服务器端,服务器端又给你回了一个请求,但是你又不想给服务器发送请求,这时候服务器的资源会进行占用等待你的请求,为了不使服务器的资源继续占用,你又必须发送一个请求给服务器;
所以要进行3次握手

下面进行四次挥手介绍:

        当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送 到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。   

        这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

 

1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。

2、第二次握手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。

3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态

5、服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

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

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

相关文章

内存巨头SK海力士正深化与TSMC/NVIDIA合作关系,开发下一代HBM

据BusinessKorea报道,内存巨头SK海力士正深化与台积电(TSMC)及英伟达(NVIDIA)的合作关系,并计划在9月的台湾半导体展(Semicon Taiwan)上宣布更紧密的伙伴关系。 SK海力士与台积电的合作历史已久。2022年,台积电在其北美技术研讨会上宣布成立O…

GRE详解:概念、架构、原理、搭建过程、常用命令与实战案例

我们将深入探讨如何在 Linux 上设置 GRE(Generic Routing Encapsulation,通用路由封装)。本文将涵盖 GRE 的定义、架构、原理、应用场景、常见命令体系,并通过详细的实战模拟展示如何在 Linux 系统上实际操作。希望通过这篇文章&a…

FlyDeliver践行社会责任,推动绿色物流发展

近日, 在追求商业成功的同时,FlyDeliver(FD配送)始终不忘践行社会责任。公司积极响应国家环保与可持续发展的号召,致力于推动绿色物流的发展。FlyDeliver(FD配送)在配送过程中积极采用低碳环保的运输方式,减少对环境的影响。同时,公司还积极参与各类公益活动,为社会献上爱心与力…

a-table(Ant Design Vue) 滚动到指定行位置

在使用 a-table 组件时&#xff0c;如果你想滚动到指定的行位置&#xff0c;可以通过访问内部的表格元素并调整其 scrollTop 属性来实现。以下是一个基于 Vue 和 Ant Design Vue 的例子&#xff0c;演示如何滚动到指定行位置&#xff1a; <template><a-table :column…

脉脉高聘:面对薪资福利减少,超40%职场人自动缩短工时

近日&#xff0c;脉脉高聘人才智库发布《2024职场生存洞察》&#xff08;下称《洞察》&#xff09;。 数据显示&#xff0c;2024上半年&#xff0c;新经济行业求职压力居高不下&#xff0c;人才供需比达到1.97&#xff0c;相当于2个人竞争1个岗位。求职压力也让职场人心态趋于…

vivado EQUIVALENT_DRIVER_OPT、EXCLUDE_PLACEMENT

Vivado工具将所有逻辑上等效的信号的驱动程序合并为单个驱动程序 在逻辑优化过程中指定-merge_equivalent_drivers选项时 &#xff08;opt_design&#xff09;。请参阅《Vivado Design Suite用户指南&#xff1a;实施》中的此链接 &#xff08;UG904&#xff09;[参考文献20]了…

windows下安装和使用nacos

概述 Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发 现、服务配置、服务元数据及流且管理 Nacos官方文档&#xff1a;https://nacos.io/zh-cn/docs/quick-start.html Nacos下载地址&#xff1a;https://n…

react获取访问过的路由历史记录

看了下&#xff0c;好像没有很好的解决方案&#xff0c;之前的useHistory现在也用不了了&#xff0c; chatgpt说使用useMatch&#xff0c;也报错 看了下浏览器原生的。本来浏览器就会限制这个histroy的读取&#xff0c;只能获取length https://developer.mozilla.org/zh-CN/…

小程序问题

1.获取节点 wx.createSelectorQuery() wx.createSelectorQuery().in(this) //组件中加in(this)&#xff0c;不然获取不到 2.使用实例 wx.createSelectorQuery().in(this).select(#share).fields({node: true,size: true}).exec(async (res) > {const canvas res[0].node;…

java org.aeonbits.owner库介绍

org.aeonbits.owner 是一个用于简化Java应用程序配置管理的库。它通过使用接口和注解来定义和读取配置,使得配置管理更加简洁和类型安全。以下是对这个库的一些主要特性和功能的介绍: 主要特性 类型安全的配置: OWNER 库允许开发者使用接口定义配置,从而提供了编译时的类型…

通过window.postMessage,跨域传递数据

第一个项目的代码&#xff0c;项目地址 http://localhost:5173/ 第二个项目的代码&#xff0c;项目地址 http://localhost:5174/ 点击按钮会打开第二个项目的页面 第二个项目的页面

【LeetCode】最长连续序列

目录 一、题目二、解法完整代码 一、题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nu…

Rust代码优化的九大技巧

一.使用 Cargo 内置的性能分析工具 描述&#xff1a;Cargo 是 Rust 的包管理器&#xff0c;带有内置工具来分析代码性能&#xff0c;以识别性能瓶颈。 解释&#xff1a; 发布模式&#xff1a;在发布模式下编译启用优化&#xff0c;可以显著提高性能。 cargo build --release基…

StarRocks下载使用说明和基础操作

简介 StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据&#xff0c;也支持直接分析数据湖上各种格式的数…

142. 两个字符串的最小 ASCII 删除总和(卡码网周赛第二十五期(23年B站笔试真题))

题目链接 142. 两个字符串的最小 ASCII 删除总和&#xff08;卡码网周赛第二十五期&#xff08;23年B站笔试真题&#xff09;&#xff09; 题目描述 给定两个字符串 s1 和 s2&#xff08;0 < s1.length, s2.length < 1000&#xff09;&#xff0c;返回使两个字符用相等所…

C++:组合和继承的区别

组合介绍以及与继承对比 什么是组合 (1)composition&#xff0c;组合&#xff0c;就是在一个class内使用其他多个class的对象作为成员 (2)用class tree做案例讲解 (3)组合也是一种代码复用方法&#xff0c;本质也是结构体包含 #include <iostream> #include <vector…

CMakeLists.txt编写思路

近期在linux编写CMakeLists.txt文件&#xff0c;整理了一些思路。 一、编写CMakeLists.txt的基本步骤和思路&#xff1a; 初始化CMake&#xff1a; 使用cmake_minimum_required指令指定CMake的最小版本要求&#xff0c;以确保兼容性。使用project指令定义项目名称和可选的语言…

前端-Cookie篇

文章目录 一、由来什么是Cookie&#xff1f;特点Cookie的类型 二、原理三、Cookie生成机制客户端设置案例 四、属性五、缺陷最后分享一段自己工作中封装的一些关于cookie的公众方法✒️总结 前端Cookie是Web开发中非常重要的一部分&#xff0c;它是服务器发送到用户浏览器并保存…

Mysql索引什么时候会失效

在 MySQL 中&#xff0c;索引是提高查询效率的关键工具&#xff0c;但在某些情况下&#xff0c;索引可能会失效。以下是一些常见的索引失效情况&#xff1a; 使用不等号&#xff08;! 或 <>&#xff09;&#xff1a; 使用不等号会导致索引失效&#xff0c;因为不等号无法…

Python模块ConfigParser读取应用程序的配置文件简单示例

一、模块说明&#xff1a; 系统管理员通常通过文本编辑器编辑这些配置文件&#xff0c;以设置应用程序的默认值&#xff0c;然后应用程序将读取并解析这些配置文件&#xff0c;并根据其中的内容执行对应操作。ConfigParser模块具有read()方法&#xff0c;用于读取配置文件。 …