计网重点面试题-TCP三次握手四次挥手

三次握手

第一次握手(syn=1)

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

第二次握手(syn,ack=1)

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

第三次握手(ack=1)

客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态
在这里插入图片描述
从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。

一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了

为什么是三次握手?不是两次、四次?

因为三次握手才能保证双方具有接收和发送的能力

为了防止旧的重复连接初始化造成混乱

在这里插入图片描述
两次握手连接,就无法阻止历史连接
两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。
在两次握手的情况下,服务端在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而服务端在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。
在这里插入图片描述
如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。

三次握手才可以同步双方的初始序列号

TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素

所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,
那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。
在这里插入图片描述

三次握手才可以避免资源浪费

如果客户端发送的 SYN 报文在网络中阻塞了,重复发送多次 SYN 报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。
即两次握手会造成消息滞留情况下,服务端重复接受无用的连接请求 SYN 报文,而造成重复分配资源。
在这里插入图片描述

为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢

为了防止历史报文被下一个相同四元组的连接接收(主要方面);

(如果每次建立连接,客户端和服务端的初始化序列号都是一样的话,很容易出现历史报文被下一个相同四元组的连接接收的问题。)

假设每次建立连接,客户端和服务端的初始化序列号都是从 0 开始:
在这里插入图片描述

为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收;

第一次握手丢失了,会发生什么?

