Wireshark分析RST消息

1、定义:

RST表示复位,RST=1表示TCP中出现严重错误(由于主机崩溃或其它原因),必须释放连接。RST=1还可用来拒绝一个非法的报文段或拒绝打开一个连接。发送RST后不会再有正常的四分组终止序列(Unix网络编程so_linger选项)。

2、有三个条件可以产生RST:

*SYN到达某端口但此端口上没有正在监听的服务器(针对TCP而言,UDP则返回端口不可达ICMP错误)。
*TCP想取消一个已有连接(使用套接字SO_LINGER选项)。
*TCP接收了一个根本不存在的连接上的分节。

3、说明

RST报文段不会导致另一端产生任何响应,另一端不进行确认,收到RST的一段将终止该连接,并通知应用层连接复位。

RST会造成丢弃任何待发数据并立即发送复位报文段。正常终止连接是在所有排队数据都已经发送之后才发送FIN,正常情况下没有任何数据丢失(TCP/IP详解p187)

4、RST数据报文产生情况

其实在网络编程过程中,各种RST错误其实是比较难排查和找到原因的。因此我们需要在编程时尽可能规避不合理的操作,而导致的RST数据包,而分析那些真正有异常的RST数据包。下面我列出几种会出现RST的情况:

1 端口未打开

服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了。去telnet一个未打开的TCP的端口可能会出现这种错误。这个和操作系统的实现有关。在某些情况下,操作系统也会完全不理会这些发到未打开端口请求。

比如在下面这种情况下,命令行向8089端口发送一个SYN请求,表示想要连接主机的8089端口,但是主机上根本没有打开8089这个端口,于是就向发送了一个RST。这种情况很常见。特别是服务器程序core dump之后重启之前连续出现RST的情况会经常发生。

Wireshark分析RST消息

Wireshark分析RST消息