TCP三次握手与四次挥手:推荐学习资料、过程详解、面试相关题与回答模板(为什么不是两次握手等精讲)

推荐资料(建议按照顺序先都看完,再看本篇文章)

https://www.bilibili.com/video/BV18h41187Ep/
https://www.bilibili.com/video/BV1at4y1Q77b/
https://bbs.huaweicloud.com/blogs/277728
https://blog.csdn.net/dreamispossible/article/details/91345391
小林coding计网p242-302(看不完就算了,其实这个有些地方讲得太细了,面试不会考那么细……的吧?/(ㄒoㄒ)/~~)

过程

三次握手和四次挥手图解

(图的原出处忘了,应该是来自小林coding计网)
在这里插入图片描述

SYN包/ACK包格式

在这里插入图片描述

为什么tcp需要三次握手,不能是两次?

正常两次握手的流程

首先我们要思考,如果为两次握手,正常连接的情况是什么样子的。
由于只有两次,那么服务端在接收到SYN报文后就会建立established状态。客户端在接收到SYN和ACK报文后,也会建立established状态。
在这里插入图片描述
如果说三次握手相当于:
客户端:我有个重要信息想和你说(SYN),你有空吧?
服务端:我有空(ACK),我刚好也有个重要信息想和你说,我们现在就聊,你有空吧?(SYN)
客户端:我也有空捏(ACK)。
【随后客户端和服务端都开始讲话。】

真是一场酣畅淋漓的奔赴啊(泪目),可以看到三次握手就是非常谨慎地确保接下来双方 都能 立马 双向通信。

而二次握手就相当于:
客户端:我有个重要信息想和你说(SYN),你有空吧?
服务端:我有空(ACK),我刚好也有个重要信息想和你说,我们现在就聊,你有空吧?(SYN)
【随后服务端立马开始讲它想说的重要信息。】

这种情况会导致两个问题。首先,实际上服务端并不能确保客户端的接受能力是否正常(就是例子中的是否立马有空听他讲话),其次,更重要的,就是历史连接的初始化问题。

确保双方的发送、接收能力正常

在这里插入图片描述

历史连接的初始化

什么叫历史连接的初始化呢?

考虑一个场景:由于通常情况客户端都会连续发送多次 SYN 报文建立不同的连接。
因为网络拥堵、客户端短暂宕机等因素从而导致 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端。因为只有两次握手。那么服务端会立马进入established状态,并且开始发送数据。

比喻成我上文的聊天的话,就是同时存在客户端A要跟服务端C讲重要信息1,服务端C也要和客户端A讲重要信息2。客户端B要跟服务端C讲重要信息3,服务端C也要和客户端B讲重要信息4。
在这里插入图片描述
如果是三次握手,则是
客户端A:你好我有个重要信息1想和你说(SYN),你有空吧?【但是这个消息没有发出去】
客户端B:我有个重要信息3想和你说(SYN),你有空吧?【但是这个消息还没有被客户端接收】
客户端A:我有个重要信息1想和你说(SYN),你有空吧?【此时发给了服务端】
服务端:我有空(ACK),我刚好也有个重要信息2想和你说,我们现在就聊,你有空吧?(SYN)【和A试图建立连接】
此时因为上文是客户端B,所以是B接收该消息。
客户端B:你在说啥呢。听不懂,先不跟你聊了。(RST)
此时服务端就知道客户端A没空,因为他没有收到客户端A的ACK包。(和A的连接中止)
客户端B:我有个重要信息3想和你说(SYN),你有空吧?【此时发给了服务端】
服务端:我有空(ACK),我刚好也有个重要信息4想和你说,我们现在就聊,你有空吧?(SYN)
客户端B:我有空(ACK)。
随后客户端B和服务端都开始讲话。

如果是两次握手,则是
客户端A:我有个重要信息1想和你说(SYN),你有空吧?【但是这个消息没有发出去】
客户端B:我有个重要信息3想和你说(SYN),你有空吧?【但是这个消息还没有被客户端接收】
客户端A:我有个重要信息1想和你说(SYN),你有空吧?【此时发给了服务端】
服务端:我有空(ACK),我刚好也有个重要信息2想和你说,我们现在就聊,你有空吧?(SYN)【和A试图建立连接】
随后服务端立马开始讲它想说的重要信息2。此时因为上文是客户端B,所以是B接收该消息。
客户端B:你在说啥呢。听不懂,先不跟你聊了。(RST)
随后服务端闭嘴了。(和A的连接中止)
客户端B:我有个重要信息3想和你说(SYN),你有空吧?【此时发给了服务端】
【随后服务端立马开始讲它想说的重要信息4。此时因为上文是客户端B,所以是B接收该消息。】
随后客户端B和服务端都开始讲话。

