重置报文段与TCP连接错误处理

TCP头部中的RST位被置位时,该报文段就被称作“重置报文段”。一般来说,当发现一个到达的报文段对于相关连接而言是不正确的,TCP就会发送一个重置报文段(所谓的相关连接是指由重置报文段的TCP与IP头部的4元组所指定的连接)。重置报文段的触发通常在以下场景中。

针对不存在端口的连接请求

通常情况下,当一个连接请求到达本地却没有相关进程在目的端口侦听时就会产生一个重置报文段。UDP协议规定,当一个数据报到达一个不能使用的目的端口时就会生成一个ICMP目的地不可达(端口不可达)的消息,TCP则使用重置报文段来代替完成相关工作。

终止连接

终止连接的正常方法是发送FIN报文段,即连接终止的四次挥手过程,有时也被称为有序释放。因为FIN是在之前所有排队数据都已发送后才被发送出去,通常不会出现丢失数据的情况。然而在任何时刻,我们都可以通过发送一个重置报文段替代FIN来终止一个连接。与有序释放相对,这种终止方式被称为终止释放。

终止连接的行为会为应用程序提供两个特性:(1)任何排队的数据都将被抛弃,一个重置报文段会被立即发送出去;(2)重置报文段的接收方会知道另一端并没有正常关闭连接。

半开连接

如果在未告知另一端的情况下通信的一端关闭或终止连接,该条TCP连接就处于半开状态(这与半关闭状态是两个不同的概念)。这种情况下只要不尝试通过半开连接传输数据,正常工作的一端将不会检测到另一端已经崩溃(因为崩溃的一端连重置报文段或者FIN报文段都没办法发出去)。这时如果崩溃的一端重新连接,它对这条连接上另一端发送过来的数据一无所知,TCP规定此时崩溃一方将回复一个重置报文段以关闭这个连接。

时间等待错误

TCP的TIME_WAIT状态的目的是让任何一个受制于与数据相关的关闭连接的数据被丢弃。在这段时期,等待的一方通常不需要任何操作,它只需要维持当前状态直到2MSL的计时结束。然而,如果它在这段时期内接收到来自于这条连接的一个重置报文段时,它的TIME_WAIT状态就会被破坏而提前进入CLOSED状态。

为什么连接的被动关闭方会发送重置报文段呢?在连接的主动关闭方进入TIME_WAIT状态后,它回复一个ACK以告知被动关闭方自己已经接收到FIN报文段,被动关闭方收到这个ACK后随即进入CLOSED状态,此时主动关闭方还在TIME_WAIT状态等待2MSL计时结束。在这个时期,网络中可能存在延时,被动关闭方之前发送的ACK在这个时候才姗姗来迟,此时这个ACK对处于TIME_WAIT状态的主动关闭方来说是旧的消息,因此它会发送一个ACK作为响应,其中包含了最新的序列号与ACK值。已经处于CLOSED状态的被动关闭方收到这个ACK后就会发送一个重置报文段作为响应。这会导致另一端的TIME_WAIT状态过早结束而进入CLOSED状态。解决这个错误的最简单方法就是让处于TIME_WAIT状态的TCP连接不对重置报文段做出响应。

 

                                                                                 本文内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》,有改动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值