非正常的连接释放以及可能引起的结果的分析总结

2024-01-03 15:10

本文主要是介绍非正常的连接释放以及可能引起的结果的分析总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、正常的连接释放

正常的连接释放过程需要完成四次挥手的过程。(图 1)第一次,客户端向服务器发出一个连接释放的报文。FIN=1,seq=u,告诉服务器,我需要发送的数据已经全部发送过去了。然后服务器收到客户端的释放连接请求后,向客户段发出确认报文,ACK=1,seq=v,ack=u+1,表示服务器已经知道客户端之后不会发送任何数据报文,但是此时服务器可能还有数据没有发送,所以服务器可能在接下来一段时间都在发送数据。当服务器在发送完最后的数据后,向客户端发出连接释放确认报文,FIN=1,ACK=1,seq=w, ack=u+1,实现第三次挥手,告知客户端,我的数据也全部发完了,我也想要释放连接了。第四次挥手,是客户端手袋服务器连接释放的报文之后,向服务器发出确认报文,ACK=1,seq=u+1,ack=w+1.服务器收到确认报文后,立即关闭连接,客户端在等待2MSL时长后,如果没有异常,将关闭连接。到此TCP连接实现释放。

以上过程中,也可是服务器的数据先发送完,具体过程类似。

TCP连接的释放过程

 二、非正常的连接释放的类型总结

在TCP连接过程中可能因为报文丢失或者报文到达的顺序等问题,引起非正常的连接释放结果。比如说,如果

  1. 双方同时发出连接释放请求,又同时发送确认;——同时关闭
  2. 若是双方同时发出连接释放请求,同时发送的确认中发生丢失。
  3. 若是双方同时发出连接释放请求,同时关闭后,收到确认报文。

(4)当客户端关闭并发送FIN报文的时候后,同收到FIN+ACK报文。

(5)A/B的连接已经释放,连接中在网络中的残留的TCP报文字段重现到达,这个报文字段可能是数据段,也可能是FIN段,也可能是ACK段。

(6)在B已经关闭连接,A还没有关闭连接的时候,已失效的连接请求字段到达B。

TCP状态迁移变化图

 三、各种非正常连接释放可能引起的后果

1. 双方同时发出连接释放请求,又同时发送确认

如果客户机和服务器同时发送连接释放请求,即客户机发送报文FIN=1,seq=u,同时服务器发送报文FIN=1,seq=v,当客户机收到服务器发送的请求连接释放的报文后,向其发送确认关闭连接的报文:ACK=1,seq=u+1,ack= v+1;同时当服务器收到客户机发送的连接释放请求的报文后,向其发送确认报文:ACK=1,seq=v+1,ack=u+1。当服务器收到客户机发送的确认报文后,就关闭连接。当客户机收到服务器发送的确认报文后,就关闭连接。如果中间没有报文丢失的话,服务器和客户机会同时关闭连接。

同时发送释放连接的请求

 2.若是双方同时发出连接释放请求,同时发送的确认中发生丢失。

(1)若只有一方丢失,则双方一定不是同时关闭。比如如果客户端发给服务器的确认报文丢失。首先不影响客户端收到服务器发送的确认报文,客户端在收到确认报文之后,会立即释放连接。而服务器虽然收不到确认报文,但是因为它发送过确认报文,他会在发送过确认报文之后的2MSL的时间后,释放连接。最终,客户机和服务器完成TCP连接的释放。

同时发送报文,一方确认报文丢失

 (2)若双方均丢失确认报文。则服务器和客户端均会在发送过确认报文后,等待2MSL时间后,释放连接。最终,服务器和客户机完成TCP连接释放。

同时发送报文,双方丢失确认报文

 3. 若是双方同时发出连接释放请求,同时关闭后,收到确认报文

 比如在第二种情况下,确认报文并没有丢失,而是确认报文到达的时间长于等待的2MSL,此刻已经释放连接,收到的客户机(/服务器)会拒绝,因为根本没有发起连接请求。

4. 当客户端关闭并发送FIN报文的时候后,同收到FIN+ACK报文

即如果客户机在发送释放连接请求后,服务器还有数据没有发完,但是发送了确认报文丢失,继续发送数据报文,当数据报文发送完之后,发送了FIN和ACK报文。根据报文的seq大小,因为v<w,拒收旧报文,并不影响客户机发送确认服务器释放的报文,当服务器收到确认报文,会释放连接。而服务器在等待2MSL时间后,也会释放连接。至此服务器和客户机间的连接得到释放

走失的报文返回

 5. A/B的连接已经释放,连接中在网络中的残留的TCP报文字段重现到达,这个报文字段可能是数据段,也可能是FIN段,也可能是ACK

即假设服务器已经释放连接,网络中残留的报文在客户机TIME-WAIT阶段收到数据报文或FIN段或ACK段。客户机会拒收,因为seq的值不对。然后在到达2MSL时间后,释放连接。

走失的报文在TIME_WAIT阶段走回

 6. 在B已经关闭连接,A还没有关闭连接,正处在TIME_WAIT阶段,已失效的连接请求字段到达A

此时特指A服务器,B特指客户机。此时服务器会拒绝,因为此刻还没有和客户机完全释放连接,服务器还没有释放连接。这里不能看seq的序号大小,因为也可能时新的连接请求,每一次建立连接请求的时候seq开始的值是随机的。如果是新的连接,超过设定等待时间后,客户机会重新发送连接请求,此时若服务器等待了2MSL后,已经释放了连接。可以再接受新的连接请求。总之,不会造成混乱。

失效的连接请求在TIME_WAIT阶段到达

 四、总结

序号seq很重要。TCP的计时器也很重要,尤其是时间等待计时器的2MSL。

这篇关于非正常的连接释放以及可能引起的结果的分析总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566116

相关文章

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio