TCP连接中出现RST的情况

版权声明:本文为博主原创文章,转载注明出处。 https://blog.csdn.net/s_lisheng/article/details/83095405

RST表示连接重置,用于关闭那些已经没有必要继续存在的连接。

产生RST的三个条件是:

  1. 目的地为某端口的SYN到达,然而在该端口上并没有正在监听的服务器;
  2. TCP想取消一个已有连接;
  3. TCP接收到一个根本不存在的连接上的分节。

最常见和最容易理解的是第1个,下面通过程序和抓包对第一种情况进行分析。
程序源码如下:

// Rust代码
use std::io::prelude::*;
use std::net::TcpStream;
use std::thread;

fn main() {
    let mut stream = TcpStream::connect("192.168.2.229:33333").unwrap();
    let n = stream.write(&[1,2,3,4,5,6,7,8,9]).unwrap();
    println!("send {} bytes to remote node, waiting for end.", n);

    loop{
        thread::sleep_ms(1000);
    }
}

上面程序向目的主机192.168.2.229发起TCP连接,而目的主机并没有启动端口为33333的监听服务。所以当本地主机向目的主机发起TCP连接后,会收到来自目的主机的RST,并断开连接。(当然也不是所有的都会回复RST,有的主机可能不会进行回复)。抓包如下:

本地主机向目的主机发送TCP连接SYN:
在这里插入图片描述

目的主机向本地主机回复ACK、RST:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/s_lisheng/article/details/83095405