共计 3310 个字符,预计需要花费 9 分钟才能阅读完成。
在面试中,三次握手和四次挥手能够说是问的最频繁的一个知识点了,我置信大家也都看过很多对于三次握手与四次挥手的文章,明天的这篇文章,重点是围绕着面试,咱们应该把握哪些比拟重要的点,哪些是比拟被面试官给问到的,我感觉如果你能把我上面列举的一些点都记住、了解,我想就差不多了。
三次握手
因为在面试中,三次握手是被问的最频繁的面试题,所以本次咱们从 面试 的角度来解说三次握手
当面试官问你为什么须要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样答复:
首先很多人会先讲下握手的过程:
1、第一次握手:客户端给服务器发送一个 SYN 报文。
2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。
3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。
4、服务器收到 ACK 报文之后,三次握手建设实现。
作用是为了确认单方的接管与发送能力是否失常。
这里我顺便解释一下为啥只有三次握手能力确认单方的承受与发送能力是否失常,而两次却不能够:
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接管能力是失常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接管、发送能力,客户端的接管、发送能力是失常的。不过此时服务器并不能确认客户端的接管能力是否失常。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接管、发送能力失常,服务器本人的发送、接管能力也失常。
因而,须要三次握手能力确认单方的接管与发送能力是否失常。
这样答复其实也是能够的,但我感觉,这个过程的咱们应该要形容的更具体一点,因为三次握手的过程中,单方是由很多状态的扭转的,而这些状态,也是面试官可能会问的点。所以我感觉在答复三次握手的时候,咱们应该要形容的具体一点,而且形容的具体一点意味着能够扯久一点。加分的形容我感觉应该是这样:
刚开始客户端处于 closed 的状态,服务端处于 listen 状态。而后
1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 SN(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、指定本人的初始化序列号,为前面的牢靠传送做筹备。
单单这样还不足以应酬三次握手,面试官可能还会问一些其余的问题,例如:
1、(ISN)是固定的吗
三次握手的一个重要性能是客户端和服务端替换 ISN(Initial Sequence Number), 以便让对方晓得接下来接收数据的时候如何按序列号组装数据。
如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因而 ISN 是动静生成的。
2、什么是半连贯队列
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时单方还没有齐全建设其连贯,服务器会把此种状态下申请连贯放在一个队列里,咱们把这种队列称之为 半连贯队列 。当然还有一个 全连贯队列,就是曾经实现三次握手,建设起连贯的就会放在全连贯队列中。如果队列满了就有可能会呈现丢包景象。
这里在补充一点对于 SYN-ACK 重传次数 的问题:服务器发送完 SYN-ACK 包,如果未收到客户确认包,服务器进行首次重传,期待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超 过零碎规定的最大重传次数,零碎将该连贯信息从半连贯队列中删除。留神,每次重传期待的工夫不肯定雷同,个别会是指数增长,例如间隔时间为 1s, 2s, 4s, 8s, ….
3、三次握手过程中能够携带数据吗
很多人可能会认为三次握手都不能携带数据,其实第三次握手的时候,是能够携带数据的。也就是说,第一次、第二次握手不能够携带数据,而第三次握手是能够携带数据的。
为什么这样呢?大家能够想一个问题,如果第一次握手能够携带数据的话,如果有人要歹意攻打服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,因为攻击者基本就不理服务器的接管、发送能力是否失常,而后疯狂着重复发 SYN 报文的话,这会让服务器破费很多工夫、内存空间来接管这些报文。也就是说,第一次握手能够放数据的话,其中一个简略的起因就是会让服务器更加容易受到攻打了。
而对于第三次的话,此时客户端曾经处于 established 状态,也就是说,对于客户端来说,他曾经建设起连贯了,并且也曾经晓得服务器的接管、发送能力是失常的了,所以能携带数据页没啥故障。参考:前端进阶面试题具体解答
四次挥手
因为在面试中,三次握手是被问的最频繁的面试题,所以本次咱们从 面试 的角度来解说三次握手
四次挥手也一样,千万不要对方一个 FIN 报文,我方一个 ACK 报文,再我方一个 FIN 报文,我方一个 ACK 报文。而后完结,最好是说的具体一点,例如想上面这样就差不多了,要把每个阶段的 状态 记好,我上次面试就被问了几个了,呵呵。我答错了,还认为本人答对了,过后还解释的有条有理,呵呵。
刚开始单方都处于 establised 状态,如果是客户端先发动敞开申请,则:
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 状态。
这里特地须要次要的就是 TIME_WAIT 这个状态了,这个是面试的高频考点,就是要了解,为什么客户端发送 ACK 之后不间接敞开,而是要等一阵子才敞开。这其中的起因就是,要确保服务器是否曾经收到了咱们的 ACK 报文,如果没有收到的话,服务器会从新发 FIN 报文给客户端,客户端再次收到 ACK 报文之后,就晓得之前的 ACK 报文失落了,而后再次发送 ACK 报文。
至于 TIME_WAIT 继续的工夫至多是一个报文的来回工夫。个别会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方胜利就是 ACK 报文,此时处于 CLOSED 状态。
这里我给出每个状态所蕴含的含意,有趣味的能够看看。
LISTEN – 侦听来自远方 TCP 端口的连贯申请;
SYN-SENT - 在发送连贯申请后期待匹配的连贯申请;
SYN-RECEIVED – 在收到和发送一个连贯申请后期待对连贯申请的确认;
ESTABLISHED- 代表一个关上的连贯,数据能够传送给用户;
FIN-WAIT-1 – 期待近程 TCP 的连贯中断请求,或先前的连贯中断请求的确认;
FIN-WAIT-2 – 从近程 TCP 期待连贯中断请求;
CLOSE-WAIT – 期待从本地用户发来的连贯中断请求;
CLOSING - 期待近程 TCP 对连贯中断的确认;
LAST-ACK – 期待原来发向近程 TCP 的连贯中断请求的确认;
TIME-WAIT - 期待足够的工夫以确保近程 TCP 接管到连贯中断请求的确认;
CLOSED – 没有任何连贯状态;
最初,在放在三次握手与四次挥手的图