TCP之连接管理

来源:互联网 发布:java 淘淘商城 编辑:程序博客网 时间:2024/05/21 21:50

三次握手和四次挥手

  TCP通信过程包括三个步骤:建立TCP连接通道(三次握手)、数据传输和断开TCP连接通道(四次挥手),如下图所示:
     TCP通信过程
TIME_WAIT状态: 指Active Opener在关闭连接前要等待2MSL的时间。 TIME_WAIT主要有两个作用:一个是给active closer重新发送ACK报文的机会;另外一个作用则是同一个四元组(源ip、源端口、目的IP、目的端口)标识的连接一般只有在TIME_WAIT结束后才能重新建立。

半开连接和半关连接

半关闭连接: TCP连接只有一方发送了FIN,另一方没有发出FIN包,仍然可以在一个方向上正常发送数据。如下图所示,客户端发送了FIN,表示不再发送数据,服务器仍可以向客户端发送数据,此时连接的状态称为“半关闭”。
     半关闭

半开连接: TCP连接的一端异常关闭,另一端由于感知不到仍处于“ESTABLISHED”状态的情况。比如一个常见的情况是TCP连接的一端异常断电,就会导致TCP的半开连接。如果没有数据传输,对端就不会知道本端的异常而一直处于ESTABLISHED状态。

连接的关闭

  连接的关闭分为两种:FIN 和 RST;
FIN: 正常关闭连接的方式。特点是:只有等到发送缓冲区的所有数据发送完成之后才会发送FIN包,保证不丢失数据
RST: 异常关闭连接的方式。特点是:

  1. 发送端:丢掉发送缓冲区的数据,并立即发送RST包;
  2. 接受端:不产生响应,直接终止连接并通知应用层; 阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来通知应用层对端RST。非阻塞模型下,select或者epoll会返回sockfd可读,应用层对其进行读取时,read()会报错RST。

发送RST的几种场景

  1. connect一个不存在的端口;
  2. 向一个已经关掉的连接发送数据;
  3. 向一个已经崩溃的对端发送数据(连接之前已经被建立);
  4. close(sockfd)时,直接丢弃接收缓冲区未读取的数据,并给对方发一个RST。这个是由SO_LINGER选项来控制的;
  5. a重启,收到b的保活探针,a发rst,通知b。
原创粉丝点击