三次握手和四次挥手在面试中是一个绕不开的热门题目。具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。不要问我是怎么知道的,问了就是被问过~之前一直没太掌握,今天终于搞懂了
三次握手
为什么不是两次握手
(1)如果是两次握手在客户端没有及时回应时就会浪费服务端很多资源;
(2)可能会出现一种状况,当客户端向服务端发起请求,由于网络或者其他原因请求被迫阻塞,由于客户端长时间没有收到确认,于是它又重新发起请求,此时服务器给客户端一个确认ACK。过了一会儿第一次发送的请求又来到服务器这里,客户端知道这个请求已经失效了,但是服务器不知道,于是服务器就一直在傻傻的等待A传输数据。如果是三次握手,那么服务器由于没有收到客户端的确认ACK,就会放弃这次无效的请求。
丢包问题和乱序问题如何解决
TCP为每个数据包都建立了一个发送缓冲区,从建立连接后的第一个字节序列号为0,后面每个字节的序列号就会加1.发送数据的时候,发送缓冲区取一部分组成发送报文(在发送序列中附加序列号和长度),接收数据时恢复确认ACK=序列号+报文长度(作为下一个数据包的其实序列)
如果客户端连续发送数据包的过程中某一数据包出现问题,那么服务端就回将这一数据包的序列号从新发送给客户端,客户端就回重新发送正确的数据
四次挥手
四次挥手过程:
(1)客户端向服务器发起断开连接的请求,客户端进入FIN-WAIT1状态
(2)服务器收到断开连接的请求向客户端发送确认ACK后进入CLOSE-WAIT状态,客户端进入FIN-WAIT2状态(此时服务器还可以进行数据传输)
(3)数据传输完毕后,服务器向客户端发起断开连接的请求,服务端进入Last-ACK状态
(4)客户端收到断开连接的请求,向服务器发送确认ACK后进入TIME-WAIT状态,等待2MSL后,客户端和服务器均进入CLOSED状态
为什么要四次挥手
在服务器向客户端发送确认ACK后处于半关闭状态,此时服务器还可以向客户端传输数据。当服务器将数据传输完毕后,需要告诉客户端一声,我数据传输完毕了,可以断开连接了。
为什么要超时等待
当客户端向服务端发送确认ACK时,这个确认ACK可能会丢失。那么服务器就会一直处于LAST-ACK状态,无法断开连接。有了超时等待,当服务器过一段时间没有收到客户端的确认ACK,它就会重新向客户端发起断开连接的请求,客户端会重新响应,并刷新等待时间。