TCP中RST几种情况

网络故障造成的对端无FIN包感知几种情况

  • 如果有ICMP报文,read或write调用返回Unreadable的错误
  • 无ICMP报文,read堵塞,如果read加上超时,返回TIMEOUT
  • 先调用write,在调用read,TCP尝试后,read返回TIMEOUT错误信息
  • 先调用write失败后,如果继续write操作,写操作失败,返回一个SIGPIPE信号

系统崩溃造成的对端无FIN包几种情况

  • 如果没有ICMP包,和上面情况网络中断一样
  • 系统重启后,当重传的TCP分组到达重启后的系统,由于系统中没有该TCP分组对应的连接,系统分别返回RST重置分节,程序通过对read或write调用分别对RST进行错误处理。阻塞read操作,会立即返回一个错误,错误信息为连接重置。如果是一次write操作,会立即失败,应用程序返回一个SIGPIPE信号。

对端有FIN包情况

  • 阻塞的read,此时返回0
  • 服务端程序被杀死后,操作系统内核会做一些清理的事情,为这个套接字发送一个FIN包,但是,客户端在收到FIN包之后,没有read操作,还是会继续往这个套接字写入数据。这是因为根据TCP协议,连接是双向的,收到对方的FIN包只意味对方不会再发送任何信息。当数据到达服务器端时,操作系统内核发现这是一个指向关闭的套接字,会再次向客户端发送RST包,对于发送端而言如果此时

你可能感兴趣的:(TCP中RST几种情况)