计算机网络面经-TCP三次握手一文说清

目录

说一下TCP的三次握手?

为什么要三次握手?两次行不行?四次呢?

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

TCP四次挥手的过程?

如果已经建立了连接,但是客户端突然出现故障了怎么办?

为什么客户端最后还要等待2MSL?


说一下TCP的三次握手?

官方回答:

1. 客户端发送SYN ( seq=x )报文给服务器端,进入SYN_SEND 状态。

2. 服务器端收到SYN 报文, 回应一个SYN (seq =y ) 和ACK ( ack=x+ I )报文,进入SYN RECV 状态。

3. 客户端收到服务器端的SYN 报文, 回应一个ACK ( ack=y+ 1 )报文,进入Established 状态

为什么要三次握手?两次行不行?四次呢?

非官方解释三次握手

第一次握手:客户端发送网络包,服务端收到了。服务端得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。客户端得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。

第三次握手:客户端发包,服务端收到了。服务端得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号

不使用「两次握手」和「四次握手」的原因:

  • 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
  • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

TCP 在建立连接时要进行三次握手,在断开连接时要进行四次挥手,这是由于TCP的半关闭造成的。因为TCP 连接是全双工的(即数据可在两个方向上同时传递),所以在进行关闭时对每个方向都要单独进行关闭,这种单方向的关闭叫作半关闭。在二方完

成它的数据发送任务时,就发送一个FIN 来向另一方通告将要终止这个方向的连接。

TCP四次挥手的过程?

1. 客户端应用进程调用断开连接的请求,向服务器端发送一个终止标志位FIN = 1,seq=u 的消息,表示在客户端关闭链路前要发送的数据已经安全发送完毕,可以开始关闭链路操作,并请求服务器端确认关闭客户端到服务器的链路操作。此时客户端处于

FIN-WAIT-l 状态。

2. 服务器在收到这个FIN 消息后返回一个ACK=l,ack=u+ 1 ,seq=v 的消息给客户端,表示接收到客户端断开链路的操作请求,这时TCP 服务器端进程通知高层应用进程释放客户端到服务器端的链路服务器处于CLOSE - WAIT 状态,即半关闭状态。客户端在收到消息后处于FIN - WAIT- 2 状态

3. 服务器端将关闭链路前需要发送给客户端的消息发送给客户端,在等待该数据发送完成后, 发送一个终止标志位FIN = l ,ACK= l ,seq=w,a ck= u+ 1 的消息给客户端,表示关闭链路前服务器需要向客户端发送的消息已经发送完毕,请求客户端确认关闭从服务器到客户端的链路操作, 此时服务器端处于LAS 下A C K 状态,等待客户端最终断开链路。

4. 客户端在接收到这个最终FI N 消息后,发送一个ACK = l ,seq=u + l ,ack=w+ I 的消息给服务器端,表示接收到服务器端的断开连接请求并准备断开服务器端到客户端的链路。此时客户端处于TIM-WA IT 状态, TCP 连接还没有释放,然后经过等待计时器

( 2MSL )设置的时间后,客户端将进入CLOSE 状态。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

  • 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器
  • 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文

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

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

相关文章

CentOS7 安装Python3.8

在 CentOS 7 上,按照以下步骤安装 Python 3.8: 添加EPEL仓库:首先安装 EPEL(Extra Packages for Enterprise Linux)仓库 sudo yum install epel-release安装Software Collections (SCL)仓库:随后&#xff0…

2015-2024年考研数学(一)真题练习和解析——选择题

各个大学已经陆陆续续开学了,备考2025年考研的同学也要紧锣密鼓地开始备考,尤其是三门公共课——政治、英语、数学,备考的时间和周期都比较长,每一门都是难啃的硬骨头。 在这三门公共课中,数学的灵活性是最大的&#x…

172基于matlab的MPPT智能算法

基于matlab的MPPT智能算法,通过细菌觅食进行优化。算法引入了趋向性操作,用以进行局部范围内的最优寻找;引入了复制操作,用以避免种群更新盲目随机性,加快了算法的收敛速度;引入了迁徙操作用以避免算法陷入…

TSL四次握手

HTTPS 常用的密钥交换算法有两种,分别是 RSA 和 ECDHE 算法。 其中,RSA 是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用的。而 ECDHE 算法具有前向安全,所以被广泛使用。 1. ECDHE算法 1.…

重看LeakCanary

LeakCanary是我很久之前看的东西了,我当时侯对它的印象就是它可以用来检测内存泄漏,具体原理就是将弱引用对象延迟个5s然后看是否被回收,如果没有被回收,那么就说明发生了内存泄漏,其他的也没有仔细地看 现在就详细地梳理一遍这个流程: 1.L…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口,用户可以通过输入命令来执行各种操作,如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

