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

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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;