(图的原出处应该来自小林coding,但是网上找不到原图了)
在这里插入图片描述
所以可以看到,三次握手和两次握手相比,不会让服务端多建立一个历史连接,即多一个established状态,还让服务端白发送数据,从而浪费服务端的资源。

无法同步双方初始序列号

除了避免历史连接的初始化之外,三次握手还有一个重要作用。就是同步双方的初始序列号。

序列号在TCP连接中扮演了重要角色,它具有以下作用:
● 接收方可以消除重复的数据,确保数据的准确性。
● 接收方可以按照序列号的顺序接收数据包,保证数据的完整性。
● 序列号可以标识已经被对方接收的数据包,实现可靠的数据传输。

因此,在建立TCP连接时,客户端发送带有初始序列号的SYN报文,并需要服务器回复一个ACK报文,表示成功接收了客户端的SYN报文。然后,服务器发送带有初始序列号的SYN报文给客户端,并等待客户端的应答,这样一来一回,才能确保双方的初始序列号能够可靠地同步。

总结

三次握手不能为两次的主要原因为:

  • 三次握手保证了双方都知道自己和对方具有接收和发送能力。
  • 三次握手才可以阻止历史连接的初始化。(主要原因)
  • 三次握手才可以同步双方的初始序列号。

面试相关题与回答

请简述下tcp三次握手?

以下回答背熟大概用时2min。

TCP协议属于传输层的重要协议之一,主要负责端到端的沟通。假设我们现在有一个客户端和一个服务端要进行通信。
服务端是一种被动通信的角色,当它启动后,会开放自己的一些端口并等待客户端连接。客户端是一种主动通信的角色,当它启动后,会主动连接指定ip地址的服务端。
假设此时两个端都已经启动,服务端开放了端口a,处于listen的状态。

  • 客户端主动发起请求连接,生成一个初始化序列号ISN为x,并传输一个syn包给服务端。syn为synchronization,表示同步的意思,同时值为x。随后客户端便处于syn_sent状态。这就是第一次握手。
  • 服务端收到syn包后,也生成一个初始化序列号ISN为y,并传输一个ack包和一个syn包给客户端。ack为acknowledge,表示接受的意思,在这里表示成功接收,同时值为第一次握手时客户端的序列号+1。随后服务端便处于syn_recv(syn_recieved)状态。这就是第二次握手。
  • 客户端收到ack包和syn包后,便处于established状态。且会再传输一个ack包给回服务端,值为第二次握手时服务端的序列号y+1。服务端接收该包后便也处于estabished状态。这就是第三次握手。

综上,三次握手实际上就是一个建立连接的过程,在三次握手结束之后,客户端和服务端就可以通过该端口相互通信,传输数据了。

请简述下tcp四次挥手?

以下回答背熟大概用时2min。

TCP协议属于传输层的重要协议之一,主要负责端到端的沟通。tcp四次挥手实际上就是两端之间结束通信的过程。假设我们现在有一个客户端和一个服务端要断开连接,理论上任意一方都有主动断开的权利。但通常情况下是客户端主动断开连接。

  • 那么客户端就会生成一个序列号x,并发送一个fin包和一个ack包给服务端。fin表示finish,结束的意思。fin包中携带了x的值。此时客户端处于fin_wait1状态。这就是第一次挥手。
  • 服务端收到fin包和ack包后,便处于close_wait的状态,就是等待关闭的意思。同时发送一个ack包给回客户端,ack表示acknowledge,接收的意思,值为第一次挥手时客户端的序列号+1。客户端在接收到该ack包后就处于fin_wait2状态。这就是第二次挥手。
  • 同时,服务端可能存在一些数据还需要传送给客户端。等他传输完毕,确认要断开连接时,会生成一个序列号y,并发送一个fin包给客户端。此时服务端处于last_ack状态。这就是第三次挥手。
  • 客户端接收到服务端的fin包,便发送一个ack包给回服务端,值为第三次挥手时服务端的序列号+1。此时客户端处于time_wait状态,也就是等待关闭。一定时长后,服务端收到了ack包,客户端和服务端才会进入closed状态。这就是第四次挥手。

tcp三次握手时可以带数据吗?第几次握手带数据呢?

背熟以下回答,大概用时半分钟。

tcp的第三次握手时可以携带应用数据。因为此时客户端已经在前两次握手时确认了自己的接收和发送能力没有问题。也知道了服务端的接收和发送能力没有问题。第三次握手只是需要让服务端知道客户端的接受能力没有问题。所以可以将ACK报文和数据一同传输过去。

如果tcp第三次握手时的ACK报文丢失,会发生什么?

背熟以下回答,大概用时半分钟。

如果第三次握手时的ACK报文丢失,就相当于服务端依旧只能处于syn_recv状态。但是依旧可以建立连接并正常接收数据。因为数据中也会有ACK标识位,值和丢失的ACK报文的值是一样的。

为什么tcp需要三次握手,不能是两次握手?

背熟以下回答,大概用时两分半。

以最经典的客户端和服务端建立连接举例,三次握手不能为两次的原因为:

  • 第一,三次握手保证了双方都知道自己和对方具有接收和发送能力。
  • 第二,也就是最重要的理由,三次握手才可以阻止历史连接的初始化。
  • 第三,三次握手才可以同步双方的初始序列号。

第一个原因很好理解,因为第三次握手为客户端向服务端发送ACK报文,省去了这个步骤,服务端收不到客户端的ACK报文,就无法得知客户端是否有正常接收的能力。

那么什么叫历史连接的初始化呢?
我们考虑一个场景:通常情况客户端都会连续发送多次 SYN 报文建立不同的连接。如果因为网络拥堵、客户端短暂宕机等因素从而导致 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端。因为只有两次握手。那么服务端会立马进入established状态,并且开始发送数据。
客户端根据上下文,对比序列号后,发现不是它想要接收的信息。便会发送RST报文,使得服务端的连接中止。之后最新的SYN报文到达时,再继续第二次握手和第三次握手,从而成功建立连接。
在这过程中,相较于三次握手,二次握手的服务端多了一个由旧SYN报文引起的established状态,这就是历史连接的初始化。二次握手无法避免历史连接的初始化,还让服务端白发送数据,从而浪费服务端的资源。

最后,序列号在TCP连接中扮演了重要角色,它确保了数据的准确性、完整性。且可以表示哪些数据包是被对方接受过的。三次握手才可以同步双方的初始序列号,从而实现TCP可靠传输。

为什么tcp需要三次握手,不能是四次握手?

背熟以下回答,大概用时半分钟。

以最经典的客户端和服务端建立连接举例,其实tcp可以是四次握手。将原有的三次握手中的第二步,服务端接收到客户端的SYN报文后,发送ACK报文和SYN报文给客户端,拆分为两步,分别发送ACK报文和SYN报文即可。但是基于最优法则,将这两步合为一步。

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

背熟以下回答,大概用时半分钟。

假设每次tcp连接时的初始化序列号都一样。那么就很大概率遇到历史报文的序列号在对方的接收窗口内的情况,从而导致历史报文被新连接成功接收,造成数据错乱。为此,初始化序列号ISN是基于时钟随机生成的,但这并不能完全避免上述问题,因为序列号会回绕,所以还需要用时间戳的机制来判断历史报文。此外,如果初始化序列号都一样的话,很容易被黑客伪造相同序列号的tcp报文用于攻击。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vm net 方式 静态ip配置访问主机IP和外网

