三次握手
第一次握手:客户端发送一个SYN,服务端收到了,就确定客户端可以发送,服务端可以接收
第二次握手:服务端发送一个SYN+ACK,客户端收到了,会回一个SYN,得出结论:服务端可以发送,客户端可以接收
第三次握手:客户端接收到了SYN+ACK,会进行一个完整的请求,再发一次ACK给服务端,服务端接收到,就确定可以发送请求
四次挥手
刚开始客户端和服务端处于establised 状态,假如是客户端先发送关闭请求
第一次挥手:客户端发送一个FIN报文给服务端,报文中会指定一个序列号,此时客户端处于 FIN-WAIT-1状态
第二次挥手:服务端接收到FIN后发送一个ACK报文给客户端,并且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE-WAIT状态
第三次挥手:如果服务端想要断开连接,跟客户端第一次挥手一样,发送一个FIN报文,并且指定一个序列号,此时处于 LAST-ACK状态
第四次挥手:客户端接收到服务端的FIN后,把服务端的序列号值+1作为ACK报文的序列号值,此时的状态是TIME_WAIT状态,需要过一阵子等确定服务端接收到ACK报文才会处于CLOSED状态
5.服务端接收到ACK之后,就会关闭连接,就处于CLOSED状态了,
这里特别需要主要的就是TIME_WAIT这个状态了,这个是面试的高频考点,就是要理解,为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭。这其中的原因就是,要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 ACK 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。
至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功就是 ACK 报文,此时处于 CLOSED 状态。
———————————————————————————————————————————
这里是简单的回答,详细的可以看
原文链接:https://blog.youkuaiyun.com/dreamispossible/article/details/91345391
面试中被问到三次握手四次挥手应该怎么回答?---------不看后悔系列_dreamispossible的博客-优快云博客_面试三次握手四次挥手