说说tcp的四次挥手
答:首先说明的是“挥手”是为了终止连接。
第一次挥手
Client发送一个FIN,用来关闭数据传输,此时CLient进入FIN-WAIT-1阶段。假设seq=u,FIN=1
第二次挥手
SERVER端收到FIN请求后,发送一个ACK来进行确认回复。其中ACK=1,ack=u+1,seq=v。当Client收到这个回复,Client就会进入FIN-WAIT-2阶段。
第三次挥手
在SERVER端将最后的数据传输后,服务端会发送一个FIN来告知最后的数据已经传输完成。此时服务端进入LAST-ACK阶段。FIN=1,ACK=1,ack=u+1,假设seq=w。
第四次挥手
客户端收到服务发送的FIN之后,会进入TIME-WAIT阶段,在这个阶段,最多等待2*MSL时间(ps:MSL是Maximum Segment Lifetime的英文缩写,含义是报文最大生存时间)。然后发送一个ACK给服务端,告诉服务端已接收到FIN,服务端你可以关闭了。ACK=1,seq=u+1,ack=w+1。
说说为什么客户端TIME-WAIT这个阶段存在的意义。
客户端收到服务发送的FIN之后,会进入TIME-WAIT阶段,在这个阶段,最多等待2*MSL时间(ps:MSL是Maximum Segment Lifetime的英文缩写,含义是报文最大生存时间)。
这个阶段存在的意义有两个
- 能最大程度的确保,当客户端最后一个确认报文丢失,服务端会超时重传FIN+ACK,而客户端就能在2MSL时间内收到这个重传的FIN+ACK,客户端可以再重新传ACK确认报文,重启2MSL计时器。我们想一想,如果没有这个等待时间,客户端发送了ACK之后立即进入关闭阶段,那么当这个ACK丢失,服务端即使超时重传,客户端也无法接收到重传的FIN+ACK,更无法重发ACK给服务端了,这样服务端就没法正常的进入关闭阶段了。
- 还可以防止“失效的连接请求报文”出现在另一个连接中,因为经过2*MSL,本次连接产生的所有报文段都从网络中消失。