大家都知道TCP释放连接需要四次挥手, 主动释放端会发送FIN包,并且因为TCP是双工的, 关闭一个方向上的数据流,从而TCP连接处于半关闭状态,这也是为什么需要“四次”挥手的原因。
以上所述四次挥手是一种**“有序释放”**, 即,标志位为FIN的TCP报文会在之前所有排队的数据发送完之后,才会发送,在socket缓冲区和窗口中的数据也能保证发送成功。
通常我们调用shutdown(), close()函数后, TCP会发送FIN报文。
这里提一下shutdown 和 close 的区别。 shutdown是关闭一个socket, 可以关闭读、写、读写; close是关闭一个linux系统的文件描述符fd。
除了“有序释放”, 还有一种**“终止释放”**,比如进程异常退出, 是通过RST标志位实现的。 标志位为RST的TCP报文, 会立即发送, 而之前所有排队的数据被丢弃。
FIN报文需要应答ACK, RST报文不需要应答ACK;
TCP的半开连接:如果发生断点,或网络条件很差,一端发送RST后,会立马关闭连接,而另一端感知不到,仍然认为连接正常,这是一种半开连接的状态。
相关:RST攻击