1、win 11 安装vm,镜像文件 F:\software\VMwork\CentOS-7-x86_64-Everything-1804.iso 2、配置网络 net 方式 3、右击网络--》属性---》更改适配器设置--》vmnet8 属性、这里不做配置会出现主机ping通访问不通的情况,(访问不通,…

pytorch 数据预加载

1. Abstract 本文介绍一个工具 PreDataLoader,它包装 torch.utils.data.DataLoader,接收该类的一个实例 loader,启动一个线程 t,创建一个队列 q,t 将 loader 中的数据预加载到队列 q 中, 以在模型计算时也能启动启动数…

知识蒸馏的蒸馏损失方法代码总结(包括:基于logits的方法:KLDiv,dist,dkd等,基于中间层提示的方法:)

有两种知识蒸馏方法:一种利用教师模型的输出概率(基于logits的方法)[15,14,11],另一种利用教师模型的中间表示(基于提示的方法)[12,13,18,17]。基于logits的方法利用教师的输出作为辅助信号来训练一个较小的…

图像万物分割——Segment Anything算法解析与模型推理

一、概述 在视觉任务中,图像分割任务是一个很广泛的领域,应用于交互式分割,边缘检测,超像素化,感兴趣目标生成,前景分割,语义分割,实例分割,泛视分割等。 交互式分割&am…

(c语言进阶)offsetof函数——计算结构体元素的偏移量

一.基本概念&#xff1a; 头文件&#xff1a;<stddef.h> offsetof(结构体名,结构体元素名) 返回值为size_t&#xff08;unsigned int&#xff09; 二.应用 例题&#xff1a; #include<stdio.h> #include<stddef.h> typedef struct S1 {char a;int b;c…

Clean 架构下的现代 Android 架构指南

Clean 架构下的现代 Android 架构指南 Clean 架构是 Uncle Bob 提出的一种软件架构&#xff0c;Bob 大叔同时也是 SOLID 原则的命名者。 Clean 架构图如下&#xff1a; 这张图描述的是整个软件系统的架构&#xff0c;而不是单体软件&#xff0c;其中至少包括服务端以及客户端…

JVM类加载全过程

Java虚拟机类加载的全过程&#xff0c;即加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化 一、加载 加载 是 类加载过程中的一个阶段&#xff0c; 有以下三部分组成 1&#xff09;通过一个类的全限定名来获取定义此类的二进制流 2&#xff09;将这…

【Java 基础】19 多线程基础

文章目录 进程和线程进程&#xff08;Process&#xff09;线程&#xff08;Thread&#xff09; 线程的创建1&#xff09;继承 Thread 类2&#xff09;实现 Runnable 接口3&#xff09;使用 Lambda 表达式4&#xff09;总结 线程的状态状态的分类状态间转换 多线程是一种 同时执…

Github无法打开

文章目录 一、问题二、解决2.1、科学上网&#xff08;使用中&#xff09;2.2、使用代理&#xff08;不稳定&#xff09;2.3、修改hosts&#xff08;得更新&#xff09;2.3.1、找到hosts文件2.3.2、复制hosts文件2.3.3、添加记录2.3.4、替换原来的hosts文件2.3.5、成功访问Githu…

CefSharp 获取POST(AJAX)、GET消息返回值(request)

CefSharp作为专门为爬虫工具开发的库比Selenium这种开发目的是页面测试工具然后用来做爬虫的工具要贴心得多。我们操作网页的时候发送或者做了某个动作提交表单之后需要知道我们的动作或者提交是否成功&#xff0c;因为有的页面会因为网络延迟问题提交失败&#xff0c;需要准确…

[Azure]azure磁盘加密(Windows/Linux) ADE(Azure Disk Encryption)

Azure 磁盘加密用于保护数据&#xff0c;对于Windows使用BitLocker对磁盘进行加密&#xff0c;同时与Key Vault集成&#xff0c;控制和管理Key和Secret。 本文利用Potal对磁盘进行加密 注&#xff1a;Azure DIsk Encryption 可能会导致VM重启&#xff0c;对VM造成影响&#xff…

哈希与哈希表

哈希表的概念 哈希表又名散列表&#xff0c;官话一点讲就是&#xff1a; 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记…

基于SSM的老年公寓信息管理的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

nodejs微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

QT 中 QMessageBox 的简单用法

效果 思路 // 创建一个question弹出对话框&#xff0c;添加两个按钮&#xff1a;Yes和NoQMessageBox *box new QMessageBox(QMessageBox::Question, "提示", "确认删除的信息吗&#xff1f;", QMessageBox::Yes | QMessageBox::No, this);box->button(…

成人学生钢笔练字快速入门,硬笔书法行书楷书教程合集

一、教程描述 虽然现在都是电脑打字&#xff0c;需要手写的场合越来越少&#xff0c;但是可以写一手人见人爱&#xff0c;花见花开的好字&#xff0c;仍然是很拉风很惊艳的&#xff0c;可以给人留下深刻印象。本套硬笔书法教程&#xff0c;大小40.90G&#xff0c;共有591个文件…

Python 网络爬虫(二):HTTP 基础知识

《Python入门核心技术》专栏总目录・点这里 文章目录 1. HTTP 协议简述2. HTTP 请求过程3. HTTP 的结构3.1 请求行3.2 请求头3.3 请求体3.4 状态行3.5 响应头3.6 响应体 4. Cookie 状态管理5. HTTP 请求示例6. 总结 大家好&#xff0c;我是水滴~~ 在准备学习网络爬虫之前&…

公有云迁移研究——AWS Route53

大纲 1 什么是Route 532 Route 53能做些什么# 3 通过DNS托管来实现分流3.1 创建DNS托管3.2 对托管创建记录对流量进行分配 4 通过流量策略来对流量进行分流4.1 创建流量策略 5 对比两者的区别6 推荐 在给客户从本地机房往AWS迁移的过程中&#xff0c;我们接到如下需求&#xff…

vue打印功能

安装 vue3-print-nb yarn add vue3-print-nb //或 npm install vue3-print-nb main.js中引入 vue3-print-nb import { createApp } from vue; import App from ./App.vue; const app createApp(App); // 打印插件 import print from vue3-print-nb app.use(print) // 页面…

公有云迁移研究——AWS Translate

大纲 1 什么是Translate2 Aws Translate是怎么运作的3 Aws Translate和Google Translate的区别4 迁移任务4.1 迁移原因 5 Aws Translate的Go demo6 迁移中遇到的问题6.1 账号和权限问题&#xff1a;6.2 小语种 1 什么是Translate Translate是一种文本翻译服务&#xff0c;它使…