《Linux高性能服务器编程》——3.5 复位报文段

3.5 复位报文段

在某些特殊条件下,TCP连接的一端会向另一端发送携带RST标志的报文段,即复位报文段,以通知对方关闭连接或重新建立连接。本节讨论产生复位报文段的3种情况。

3.5.1 访问不存在的端口

3.4.1小节提到,当客户端程序访问一个不存在的端口时,目标主机将给它发送一个复位报文段。考虑从Kongming20上执行telnet命令登录ernest-laptop上一个不存在的54321端口,并用tcpdump抓取该过程中两台主机交换的TCP报文段。具体操作过程如下:

$ sudo tcpdump -nt -i eth0 port 54321   #仅抓取发送至和来自54321端口的TCP报文段
$ telnet 192.168.1.108 54321
Trying 192.168.1.108...
telnet: connect to address 192.168.1.108: Connection refused

telnet程序的输出显示连接被拒绝了,因为这个端口不存在。tcpdump抓取到的TCP报文段内容如下:

1. IP 192.168.1.109.42001 > 192.168.1.108.54321: Flags [S], seq 21621375, win
   14600, length 0
2. IP 192.168.1.108.54321 > 192.168.1.109.42001: Flags [R.], seq 0, ack
   21621376, win 0, length 0

由此可见,ernest-laptop针对Kongming20的连接请求(同步报文段)回应了一个复位报文段(tcpdump输出R标志)。因为复位报文段的接收通告窗口大小为0,所以可以预见:收到复位报文段的一端应该关闭连接或者重新连接,而不能回应这个复位报文段。

实际上,当客户端程序向服务器的某个端口发起连接,而该端口仍被处于TIME_WAIT状态的连接所占用时,客户端程序也将收到复位报文段。

3.5.2 异常终止连接

前面讨论的连接终止方式都是正常的终止方式:数据交换完成之后,一方给另一方发送结束报文段。TCP提供了异常终止一个连接的方法,即给对方发送一个复位报文段。一旦发送了复位报文段,发送端所有排队等待发送的数据都将被丢弃。

应用程序可以使用socket选项SO_LINGER来发送复位报文段,以异常终止一个连接。我们将在第5章讨论SO_LINGER选项。

3.5.3 处理半打开连接

考虑下面的情况:服务器(或客户端)关闭或者异常终止了连接,而对方没有接收到结束报文段(比如发生了网络故障),此时,客户端(或服务器)还维持着原来的连接,而服务器(或客户端)即使重启,也已经没有该连接的任何信息了。我们将这种状态称为半打开状态,处于这种状态的连接称为半打开连接。如果客户端(或服务器)往处于半打开状态的连接写入数据,则对方将回应一个复位报文段。

举例来说,我们在Kongming20上使用nc命令模拟一个服务器程序,使之监听12345端口,然后从ernest-laptop运行telnet命令登录到该端口上,接着拔掉ernest-laptop的网线,并在Kongming20上中断服务器程序。显然,此时ernest-laptop上运行的telnet客户端程序维持着一个半打开连接。然后接上ernest-laptop的网线,并从客户端程序往半打开连接写入1字节的数据“a”。同时,运行tcpdump程序抓取整个过程中telnet客户端和nc服务器交换的TCP报文段。具体操作过程如下:

$ nc –l 12345             #在Kongming20上运行服务器程序
$ sudo tcpdump –nt –i eth0 port 12345
$ telnet 192.168.1.109 12345        #在ernest-laptop上运行客户端程序
Trying 192.168.1.109...
Connected to 192.168.1.109.
Escape character is '^]'.           #此时断开ernest-laptop的网线,并重启服务器
a(回车)                   #向半打开连接输入字符a
Connection closed by foreign host.

telnet的输出显示,连接被服务器关闭了。tcpdump抓取到的TCP报文段内容如下:

1. IP 192.168.1.108.55100 > 192.168.1.109.12345: Flags [S], seq 3093809365,
   length 0
2. IP 192.168.1.109.12345 > 192.168.1.108.55100: Flags [S.], seq 1495337791,
   ack 3093809366, length 0
3. IP 192.168.1.108.55100 > 192.168.1.109.12345: Flags [.], ack 1, length 0
4. IP 192.168.1.108.55100 > 192.168.1.109.12345: Flags [P.], seq 1:4, ack 1,
   length 3
5. IP 192.168.1.109.12345 > 192.168.1.108.55100: Flags [R], seq 1495337792,
   length 0

该输出内容中,前3个TCP报文段是正常建立TCP连接的3次握手的过程。第4个TCP报文段由客户端发送给服务器,它携带了3字节的应用程序数据,这3字节依次是:字母“a”、回车符“\r”和换行符“\n”。不过因为服务器程序已经被中断,所以Kongming20对客户端发送的数据回应了一个复位报文段5。

时间: 2024-11-01 01:38:59

《Linux高性能服务器编程》——3.5 复位报文段的相关文章

《Linux高性能服务器编程》——导读

