一 TCP四次挥手是什么?以及过程?
TCP连接是全双工的,所以客户端client到服务端server的连接需要关闭,同理server到client的连接也需要关闭。所以TCP四次挥手做的事情就是,关闭两条TCP连接并释放资源。
二 开讲!
和昨天一样,边解释名词,边解释挥手:
FIN 关闭序号,是1,它表示关闭连接。(对应握手的SYN标志位,会很好记)代表,client对server已经没有数据要发送了,client请求关闭TCP连接。同理,同时随机选取一个seq=u的数据包。
ACK 确认序号,是1,一样的表示响应。server发送ACK=1的数据包表示,我已确认收到,你,client的关闭连接请求。同时我对到u为止的数据包,都已经正确收到,且我希望你client下次给我发的数据包的序列号是u+1
第三次挥手,同样由server端发起,表示,我server现在也要关闭,从我到你client的TCP连接了。
第四次挥手,client告诉server:对于你要关闭向我传输数据的TCP连接这个请求,我也确认收到了。自此,两个TCP连接关闭,释放资源,即ip+port。
三 经典面试问题
A:使用netstat -ant可以查看套接字的状态。
FIN_WAIT_1 就是主动发起关闭连接的一方,在发送了FIN之后,等待另一端ACK的状态。
FIN_WAIT_2 就是主动发起关闭连接的一方,在收到了另一端的ACK之后,等待另一端FIN的状态。
2.为什么TCP需要四次挥手?三次挥手不行吗?
A:三次还是四次的问题主要集中在,为什么server要把FIN和ACK分到两次数据包发送?打包成一次发送不行吗?
这就需要理解全双工了。client的FIN关闭仅仅代表client没有数据要给server发送了,但不代表server也没有数据要发送了。所以server要先确认client的关闭连接请求,此时有可能继续发送数据,发完之后,再告诉客户端,我也好了,请求关闭。
插一个问题:我曾经遇到过一个面试官,问我,如果server也没有数据要发送了,那四次挥手能不能改成三次挥手呢?即server把ACK和FIN打包一起发送?我想了想,确实可以,我回答是。后来我问他,也得到了肯定答案
3.TIME_WAIT状态是什么?时间多长?为什么会有TIME_WAIT
A:主动发起关闭的一方,在最后一次挥手之后,会进入TIME_WAIT状态,时间为2MSL。
MSL即Maximum Segment Lifetime,即报文最大生存时间。
TIME_WAIT为什么要有呢?
我们假设,主动发起关闭的一方,比如就是client吧,最后发送的ACK报文在网络中丢失,根据TCP的重传机制,server一方会重新发送FIN,在FIN到达client之前,client必须维护这条连接,直到FIN到达client,client重发ACK。
那么2MSL就是,client发送了ACK之后,ACK这个报文的MSL,和ACK丢失后,server重传FIN的报文的MSL,是这两个MSL相加。
即总结:主动关闭的一方,进入TIME_WAIT状态,在这期间,它的ip和port不能被重新分配。持续2MSL之后,这样就保证了原TCP连接的旧数据包因为过期而丢失,之后,就可以以相同的四元组(local_ip, local_port, remote_ip, remote_port)再次建立TCP连接了。
明天预告:二叉树+TCP怎么保证数据的可靠传输