为什么需要三次握手
1、保证全双工通信
2、防止失效的连接请求到服务器,让服务器错误地打开连接,浪费资源
2原因:
谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”
为什么需要四次挥手
因为客户端发送FIN连接请求释放连接后,服务器接受请求后可能还有没有发送完的数据,所以先返回ACK,等待数据都发送完毕后再发送FIN信号。
TIME_WAIT
客户端收到服务的释放连接的请求后,不是立马进入CLOSE状态,而是还要再等待2MSL(MSL:maximum segment lifetime报文最大存活时间,2倍是发和收的最大时间)
原因:
- 确保最后一个确认报文能够到达。如果没能到达,服务端就会会重发FIN请求释放连接。等待一段时间没有收到重发就说明服务的已经CLOSE了。如果有重发,则客户端再发送一次LAST ack信号
- 确保当前连接所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文