`
jameswxx
  • 浏览: 776489 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

TCP复位报文段与常见网络连接错误

 
阅读更多
原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2065445
TCP包头中有6个标志,其中有一个复位标志(RST),这个标志其实跟网络程序中很多的错误描述相关。常见的比如:
Unable to connect to remote host: Connection refused
read error: Connection reset by peer
Connection closed by foreign host
特别是前两个错误描述,相信很多人都碰到过,但是最底层原因到底是什么呢?其实这都跟复位报文段有关。复位报文段是指RST标志生效的TCP包,复位报文段的产生场景有以下几种。
 
 
 
一:Unable to connect to remote host: Connection refused
出现这种错误,是因为有不存在的端口的连接请求,当连接请求到达时,目的端口没有进程正在听。对于UDP,当一个数据报到达目的端口时,该端口没在使用,它将产生一个ICMP端口不可达的信息。而TCP则使用复位。产生这个例子也很容易,我们可使用telnet客户程序来指明一个目的端口没在使用的情况:
 
上图说明了试图在不存在的端口上打开连接而产生的复位。该场景的复位报文段有以下几点特性:
  1. ACK标志没有被设置为1
  2. 序号被置为0
  3. 确认序号被置为进入的ISN加上数据字节数
尽管在到达的报文段中没有真正的数据,但SYN比特从逻辑上占用了1字节的序号空间;因此,在这个例子中复位报文段中确认序号被置为ISN与数据长度(0)、SYN比特所占的1的总和。
 
 
 
二 :read error: Connection reset by peer
这是因为异常终止一个连接
正常终结
正常的终止连接方式是一方发送FIN,即常规的4次挥手,有时这也称为有序释放(orderly release),因为在所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。
异常终结
但也有可能发送一个复位报文段而不是FIN来中途释放一个连接。有时称这为异常释放(abortive release)。异常终止一个连接对应用程序来说有两个优点:
(1)丢弃任何待发数据并立即发送复位报文段;
(2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭;
 
使用SOCK程序能够观察这种异常关闭的过程,Socket API通过“ linger on close”选项(SOLINGER)提供了这种异常关闭的能力。我们加上- L选项并将停留时间设为0。这将导致连接关闭时进行复位而不是正常的FIN。我们连接到处于服务器上的SOCK程序,并键入一输入行:
bsdi % sock -L0 svr4 8888  这是客户程序,服务器程序显示后面
hello, world                       键入一行输入,它被发往到另一端
^ D                                  键入文件结束符,终止客户程序
 
图1 8 - 1 5是这个例子的tcpdump输出显示(在这个图中我们已经删除了所有窗口大小的说明,因为它们与讨论无关)。
 
第1 ~ 3行显示出建立连接的正常过程;
第4行发送我们键入的数据行( 12个字符和Unix换行符);
第5行是对收到数据的确认;
第6行对应为终止客户程序而键入的文件结束符,由于我们指明使用异常关闭,而不是正常关闭(命令行中的- L 0选项),因此主机bsdi端的TCP发送一个RST而不是通常的FIN。
RST报文段中包含一个序号和确认序号。需要注意的是RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接,并通知应用层连接复位。
我们在服务器上得到下面的差错信息:
这个服务器程序从网络中接收数据并将它接收的数据显示到其标准输出上。通常,从它的TCP上收到文件结束符后便将结束,但这里我们看到当收到RST时,它产生了一个差错。这个差错正是我们所期待的:连接被对方复位了。
 
 
 
三:检测半打开连接
      半连接都会被复位掉,如果一方已经关闭或异常终止,而另一方却还不知道,这样的TCP连接称为半打开(Half - Open)的。任何一端的主机异常都可能导致这种情况。只要不打算在半连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。
     半打开连接的另一个常见原因是当客户主机突然掉电而不是正常的结束客户应用程序后再关机。这可能发生在使用PC机作为Telnet的客户主机上,例如,用户在一天工作结束时关闭PC机的电源。当关闭PC机电源时,如果已不再有要向服务器发送的数据,服务器将永远不知道客户程序已经消失了。当用户在第二天到来时,打开PC机,并启动新的Telnet客户程序,在服务器主机上会启动一个新的服务器程序。这样会导致服务器主机中产生许多半打开的TCP连接。
      能很容易地建立半打开连接。在bsdI上运行Telnet客户程序,通过它和svr4上的丢弃服务器建立连接。我们键入一行字符,然后通过tcpdump进行观察,接着断开服务器主机与以太网的电缆,并重启服务器主机。这可以模拟服务器主机出现异常(在重启服务器之前断开以太网电缆是为了防止它向打开的连接发送FIN,某些TCP在关机时会这么做)。服务器主机重启后,我们重新接上电缆,并从客户向服务器发送另一行字符。由于服务器的TCP已经重新启动,它将丢失复位前连接的所有信息,因此它不知道数据报文段中提到的连接。TCP的处理原则是接收方以复位作为应答。
 
图18 - 16是这个例子的tcpdump输出显示(已从这个输出中删除了窗口大小的说明、服务类型信息和MSS声明,因为它们与讨论无关)。
第1 ~ 3行是正常的连接建立过程
第4行向丢弃服务器发送字符行“ hithere”
第5行是确认
然后断开svr4的以太网电缆,重新启动,并重新接上网线。接着从客户端输入下一行(即“ another line”),当我们键入回车键后,这一行被发往服务器(图18 - 16的第6行)。这导致服务器产生一个响应,但要注意的是由于服务器主机经过重新启动,它的ARP高速缓存为空,因此需要一个ARP请求和应答(第7、8行)。
第9行表示RST被发送出去。
客户收到复位报文段后显示连接已被另一端的主机终止(Telnet客户程序发出的最后信息不再有什么价值)。

 

  • 大小: 37.3 KB
  • 大小: 28.2 KB
  • 大小: 14.4 KB
  • 大小: 19.2 KB
  • 大小: 33.6 KB
分享到:
评论

相关推荐

    Ch5_TCP协议特点和TCP报文段1

    总的来说,TCP协议通过其丰富的特点和复杂的报文段结构,保证了网络通信的高效、可靠和安全。这些特性使得TCP成为互联网中最广泛使用的传输层协议之一,尤其适用于需要高可靠性传输的应用,如HTTP、FTP、SMTP等。

    TCP协议报文格式和协议解析

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于IP的传输层协议,在计算机网络中扮演着至关重要的角色。下面将对TCP协议报文格式和协议解析进行详细的介绍。 报文格式 TCP报文格式由头部和...

    利用libpcap发送TCP RST标志位,测试tcp连接破坏

    这在处理错误、拒绝服务攻击防御或测试网络连接的鲁棒性时非常有用。 以下是如何使用libpcap发送TCP RST标志位的基本步骤: 1. **初始化libpcap**:首先,你需要在程序中包含libpcap库,并初始化一个pcap对象,该...

    计算机网络报文大全chm文件

    2. **TCP协议**:TCP(Transmission Control Protocol)报文头部包括源端口号、目标端口号、序列号、确认号、数据偏移、保留、紧急指针、确认、推送、复位、同步、终止等标志位,以及窗口大小、校验和、紧急指针等...

    路由交换技术-TCP报文格式.pptx

    【路由交换技术与TCP报文格式】 在计算机网络中,路由交换技术是网络通信的核心,它负责在网络设备之间转发数据包。路由是指网络中的设备(路由器)根据预先设定的路径选择最佳路线,将数据包从源地址传送到目标...

    协议分析系列:史上最强网络协议报文格式大全中文图文说明【华为】.zip

    TCP(Transmission Control Protocol)提供面向连接、可靠的字节流服务,报文段包含源和目标端口号、序列号、确认号、数据偏移、保留、紧急指针、确认ACK、推送PSH、复位RST、同步SYN和终止FIN等字段。UDP(User ...

    TCP包结构.

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。...综上所述,TCP报文结构和工作机制是保证数据传输可靠性的关键,而三次握手和拥塞控制机制确保了TCP连接的稳定和网络的有效利用。

    Python-tcpkiller用于在Linux或macOS上关闭一个TCP连接

    tcp_killer工具是这个领域的实践应用,它为系统管理员和开发者提供了一种便捷的方法来处理棘手的网络连接问题,比如强制结束占用端口的进程或者测试网络服务的恢复能力。 该工具的核心原理在于使用socket的RAW模式...

    STM32F429 + LAN8742以太网_ETH_LWIP_TCP

    网络调试助手通常是一个软件工具,它可以模拟客户端或服务器,发送和接收TCP、UDP数据包,帮助验证网络连接的正确性和性能。通过这样的工具,开发者可以检查数据包的内容、时间戳以及网络延迟,从而优化代码和解决...

    TCP报头协议实验.pdf

    例如,TCP头文件中定义的DEF_MSS常量,代表最大报文段长度,它是TCP通信双方协商的最大的数据负载长度,以避免因单个报文段过大而引起的问题。时间戳选项则有助于精确测量往返时延(RTT),提高TCP的性能和可靠性。 ...

    TCP 半连接队列和全连接队列 420 -452

    如果超出限制,内核会采取丢弃连接或者发送RST复位报文的策略。通常,增大半连接队列可以通过调整`/proc/sys/net/ipv4/tcp_max_syn_backlog`参数,而增大全连接队列则涉及到listen函数的backlog参数。然而,这些方法...

    网络抓包分析(TCP)

    本篇将重点探讨TCP(传输控制协议)在网络通信中的行为,包括三次握手、四次挥手、报文结构及其在实际抓包文件中的体现。 1. TCP简介: TCP是一种面向连接的、可靠的传输层协议,它通过确认机制、序列号和重传策略...

    简易TCPConnect端口扫描器

    如果端口未打开,服务器则不会响应或返回RST(复位)报文,表示连接被拒绝。 端口扫描是网络安全中的重要一环,可以用于识别开放服务、检测漏洞和潜在的安全风险。常见的扫描类型包括TCPConnect扫描、TCP SYN扫描、...

    TCP通信例子,客户端+服务器端

    - 如果在通信过程中出现错误,如一方无响应,另一方会发送RST(复位)报文,立即终止连接,无需执行完整的挥手过程。 在TCP/IP网络协议栈中,TCP位于传输层,负责处理端到端的数据传输。而IP(网际协议)位于网络...

    SANGFOR_AD_V5.1_TCP_RS节点监视器配置指导书.pdf

    TCP-RST节点监视器能够模拟客户端发起TCP连接,并发送TCP复位报文,通过检查服务器是否能正确响应来判断网络节点的可用性。这种方法能快速识别出那些无法正常处理TCP连接的服务器,有助于提高网络服务的可靠性。 3...

    tcpip详解的课件

    - **复位报文段**:如果连接的一方突然崩溃或异常终止,则另一方可能会收到复位(RST)报文段。这意味着连接被强制终止,而不是正常地通过四次挥手来关闭。 - **同时关闭**:类似于同时打开,如果双方几乎在同一时刻...

    图解三次握手,四次挥手.doc

    三次握手是指在客户端和服务器之间建立 TCP 连接的过程,这个过程需要交换三个 TCP 报文段。整个过程可以分为三个步骤: 1. 客户端向服务器发送 SYN 报文段,请求建立连接。 2. 服务器收到 SYN 报文段后,返回 SYN+...

    tcptrace网络socket分析工具

    6. **错误检测**:TCPtrace可以识别出各种TCP错误,如RST(复位)、FIN(结束)和ACK(确认)序列错误,这些错误通常是网络不稳定或连接中断的信号。 7. **代理模式**:作为代理运行,TCPtrace可以在不改变原有网络...

    基于TCP协议的端口扫描技术

    常见的TCP端口扫描技术有三种:全连接扫描、半开扫描和SYN扫描。 * 全连接扫描:这种扫描方式是指向目标系统的TCP端口发送SYN请求,目标系统响应后,扫描器就可以获取目标系统的响应信息。 * 半开扫描:这种扫描...

    Android网络编程-TCP协议.pdf

    在Android网络编程中,理解TCP协议至关重要,因为许多应用需要可靠的网络连接,如HTTP、HTTPS、FTP等协议都建立在TCP之上。开发者需要知道如何使用Java的Socket类或者OkHttp等库来实现TCP通信,同时处理连接建立、...

Global site tag (gtag.js) - Google Analytics