一、为什么需要三次握手
刚开始学习TCP三次握手的时候,搞不懂为什么要三次握手,两次为什么会有问题。但如果client发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞
留着,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文后,就误认为是client再次发出的新的连接请
求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就有建立了。由于现在client并没有发出建立连接的请求,因
此不会理睬server的确认,也不会向server发送数据。然而server却以为新的连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。所以,采
用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有建立连接。所以,三次握
手的主要目的是防止server段一直等待,浪费资源。
二、为什么需要四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。就好比两人打电话,只有在双方都说再见后才能挂断,如果只有一方说再见,另一方没有回应,很可能造成
信息传输不完整。那么TCP的四次握手,是为了保证通信双方都关闭了连接,具体过程如下:
1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送;
2)服务器B收到这个FIN,他发回一个ACK,确认序号为收到序号加一,和SYN一样,一个FIN将占用一个序号;
3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A;
4)客户端A发回ACK报文确认,并将确认序号设置为收到序列号加一。
关闭连接时,当收到对方的FIN报文通知时,他仅仅表示对方没有数据发送给你了,但是你还可以给对方发送数据,也有这种可能,你还有一些数据在传给对方的途中,所
以你不能立马关闭连接,又或者,你还有一些数据需要传输给对方后,(再关闭连接)再发送FIN报文给对方来表示你同意现在可以连接了,所以它这里的ACK报文和FIN报文
多数情况下都是分开发送的。
三、主动断开链接的一方为什么要进入TIME_WAIT状态
这是因为虽然双方都同意关闭连接了,而且握手的4个报文协议也都协调和发送完毕,按理说可以直接回到CLOSED状态(就好比SYN_SEND状态到ESTABLISH状态那
样);但是因为处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以TIME_WAIE状态的作用就是用来重发可能丢失的报文。