上次面试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,端口号可能跟现在的不一样,服务器就会认为是另外的端口号发来的,从而出现数据混乱。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