简述TCP三次握手和四次挥手面试回答

本文转自 猿人谷 长期维护版本:https://yuanrengu.com/2020/77eef79f.html

目前把下面总结好的理解并且牢记完全可以应对面试官。

三次握手四次挥手是前端常见面试题之一,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。

希望大家带着如下问题进行阅读,收获会更大。

1.请说出三次握手的作用以及过程
2.ISN(Initial Sequence Number)是固定的吗?
3.三次握手过程中可以携带数据吗?
4.什么是半连接队列?
5.三次握手可以携带参数吗?
6.四次挥手的过程

首先看一张图来理解一下整个三次握手过程

三次握手

一、三次握手

1.三次握手的作用

作用:确定双方的接收、发送能力是否正常,指定自己的初始化序列号,为后续可靠传输做准备

1.2 三次握手的过程

刚开客户端处于Closed状态,服务端处于Listen状态

第一次握手:客户端向服务端发送SYN报文,并指明客户端初始化序列号ISN(c),此时客户端进入SYN_send状态/等待

第二次握手:服务端收到SYN报文后,会以自己的SYN作为应答,并指明自己的初始化序列号ISN,同时将客户端的ISN+1作为Ack的值,表示收到客户端的SYN,同时进入SYN_RCVD状态/接收

第三次:客户端收到SYN后,发送一个ACK报文,也是将服务端的ISN+1作为ACK的值,表示收到服务端的SYN报文。此时客户端处于established状态,服务端收到ACK后,也处于established状态,此时双方成功建立连接

2.ISN是固定的吗?

答案:不是固定的,三次握手的一个重要功能就是交换双方的ISN,以便让对方知道接收到的输入如何按序列号进行组装,如果ISN是固定的,攻击者很容易推断出后续的确认号,所以ISN是动态生成的

3.什么是半连接队列?

服务端第一次收到SYN后,就会处于SYN_RCVD,此时双方还没完全建立连接,服务端会把这种状态放在一个队列中,我们把这这种队列称为半连接队列,等三次握手完毕后,建立的连接就会放在全连接队列中,如果队列满了就会产生丢包的情况。

4.三次握手可以携带参数吗?

第三次握手时可以携带参数,第一次和第二次不能携带,举例:

第一次就可以携带参数的话,假如有人恶意攻击服务器,攻击者根本不在乎服务器的接收、发送能力是否正常,如果每次都在第一次握手中的SYN报文中携带大量数据,重复的发SYN报文的话,那么服务器会花费大量时间、内存空间接收这些报文。所以得出的结论,如果在第一次握手中携带数据,那么服务器更容易收到攻击

对于在第三次携带数据的话,此时客户端已经处于established状态,对于客户端来说已经建立连接,并且确定服务端的发送和接收能力时正常的,所以携带参数完全没问题。

二、四次挥手

四次挥手
第一次挥手:客户端发送一个FIN报文,报文中指定一个序列号,此时客户端进入FIN_WAIT_1状态,表示停止在发送数据

第二次挥手:服务端收到FIN报文后,会回应一个ACK报文,把客户端的序列号+1作为ACK的值,此时服务端处于Close_WAIT状态,表示服务端同意关闭请求,客户端进入FIN_WAIT2状态 等待服务端发出连接释放报文

第三次挥手:如果服务端也想断开连接了,和第一次挥手一样发出FIN报文,此时服务端处于LAST_ACK状态,表示发出连接释放报文,等待客户端确认

第四次挥手:客户端收到FIN报文后,一样发送一个ACK报文,且把服务器的序列号+1作为ACK的值。此时客户端进入TIME_WAIT状态,需要经过等待计时器的时间2MSL后仍然没有回复,才会进入closed状态,而服务端收到ACK报文后直接进入Closed状态

最后修改:2022 年 05 月 03 日
END
本文作者:
文章标题:简述TCP三次握手和四次挥手面试回答
本文地址:https://zhougewk8.cn/14.html
版权说明:若无注明,本文皆Dg's Blog-专注健康快乐每一天原创,转载请保留文章出处。
如果觉得我的文章对你有用,请随意赞赏