如果客户端迟迟收不到服务端的 SYN-ACK 报文(第二次握手),就会触发「超时重传」机制,重传 SYN 报文,而且重传的 SYN 报文的序列号都是一样的
通常,第一次超时重传是在 1 秒后,第二次超时重传是在 2 秒,第三次超时重传是在 4 秒后,第四次超时重传是在 8 秒后,第五次是在超时重传 16 秒后。没错,每次超时的时间是上一次的 2 倍。(达到最大重传次数还是失败过后就断开连接

第二次握手丢失了,会发生什么?

第二次握手的 SYN-ACK 报文其实有两个目的 :
第二次握手里的 ACK, 是对第一次握手的确认报文;
第二次握手里的 SYN,是服务端发起建立 TCP 连接的报文;
在这里插入图片描述

第三次握手丢失了,会发生什么(重传 SYN-ACK 报文)

客户端收到服务端的 SYN-ACK 报文后,就会给服务端回一个 ACK 报文,也就是第三次握手
因为这个第三次握手的 ACK 是对第二次握手的 SYN 的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到这个确认报文,就会触发超时重传机制,重传 SYN-ACK 报文,直到收到第三次握手,或者达到最大重传次数
(注意,ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文。
相当于ACK丢了,就没有确认报文,相当于不能判定SYN-ACK收到了,就重传SYN-ACK)

TCP 四次挥手过程是怎样的?

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

为什么挥手需要四次?

在这里插入图片描述
客户端向服务端发送FIN,(不能发送了但还能接收数据
服务端回一个ACK,但服务端可能还没干完,干完之后(不再发送数据后),发一个FIN给客户端表示同意关闭连接
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,因此是需要四次挥手

特定情况下可以三次挥手

当被动关闭方(上图的服务端)在 TCP 挥手过程中,「没有数据要发送」并且「开启了 TCP 延迟确认机制」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。

什么是 TCP 延迟确认机制?

在这里插入图片描述

第一次挥手(第一次的FIN报文)丢失了,会发生什么?

如果第一次挥手丢失了,那么客户端迟迟收不到被动方的 ACK 的话,也就会触发超时重传机制,重传 FIN 报文,重发次数由 tcp_orphan_retries 参数控制。
在这里插入图片描述
一直等不到就断开连接

第二次挥手(确认的ACK丢失了),会发生什么

当服务端收到客户端的第一次挥手后,就会先回一个 ACK 确认报文
ACK 报文是不会重传的,所以如果服务端的第二次挥手丢失了,客户端就会触发超时重传机制,重传 FIN 报文,直到收到服务端的第二次挥手,或者达到最大的重传次数。

第三次挥手(服务端发给客户端的FIN丢失了),会发生什么

服务端就会重发 FIN 报文,重发次数仍然由 tcp_orphan_retries 参数控制,这与客户端重发 FIN 报文的重传次数控制方式是一样的。

当客户端收到第二次挥手,也就是收到服务端发送的 ACK 报文后,客户端就会处于 FIN_WAIT2 状态
在这里插入图片描述
在这里插入图片描述
相当于要区分主动关闭方是用close还是shutdown函数
close方案 收到第二次挥手ack 进入wait2 默认等60秒 等fin,没有就关闭连接
而shutdown方案会死等

第四次挥手(客户端发给服务端的ACK丢失了),会发生什么

当客户端收到服务端的第三次挥手的 FIN 报文后,就会回 ACK 报文,也就是第四次挥手,此时客户端连接进入 TIME_WAIT 状态。
第四次挥手的 ACK 报文没有到达服务端,服务端就会重发 FIN 报文,重发次数仍然由前面介绍过的 tcp_orphan_retries 参数控制。
在这里插入图片描述
在这里插入图片描述

什么是MSL(为什么要2MSL

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃
TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是: 网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。

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

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

相关文章

Microsoft Edge 查看已保存账号的密码

1、打开更多菜单选项 打开浏览器右上角的“...”设置及其他,快捷键:ALTF。 2、打开设置选项 选择“设置”,快捷键:g 3、点击密码 在“个人资料”选项中找到密码选项 4、电子钱包 电子钱包会显示“站点和应用”所保存的账户信息…

JAVAEE之网络原理(2)_传输控制协议(TCP)的连接管理机制,三次握手、四次挥手,及常见面试题

前言 在上一节中,我们简单介绍了 TCP 协议的相关概念和格式,而且还介绍了TCP 协议原理中的 确认应答机制、超时重传机制,在本节中我们将会继续介绍 TCP协议原理中的其他机制。 连接管理机制(安全机制) 在正常情况下&…

lvgl的应用:移植MusicPlayer(基于STM32F407)

目录 概述 1 软硬件环境 1.1 UI开发版本 1.2 MCU开发环境 1.3 注意点 2 GUI Guider开发UI 2.1 使用GUI Guider创建UI 2.2 GUI Guider编译项目和测试 2.2.1 GUI Guider编译项目 2.2.2 编译 2.3 了解GUI Guider生成代码 3 移植项目 3.1 Keil中加载代码 3.2 调用G…

漏洞挖掘 | 记一次src挖掘-小程序敏感信息泄露

权当是一次漏洞挖掘的思路分享 闲言 就现在的一个web漏洞挖掘强度还是非常高的,所以我们不妨把我们的眼光投向一个之前可能未曾涉及到的区域———小程序 是的微信小程序,这玩意的防范能力和过滤能力其实对比web方向是要弱小很多的 进入正题 以下就是…

Javase.抽象类和接口

抽象类和接口 【本节目标】1.抽象类1.1抽象类的概念1.2 抽象类语法1.3 抽象类特性1.4 抽象类的作用 2. 接口2.1 接口的概念2.2 语法规则2.3 接口使用2.4 接口特性2.5 实现多个接口2.6 接口间的继承2.7 接口使用实例2.8Clonable 接口和深拷贝2.9 抽象类和接口的区别 3. Object类…

GT_BERT文本分类

目录 GT-BERT结束语代码实现整个项目源码(数据集模型) GT-BERT 在为了使 BERT 模型能够得到广泛的应用,在保证模型分类准确率不降低的情况下,减少模型参数规模并降低时间复杂度,提出一种基于半监督生成对抗网络与 BERT 的文本分类模型 GT-BERT。模型的整…

【ajax基础04】form-serialize插件

目录 一:form-serialize插件 作用: 语法格式: 一:form-serialize插件 作用: 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形,单靠通过”选择器获取节点.value”值的形式,获取…

使用 GCD 实现属性的多读单写

使用 Grand Central Dispatch (GCD) 实现多读单写的属性 首先需要确保在多线程环境下的线程安全性。可以使用 GCD 提供的读写锁机制 dispatch_rwlock_t 或者 dispatch_queue_t 来实现这个功能。 Swift版本的实现 怎样创建一个并发队列 ?// 使用 Swift 来实现的首…

.net 奇葩问题调试经历之1——在红外相机获取温度时异常

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 我们在研发中,经常除了造产品…

吉时利Keithley2602B数字源表

吉时利Keithley2602B数字源表 2601B、2602B、2604B 系统 Sourcemeter SMU 仪器 2601B、2602B 和 2604B 系统 Sourcemeter SMU 仪器为 40W DC / 200W 脉冲 SMU,支持 10A 脉冲,3A 至 100fA 和 40V 至 100nV DC。它们将精密电源、实际电流源、6 位数字万用…

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError 报错信息如下: Traceback (most recent call last): asyncio.run(main()) File “D:\miniconda3\envs\py31013\lib\asyncio\runners.py”, line 44, in…

反激开关电源整流桥选型及计算

整流桥的作用就是把输入交流电压整形成直流电压,把正弦波整成馒头波,由于整流管的单向导电 性,在输入电压瞬时值小于滤波电容上电压时整流桥,在这个时候是不导通的,使整流桥的电流变 成2-3ms左右的窄脉冲。为获得所需…

【数据结构】选择题

在数据结构中,从逻辑上可以把数据结构分为(线性结构和非线性结构) 当输入规模为n时,下列算法渐进复杂性中最低的是() 时间复杂度 某线性表采用顺序存储结构,每个元素占4个存储单元&#xf…

13.3 Go 性能优化

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【MAVEN学习 | 第1篇】Maven介绍与安装

文章目录 前言 一. Maven主要作用1.1 依赖管理1.2 项目构建 二. Maven安装和配置2.1 安装2.2 配置环境变量2.3 命令测试2.4 配置文件(1)依赖本地缓存位置(本地仓库位置)(2)配置国内阿里镜像(3&a…

WPS相同字体但是部分文字样式不一样解决办法

如下图,在使用wps编辑文档的时候发现有些电脑的文字字体很奇怪,但是把鼠标移到这个文字的位置,发现它和其他正常文字的字体是一样的,都是仿宋_GB2312 正常电脑的文字如下图所示 打开C:\Windows找到Fonts这个文件夹 把仿宋_GB2312这…

【启明智显产品介绍】工业级HMI芯片Model3芯片详解(二)图像显示

Model3芯片是一款集大容量存储、宽温操作范围及多功能接口于一身的MCU,配备了 2D 图像加速引擎和 PNG 解码/JPEG 编解码引擎,可以满足各类交互设计场景和多媒体互动需求,具有高可靠性、高安全性、高开放度的特点,可以面向于泛工业…

Stable Diffusion 3 大模型文生图实践

windows教程2024年最新Stable Diffusion本地化部署详细攻略,手把手教程(建议收藏!!)_stable diffusion 本地部署-CSDN博客 linux本地安装教程 1.前期准备工作 1)创建conda环境 conda create --name stable3 python3.10 2)下…

【UBEMX安装和使用】

UBEMX安装 1. UBEMX介绍2. 官网下载软件3. 安装步骤下载和关联的STM32Cube固件包 1. UBEMX介绍 STM32CubeMX是一种图形工具,通过分步过程可以非常轻松地配置STM32微控制器和微处理器,以及为Arm Cortex-M内核或面向Arm Cortex-A内核的特定Linux设备树生成…

Flutter调用本地web

前言: 在目前Flutter 环境中,使用在线 webview 是一种很常见的行为 而在 app 环境中,离线使用则更有必要 1.环境准备 将依赖导入 2.引入前端代码 前端代码有两种情况 一种是使用打包工具 build 而来的前端代码 另一种情况是直接使用 HTML 文件 …