【Spring】SpringBoot 单元测试

目 录 一.什么是单元测试?二.单元测试有哪些好处?三.Spring Boot 单元测试使用单元测试的实现步骤 一.什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证的过程就叫单元…

爬虫知识--03

数据存mysql import requests from bs4 import BeautifulSoup import pymysql# 链接数据库pymysql conn pymysql.connect(userroot,password"JIAJIA",host127.0.0.1,databasecnblogs,port3306, ) cursor conn.cursor() cursor conn.cursor()# 爬数据 res request…

大模型+影像:智能手机“上春山”

这个春节假期,一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”,了解了抢占C位的各种技巧。 假期过去,开工大吉,手机行业开始抢占今年的C位。那么问题来了,今年智能手机最大的机会点在哪里?答…

Video generation models as world simulators-视频生成模型作为世界模拟器

原文地址:Video generation models as world simulators 我们探索在视频数据上进行大规模生成模型的训练。具体来说,我们联合训练文本条件扩散模型,同时处理不同持续时间、分辨率和长宽比的视频和图像。我们利用一个在视频和图像潜在编码的时…

Fiddler工具 — 21.Fiddler常用插件

Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler,Fiddler也是支持一些插件的安装,也支持用户自己开发插件并安装。 Fiddler插件下载地址:https://www.telerik.com/fiddler/add-ons 1、Traffic Differ Traf…

2023年的AI模型学习/部署/优化

可以的话,github上给点一个小心心,感谢观看。 LDC边缘检测的轻量级密集卷积神经网络: meiqisheng/LDC (github.com)https://github.com/meiqisheng/LDC segment-anything分割一切的图像分割算法模型: meiqisheng/segment-anyt…

pclpy KD-Tree K近邻搜索

pclpy KD-Tree K近邻搜索 一、算法原理1.KD-Tree 介绍2.原理 二、代码三、结果1.原点云2.k近邻点搜索后的点云 四、相关数据 一、算法原理 1.KD-Tree 介绍 kd 树或 k 维树是计算机科学中使用的一种数据结构,用于在具有 k 维的空间中组织一定数量的点。它是一个二叉…

SpringBoot-2.7.6基于SLF4J日志门面的日志框架切换

SpringBoot 没有强制性的日志记录依赖项,但 Commons Logging API 除外,它通常由 Spring Framework 的模块提供。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是您只需要通过启动器,这都取决于 . 对于 Web 应用程序 ,因为它可传递地依赖于日志记录启动器。 如果…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的犬种识别系统(附完整代码资源+UI界面+PyTorch代码)

摘要:本文介绍了一种基于深度学习的犬种识别系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的犬种。文章详细解释了YOLOv8算法的原理,并提供…

【RT-DETR有效改进】利用YOLOv9的GELAN模块替换RepC3结构(附轻量化版本 + 高效涨点版本 + 手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进RT-DETR的RepC3结构,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时…

(九)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建ant-framework核心代码Base封装

今天重点讲解的是ant-framework核心代码Base封装过程。 因为涉及到springmvc、mybatis的集成,为了使项目编码更简洁易用,这边将基础的BASE进行封装,其中包括:BaseBean、BaseDao、BaseService、CRUD的基础封装、分页组件的封装、m…

c++ qt五子棋联网对战游戏

C qt 五子棋联网对战游戏运行环境 Qt 6.6.0 (MSVC 2019 64-bit) 代码文件编码格式 ANSI txt文件编码格式 ANSI 测试用例 服务端端口被占用 通过客户端端口被占用 通过客户端连接服务端 服务端中途断开 通过客户端连接服务端 客户端中途断开 通过服务端没有启动 客户端启动…

【电子书】云计算_大数据

资料 wx:1945423050,备注来源和目的 个人整理了一些互联网电子书 云计算_大数据 34招精通商业智能数据分析:Power BI和Tableau进阶实战.epubCloudera Hadoop大数据平台实战指南.epubDocker实战.epubDocker技术入门与实战 第2版.epubDocker技…

华为HCIP Datacom H12-831 卷23

单选题 1、某园区部署IS-IS实现网络互通,在所有IS-IS路由器的进程中配置命令flash-flood 6 max-timer-interval 100 Leve1-2,则以下关于该场景的描述,正确的是哪—项? A、若某IS-IS路由器LSDB内更新的LSP数量为5,则在100毫秒内且路由计算完成前&#…