TCP建立连接需要三次握手过程,关闭连接需要四次挥手过程
三次握手
从图中可以看出,客户端在发起connect时,会发起第一次和第三次握手。服务端在接收客户端连接时,会发起第二次握手。
这三次握手,都会通过SYN+ACK的方式进行互相确认。其中当前阶段的SYN作为下一阶段的ACK的基础值。同时如果不需要返回确认的话,本次就不需要发送SYN,比如第三次握手。
之所以需要第三次握手,可以理解为客户端和服务端都需要一些结论证明对方的发送和接收能力是ok的。
假如没有第三次握手,那么对于服务端来说,他发出了响应报文,这时候客户端对他来说的黑盒的,服务端不知道这个请求有没有被客户端接受到,之后通过第三次握手ACK=SYN+1的方式,才能证明客户端的接收能力。
四次挥手
为什么创建连接需要三次握手,而断开连接需要四次挥手呢?
这时候因为TCP是半关闭造成的。所谓的半关闭就是,TCP提供了某一端结束了他的发送后,还能接收来自另一端的数据。也是就是在收到服务端的关闭请求之前,客户端还可以接收消息
任何一方执行close()操作即可产生挥手操作为什么要等待呢
为了防止这种情况:A接到B的释放连接请求后会发送一个确认信息,但是如果这个确认信息丢了,也就是B没有收到确认释放连接,那么B就会重发一个释放连接请求,这时候A还处于TIME_WAIT状态,所以会再次发送一个确认信息。
为什么TIME_WAIT 状态还需要等2*MSL秒之后才能返回到CLOSED 状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。