
目录1. 三次握手2. 为什么是三次握手两次四次不行吗3. 四次挥手4. 为什么不能三次挥手1. 三次握手三次握手的大致流程图如下所示1当客户端想与服务端建立连接时客户端会先发送连接请求到服务端该请求需要服务器接收并确认这是一次握手2当服务端收到了客户端发来的请求后服务端会给客户端一个响应告诉客户端我接受到了你的连接请求这是第二次握手3客户端收到了服务端发来的确认消息之后会再次向服务端发送确认信息然后链接就建立成功这是第三次握手。2. 为什么是三次握手两次四次不行吗只进行两次握手是不行的因为很有可能客户端只发送一次数据或者发着玩恶意攻击等。如果是这样当客户端接收到请求时候在返回响应时连接就已经建立了此时连接已经建立但客户端却又不发送信息就会造成连接资源的浪费四次握手其实也是可以的但是三次握手就已经能确认服务端与客户端发送与接收信息的能力不需要再进行第四次握手多一次握手也会造成资源的浪费。3. 四次挥手当我们想要关闭客户端与服务端的连接时需要进行四次挥手大致流程如下图所示1客户端想要断开与服务端的链接先向服务端发送断连请求2服务端收到了客户端发来的请求然后会给客户端一个响应表示已经接收到断连请求但此时连接还未中断3服务端在接收到断连请求后会将连接通道内的数据尽快处理完毕当处理完成数据之后服务端会再次向客户端发送请求表示数据已经处理完成可以断开连接4客户端收到了服务端发送的确认消息后会再次发送确认消息然后连接就会断开4. 为什么不能三次挥手有些面试官可能会问到我们能不能将第二次与第三次客户端的发送合并在一起这样就能减少一次发送其实是不行的因为第二次服务端向客户端发送确认收到断开连接的时候它还只是处于一个待关闭的状态此时服务端可能还有一些资源没有释放还有一些请求未处理完实际上第二次挥手与第三次挥手它们中间其实可能会有很高的延迟30s甚至是1~3分钟如果我们将第二步与第三步合并发送那么在此期间客户端需要等但很长时间客户端一直未收到服务端发送的响应很有可能超时认为发送失败它就会选择再重新发送一次断连请求甚至发送好几次断连请求就会造成重复操作造成资源的浪费。而且第二次发送能保证客户端在发送请求后短时间内就可以收到服务端发送的信息在保证两端收发信息的能力。