上次面试linux软件开发工程师,以为自己比较了解TCPIP,没想到被问到TCP协议中TIME_WAIT状态的时候,却不能回答,下面总结一下整个过程:
其实面试官问得还是挺细的,TCP三次握手,相信很多人都懂,但是TCP如何关闭链接的,不知道是否有人关注过,传说中的四次握手?算是吧,不过上面问的是在关闭过程中客户端的套接字状态,其实就是客户端在关闭TCP连接中的状态变化,以下是套接字主动和被动关闭的两个过程:
主动关闭的过程:TIME_WAIT1->TIME_WAIT 2->CLOSED
被动关闭的过程:CLOSE_WAIT->CLOSED
不同的应用层协议,关闭过程可能不同,但是大同小异,比如http关闭的过程是服务器先发出关闭申请,而ftp是客户端发出申请,以下是客户端主动发出关闭申请的ftp过程:
1、客户端是调用函数close(),这时,客户端会发送一个FIN给服务器。
2、服务器收到FIN,关闭套接字读通道,并将自己状态设置为CLOSE_WAIT(表示被动关闭),并返回一个ACK给客户端。
3、客户端收到ACK,关闭套接字写通道
这是两次握手,接下来,服务器会调用close()
1、服务器close(),发送一个FIN到客户端。
2、客户端收到FIN,关闭读通道,并将自己状态设置成TIME_WAIT,发送一个ACK给服务器。
3、服务器收到ACK,关闭写通道,并将自己状态设置为CLOSE。
4、客户端等待两个最大数据传输时间,然后将自己状态设置成CLOSED。
TIME_WAIT状态的作用:
1、保证全双工通信可靠关闭:如果不设置TIME_WAIT状态,直接设置成CLOSED状态,那么服务器得不到回复,会一直发送FIN给客户端。
2、保证这次连接的重复数据段从网络中消失。如果不设置,那么最后一个回复的时候,需要建立一个socket,端口号可能跟现在的不一样,服务器就会认为是另外的端口号发来的,从而出现数据混乱。