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

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

相关文章

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实