前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的知识,基本没有自己的观点,甚至连一点自己的总结都没有.反观大师们的经典书籍,整本书只专注于一个问题,而且对每个技术细节的描述都是精雕细琢.最关键的是,我们在阅读这些经典书籍时,似乎是在用心与一位编程高手交流,这绝对是一种享受. 我们把问题缩小到计算机网络编程领域.关于计算机网络编程的相关书籍,不得不

《Linux高性能服务器编程》——3.4 TCP状态转移

3.4 TCP状态转移 TCP连接的任意一端在任一时刻都处于某种状态,当前状态可以通过netstat命令(见第17章)查看.本节我们要讨论的是TCP连接从建立到关闭的整个过程中通信两端状态的变化.图3-8是完整的状态转移图,它描绘了所有的TCP状态以及可能的状态转换. 图3-8中的粗虚线表示典型的服务器端连接的状态转移:粗实线表示典型的客户端连接的状态转移.CLOSED是一个假想的起始点,并不是一个实际的状态. 3.4.1 TCP状态转移总图 我们先讨论服务器的典型状态转移过程,此时我们说的连接

《Linux高性能服务器编程》——3.6 TCP交互数据流

3.6 TCP交互数据流 前面讨论了TCP连接及其状态,从本节开始我们讨论通过TCP连接交换的应用程序数据.TCP报文段所携带的应用程序数据按照长度分为两种:交互数据和成块数据.交互数据仅包含很少的字节.使用交互数据的应用程序(或协议)对实时性要求高,比如telnet.ssh等.成块数据的长度则通常为TCP报文段允许的最大数据长度.使用成块数据的应用程序(或协议)对传输效率要求高,比如ftp.本节我们讨论交互数据流. 考虑如下情况:在ernest-laptop上执行telnet命令登录到本机,然

《Linux高性能服务器编程》——3.3 TCP连接的建立和关闭

3.3 TCP连接的建立和关闭 本节我们讨论建立和关闭TCP连接的过程. 3.3.1 使用tcpdump观察TCP连接的建立和关闭 首先从ernest-laptop上执行telnet命令登录Kongming20的80端口,然后抓取这一过程中客户端和服务器交换的TCP报文段.具体操作过程如下: $ sudo tcpdump -i eth0 –nt '(src 192.168.1.109 and dst 192.168.1.108) or (src 192.168.1.108 and dst 192

《Linux高性能服务器编程》——3.9 TCP超时重传

3.9 TCP超时重传 在3.6节-3.8节中,我们讲述了TCP在正常网络情况下的数据流.从本节开始,我们讨论异常网络状况下(开始出现超时或丢包),TCP如何控制数据传输以保证其承诺的可靠服务. TCP服务必须能够重传超时时间内未收到确认的TCP报文段.为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动.如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器.至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传

《Linux高性能服务器编程》——第3章 TCP协议详解 3.1 TCP服务的特点

第3章 TCP协议详解 TCP协议是TCP/IP协议族中另一个重要的协议.和IP协议相比,TCP协议更靠近应用层,因此在应用程序中具有更强的可操作性.一些重要的socket选项都和TCP协议相关. 本章从如下四方面来讨论TCP协议: 不过在详细讨论TCP协议之前,我们先简单介绍一下TCP服务的特点,以及它和UDP服务的区别. 3.1 TCP服务的特点 传输层协议主要有两个:TCP协议和UDP协议.TCP协议相对于UDP协议的特点是:面向连接.字节流和可靠传输. 使用TCP协议通信的双方必须先建立

《Linux高性能服务器编程》——1.4 测试网络

1.4 测试网络 为了深入理解网络通信和网络编程,我们准备了图1-8所示的测试网络,其中包括两台主机A和B,以及一个连接到因特网的路由器.后文如没有特别声明,所有测试硬件指的都是该网络.我们将使用机器名来标识测试机器. 该测试网络主要用于分析ARP协议.IP协议.ICMP协议.TCP协议和DNS协议.我们通过抓取该网络上的以太网帧,查看其中的以太网帧头部.IP数据报头部.TCP报文段头部信息,以获取网络通信的细节.这样,以理论结合实践,我们就清楚TCP/IP通信具体是如何进行的了.作者编写的多个

《Linux高性能服务器编程》——1.6 DNS工作原理

1.6 DNS工作原理 我们通常使用机器的域名来访问这台机器,而不直接使用其IP地址,比如访问因特网上的各种网站.那么如何将机器的域名转换成IP地址呢?这就需要使用域名查询服务.域名查询服务有很多种实现方式,比如NIS(Network Information Service,网络信息服务).DNS和本地静态文件等.本节主要讨论DNS. 1.6.1 DNS查询和应答报文详解 DNS是一套分布式的域名服务系统.每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新的.众多网络客户端程

《Linux高性能服务器编程》——第2章 IP协议详解 2.1 IP服务的特点

第2章 IP协议详解 IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一.本章从两个方面较为深入地探讨IP协议: 由于32位表示的IP地址即将全部使用完,因此人们开发出了新版本的IP协议,称为IPv6协议,而原来的版本则称为IPv4协议.本章前面部分的讨论都是基于IPv4协议的,只在最后一节简要讨论IPv6协议. 在开始讨论前,我们先简单介绍一下IP服务. 2.1 IP服务的特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态(