RST复位报文段

news/2024/5/17 18:20:31 标签: 服务器, tcp

TCP首部中的RST比特是用于“复位”的。一般来说,无论何时一个报文段发往基准的连接出现错误,TCP都会发出一个复位报文段。TCP在下列三种情况下产生RST复位报文段。

1.到不存在的端口的连接请求

产生复位的一种常见情况是当连接请求到达时,目的端口没有进程正在监听。对于UDP,当一个数据报到达目的端口时,该端口没在使用,它将产生一个ICMP端口不可达的信息;而TCP则使用复位。

2.异常终止一个连接

终止一个连接的正常方式是一方发送FIN,这也称为有序释放,因为在所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。但也有可能发送一个复位报文段而不是FIN来中途释放一个连接,这也称为异常释放。异常终止一个连接对应用程序来说有两个优点:(1)丢弃任何待发数据并立即发送复位报文段;(2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭。

3.检测半关闭连接

如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的TCP连接称为半打开的。任何一端的主机异常都可能导致发生这种情况。只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。下面介绍一种建立半打开连接的情形。在bsdi上运行Telnet客户程序,通过它和svr4上的丢弃服务器建立连接。接着断开服务器主机与以太网的电缆,并重启服务器主机。这可以模拟服务器主机出现异常(在重启服务器之前断开以太网电缆是为了防止它向打开的连接发送FIN,某些TCP在关机时会这么做)。服务器主机重启后,我们重新接上电缆,并从客户向服务器发送一行字符。由于服务器的TCP已经重新启动,它将丢失复位前连接的所有信息,因此它不知道数据报文段中提到的连接。TCP处理的原则是接收方以复位作为应答。

参考资料:

1.《TCP/IP详解 VOL.1》 18.7节


http://www.niftyadmin.cn/n/923423.html

相关文章

tcpdump抓包分析TCP三次握手过程

转:http://hi.baidu.com/xxjjyy2008/blog/item/e6566bf837d91903d9f9fdd0.html 一、 tcpdump使用 1、首先看下MAN手册 TCPDUMP(8) …

epoll

I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。在linux2.6内核中,有了一种替换它的机制,就是epoll。 一、epoll相关的数据结构和函数 epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简…

多进程服务器中,epoll的创建应该在创建子进程之后

转:http://blog.csdn.net/wei801004/archive/2009/06/13/4264031.aspx 看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码…

c语言共用体对齐

还从网上找到共用体内存分配原则的文章,下面列几个例子说明: 1.Union data1{ double d; int i; char c1; char c2[9]; }; sizeof(union data1)的值为16.在编译器默认设置的情况下,该共用体最大基本类型为double,它占8字节&#…

gdb调试正在运行的进程

转:http://hi.baidu.com/brady_home/blog/item/6b92aa8ffdfee2e6f01f369b.html 有时会遇到一种很特殊的调试需求,对当前正在运行的其它进程进行调试(正是我今天遇到的情形)。这种情况有可能发生在那些无法直接在调试器中运行的进…

find和xargs命令

http://bbs.chinaunix.net/thread-1387521-1-1.html 想好好学习的同学,请认真看完,有点长。 能很好的用好find将是Linux工作的一大幸事,不要奢望一口气记住本文所有的方法,要慢慢的去尝试和领会这…

c语言运算符优先级列表

优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针&#xff0…

gcc如何生成库链接参数

1.gcc包含的c/c编译器 gcc,cc,c,g,gcc和cc是一样的,c和g是一样的。一般c程序就用gcc编译,c程序就用g编译。 2.gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成…