版权声明:本文为博主原创文章,转载注明出处。 https://blog.csdn.net/s_lisheng/article/details/83095405
RST表示连接重置,用于关闭那些已经没有必要继续存在的连接。
产生RST的三个条件是:
- 目的地为某端口的SYN到达,然而在该端口上并没有正在监听的服务器;
- TCP想取消一个已有连接;
- 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: