细讲TCP三次握手四次挥手(四)

article/2023/6/4 16:03:12

常见面试题

为什么TCP连接的时候是3次?2次不可以吗?

因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。

如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

为什么TCP连接的时候是3次,关闭的时候却是4次?

因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

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

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

为什么是三次握手而不是两次?

第一次握手:客户端发送网络包,服务端收到了。

服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

 第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:

服务端的接收、发送能力,客户端的接收、发送能力是正常的。

不过此时服务器并不能确认客户端的接收能力是否正常?

  第三次握手:客户端发包,服务端收到了。

这样服务端就能得出结论:

客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

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

面试加分的描述回答三次握手的作用和过程:
 刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后

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

    SYN-SENT -在发送连接请求后等待匹配的连接请求;

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

SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;

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

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

 


https://www.dgrt.cn/a/392021.html

相关文章

道路病害识别监测系统 CNN网络

道路病害识别监测系统通过CNN网络深度学习算法,道路病害识别监测对巡检车上实时监控道路影像数据进行分析,输出道路病害裂缝巡检报告并落图展示。在CNN出现之前,对于图像的处理一直都是一个很大的问题,一方面因为图像处理的数据量…

one-shot learning、Siamese网络、Triplet loss、面部验证和二分类

目录1.one-shot learning(一次学习)one-shot learning就是对某一类别只提供一个或者少量的训练样本。而很小的训练集不足以训练一个稳健的神经网络。为了解决这个问题,需要首先训练一个 similarity function:d(img1,img2),用于表示两张图片的…

DVWA-XSS(Reflected)注入-Low-Medium-Hight

Low 1、看到这里&#xff0c;这个输入框就是“入口”&#xff0c;输入探测123“出口”的位置 2、直接上payload: <script>alert(1)</script> 3、结果&#xff1a; 4、这里我们可以去查看一下源码的结构&#xff0c;已经成功插入了一个<script>标签 Mediu…

叶尖速比与风力利用系数之间的关系曲线(代码)

风力发电机功率与物理参数之间的关系为&#xff1a;Cp为风能利用系数&#xff0c;是桨距角 与叶尖速比 的函数&#xff0c;具体的关系可表示为&#xff1a;根据上述公式&#xff0c;叶尖速比与风力利用系数之间的规律如图所示。可见&#xff0c;每一个确定的桨距角&#xff0c…

每天10个前端小知识 【Day 5】

前端面试基础知识题 1. typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法&#xff0c;区别如下&#xff1a; typeof会返回一个变量的基本类型&#xff0c;instanceof返回的是一个布尔值。instanceof 可以准确地判断复杂引用数据类型&#xff0c;但…

借壳上市 - 打造企业上市系列文章

借壳上市是一个金融术语&#xff0c;指一家母公司(集团公司)通过把资产注入一家市值较低的已上市公司(壳&#xff0c;Shell)&#xff0c;得到该公司一定程度的控股权&#xff0c;利用其上市公司地位&#xff0c;使母公司的资产得以上市。通常该壳公司会被改名。借壳上市借壳上市…

Java多线程相关问题

多线程多线程概念&#xff1f;多线程是指程序中包含多个执行单位&#xff0c;即在一个程序中可以同时运行多个不同的线程来执行不同的任务&#xff0c;也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的优缺点&#xff1f;竞用共享资源一直是让人头疼的问…

阿里面试官:如何给所有的async函数添加try/catch?

前言大厂面试题分享 面试题库前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库三面的时候被问到了这个问题&#xff0c;当时思路虽然正确&#xff0c;可惜表述的不够清晰后来花了一些时间整理了下思路&#xff0c;那么如…