【TCP专题】TCP连接断开

        当TCP的连接建立完成后,我们就可以尽情的通过TCP连接所创立的会话来进行数据的传输了。当然,再有意思的话题也有说完的时候,所以,当数据传输完之后,TCP该如何善后呢?

TCP的四次挥手

        TCP的连接断开需要经历4次数据包的交互才能完成,所以这个过程我们习惯性的称为“四次挥手”。当然,结束连接之后,主机中的"资源"(即缓存和变量)也就被释放掉了。

TCP的的断开也是双方均可以主动发起,我们上图以客户端主动发起为例,来说明这个过程。

  1. 首先,客户端发现自己需要发送的数据已经发送完毕,有了断开TCP连接的想法。它会发出一个TCP报文段,这个报文段中的FIN标记位将置1。(这里注意,和TCP的三次握手不同,FIN报文段是允许携带数据的,所以,它可能会包含整个数据流中最后一段数据。)
  2. 服务器收到对方的FIN断开请求报文段,则回复一个ACK报文段。
  3. 等待服务器把需要发送的数据都处理完毕之后,服务器也会发送一个FIN断开请求的报文段给客户端。
  4. 客户端收到后,也将回复一个ACK作为最后的确认。至此,服务器将关闭TCP的连接。而客户端也将在等待一段时间(图示的2MSL)后关闭。(这个等待时间及等待原因,我们后面再分析)

        以上便是TCP断开的一个正常流程了。我们这个过程中只关注了交互的方式,并没有关注具体数据包中的序列号和确认序列号,那是因为这几个数据包是允许包含数据的,所以,这个序列号和确认序列号需要考虑携带数据的字节数。

断开连接过程中的状态变化

        同样,这个图中,也标识出了断开过程中客户端以及服务器的状态变化。我们还是分别从客户端和服务器的视角来看一下这个状态变化

        我们还是先从客户端的角度出发,来观察下这个状态变化。

  1. 客户端一开始,还处于ESTABLISHED建立的状态,现在,他发现它数据传递完毕,于是发送了FIN断开请求报文段,之后,变进入到了一个新的状态 --- FIN_WAIT_1。
  2. 客户端再FIN_WAIT_1状态下,就是在等待服务器回复ACK,一旦等到之后,将进入到下一个状态。
  3. 客户端在收到服务器发送的ACK之后进入的状态被称为FIN_WAIT_2状态。这个状态主要就是等待服务器发送FIN请求。
  4. 客户端在收到服务器发送的FIN断开请求之后,将回复ACK进行确认。但注意,客户端并没有直接断开连接,进入到CLOSE(关闭)状态,而是进入到了一个TIME_WAIT状态继续等待。
  5. 在这个TIME_WAIT状态等待2MSL(这是一个时间),之后进入CLOSE(关闭)状态。进入到关闭状态后客户端将释放掉所有给这个TCP连接分配的资源。

        以上便是客户端在断开连接过程中出现的状态变化。注意,服务器也可以主动发起断开,则服务器方的状态变化也将经历这几个过程。

        下来我们再开看下服务器方的状态变化。

  1. 首先,服务器也还处在ESTABLISHED建立的状态。在收到客户端的FIN断开请求后,服务器会回复一个ACK进行确认,同时进入到CLOSED_WAIT状态
  2. 这个状态随着服务器自身发送FIN断开请求报文段之后,将结束,并进入到一个新的状态 --- LSA_ACK状态。
  3. 从这个状态的名字就可以看出来,服务器在等待最后的一个ACK报文段。当服务器接收到这个ACK之后,则将进入最终的状态,也就是CLOSE(关闭)状态。之后,将给这个TCP连接分配的所有资源释放掉。

    

        以上便是整个“四次挥手”断开过程的状态变化。需要注意的就是,这里的客户端和服务器是相对的,先发送FIN的需要经历“客户端”那一套,也就是需要在关闭前进行等待。而被动方则走的是“服务器”那一套,再收到ACK报文之后直接关闭。

为什么需要有TIME_WAIT状态

        不出意外的话,再看过TCP断开的四个过程中的状态变化之后,大家可能都会有一个疑问,就是这个FIN的发起方为啥需要等待一段时间之后,才能关闭TCP连接?也就是这个TIME_WAIT状态存在的意义是什么?

        其实这是很重要的一个等待,因为他是我们连接能够正常被关闭的保证

        我们先假设没有TIME_WAIT或者这个时间过短,看看会发生什么样的事情。

此图片来自小林coding,非常精美,感谢!

        从上边的图中,我们其实就已经可以清楚的看出这个等待的必要性了。因为我们永远不能以最理想的眼光来看待网络通信。说不定,那个数据包就迷失在这网络数据之海中了。

        这里假设客户端发送的最后一个ACK在网络中丢失了,而我们客户端不等待或者等待时间很短,则将自顾自的关闭了TCP连接。但是,服务端没有收到最后的确认,则一直停留在了LAST_ACK状态了。这样很不负责任。

        服务器长时间接收不到ACK,则也将触发重传(TCP的可靠之处了),服务器会再发送一个FIN断开请求。而此时,客户端已经关闭了该连接通道,则将回复RST来终结连接,这就属于异常的断开

TIME_WAIT的时间为什么是2MSL

        从上面的分析,我们可以看出来这个等待是必要的,当然,只需要发起方等待就可以了,因为它最后发送的ACK报文可能会出现问题,需要等待反馈。

        而且,这个时间的长短也很重要,不能太短,否则服务器方的反馈还没有回来,你就关闭了,那还不如不等。这里定义的时间长短是2MSL。

        MSL --- Maximum Segment Lifetime。翻译过来叫做报文最大生存时间。这个时间指的是一个报文在网络上存在的最长时间,超过这个时间,则该数据报文将被丢弃。这个和IP头部中的TTL --- 生存时间还不一样,因为它是一个正儿八经的时间概念。

TTL是什么?

TTL被称为生存时间,是IP头部中定义的一个变量。它的用法是一个数据包,每经过一个路由器的转发,这个TTL值将减1,当一个数据包的TTL值被减为0的时候,则将不会被转发,而直接被丢弃。它并不是一个时间概念,反应的是经过路由的跳数。

        所以,这个MSL的值应该大于等于TTL值消耗为0的值,以确保报文已被自然消亡。

        那这里的2MSL指的就是2被的MSL时间。

        TIME_WAIT的时间被设定为2MSL,也有有这方面的考虑的。这个数据包足够正常数据包的一个重传时间,比如如果被动关闭方没有收到断开连接的最后的ACK报文,就会触发超时重发Fin报文,另一方接收到FIN后(收到FIN断开请求后,客户端的TIME_WAIT状态会刷新,即等待时间重新计时2MSL),会重发ACK给被动关闭方,一来一去正好2个MSL。

Linux系统里,2MSL默认是60S

        设置2MSL的TIME_WAIT时间还能应对一种情况,就是防止旧连接的数据包造成错乱。

此图片来自小林coding,非常精美,感谢!

        这里也给大家一个场景。假设,服务器发送的一个数据报文在网络中被阻塞了,之后,客户端发起了断开连接的请求,同时请求的确认序列号应该是服务器之前丢失的那一个。此时,服务器将回复ACK并携带之前发送过的数据段进行重传。之后,TCP的连接正常断开。但注意,此时服务器之前被阻塞的数据段依旧在网络中慢悠悠的前进中。

        恰巧,客户端有发起了一个新的连接。而之前这个数据包的序列号又恰好在新连接序号范围内,则将被客户端接收,造成数据错乱的后果。

        所以,设计这2MSL的等待时间,足以让两个方向上的数据报都被丢弃,再出现新的连接时,不至于被历史报文造成数据错乱。

        这里有一个点,需要大家注意一下。那就是客户端新建的连接使用的序列号问题。我们前面说过,客户端在发起连接时使用的随机的初始序列号ISN为了防止历史数据造成混乱,这个确实没错。但是,这个序列号并不是一个无限的值,其本质是由32位二进制构成的,所以其取值范围也是有限的。这个初始值在随机的时候,是基于时钟的,回滚一次需要大概4.55小时。但是,如果发送的数据量过大的话,是会加速这个回滚过程的。所以,是有可能出现上述场景的。

        

        当然,这个时间也不能设置过长。时间太长必然导致内存资源的占用,并且,如果是连接发起方处在TIME_WAIT状态,则次状态下,还会导致其使用的端口资源被占用。(接收连接方也就是服务器方,理论上监听的同一个端口可以建立多个连接的,所以,不会造成端口占用的问题。当然,服务器如果TIME_WAIT状态的连接太多的话,也会大量的消耗系统资源,导致无法处理新的连接。)

为什么TCP的挥手需要四次而不能是三次

        这是一个很经典的问题,不过其实也不难解释,如果认证看来前面断开的过程,其实就已经推理出一二了。

        这个问题的核心其实在于"数据"上。理想的情况下,肯定是希望断开过程像连接建立过程一样,中间两步可以合成一步,变成“三次挥手”,这样,肯定是可以将资源节约下来的。但问题就是,你客户端(假设客户端是断开连接的发起方)数据发完了,我服务器(假设服务器是被动方)就也一定发完数据了吗?

        所以,服务器发送FIN一定是取决于自己数据发送完毕的情况下,而不是为了赶给客户端回复ACK这个趟。

        当然,也并不是说挥手就不能是三次。如果,恰好客户端发送FIN后,服务器回复的ACK中携带的是最后的数据报文段了,那同时将这个数据报文段中的FIN置1也未尝不可。那这样也就是三次挥手的情况了。

        所以,这一切都在于“数据”是否被发送完毕。理论上的,我们还是要按照四次来进行理解记忆的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/56693.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决TCP通信客户端断开连接服务器自动关闭

服务器会断开主要是 客户端断开后产生了 SIGPIPE信号 在对的位置忽略掉该信号就可以了! 蓝色框体为我自己测试结果!框体左边的是查的大牛们的讲解。 哈哈!第一次写博客 还请多包涵!都不会用这玩意儿 ...... 囧

初识 vxe-table (一)

对于 vxe-table 的介绍这里就不说了,常规用法也不多累赘,应该按文档撸就可以了。这里主要讲下关于自定义渲染的一些方式 1、先看看部分自定义的效果 熟悉 Element 的朋友可能已经发现了,这个表格里面用了相关组件,比如&#xff1…

陈抟(tuán)《心相篇》

北冥有鱼,其名为鲲。鲲之大,不知其几千里也。化而为鸟,其名为鹏。鹏之背,不知其几千里也。怒而飞,若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。《齐谐》者,志怪者也,《谐》之言曰:“鹏之徙于南冥也,水击三千里,抟扶摇而上者九万里,去以六月息者也。”(…

使用midjourney搞出一套三国人物画像!

当下已进入如火如荼的全民AI时代,最近体验了下midjourney,使用它的以图生图功能生成出来一套三国人物画像,和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程,大致如下&#x…

玩转注册表

很多人都认识注册表,但是几乎没人搞懂过注册表。我来带大家玩转注册表,做这篇文章就想记录一下注册表里的一些路径(难找,记不住!),本文中我会介绍一些实用的利用注册表进行内网权限维持的一个思…

阿房宫赋

阿房宫赋 杜牧 六王毕,四海一。蜀山兀,阿房出。覆压三百余里,隔离天日。骊(L)山北构而西折,直走咸阳。二川溶溶,流入宫墙。五步一楼,十步一阁;廊腰缦回,檐…

女程序员一定不要找太帅的男生做你男朋友

女程序员一定不要找太帅的男生做你男朋友 帅哥每天弄头发 买鞋子买衣服买手表不思进取 帅哥天生就有种神一般的自信 女生都绕着他转 他们不懂呵护女朋友 还容易弄丢 所以 女程序员找男朋友 只要 穿着得体 干净利索就好 帅哥 还是都留给我吧

现在的程序员真的都找不到女朋友了??!!!

前言:小编这有自学的过程中有一些资源可以免费共享, 【内涵Java学习80g视频,大厂面试题库,Java学习书籍,或者技术指导】 加微信领取【备注007】 为什么现在程序员找女朋友会这么难呢? 让我们来看看现在…

当女朋友问你会不会出轨的时候,该怎么回答?

1 大象为什么会害怕体型小的动物? (素材来源网络,侵删) ▼ 2 学会说话很重要 (素材来源网络,侵删) ▼ 3 原来,他们的老爸是一串香肠? (素材来源网络&…

程序员应该怎么和女生聊天,哪些话题屡试不爽?

首先我也也是程序员哈哈哈哈。。。。。。。 代码就像这样。。。。。。 (那么下面说说我们程序员应该注意哪些事情和妹子聊天) 说了不知道会不会被骂。 如果外形处于及格分以下(不是指普通,是指丑),做一下医…

机器学习复习(上)

严正声明:本文的答案是ChatGPT的回答,仅供参考,不代表就是正确答案!!! 2023年: 1.解释什么是过拟合和欠拟合,如何降低过拟合? 过拟合(overfitting)指的是一…

WhatsApp是什么?国内手机怎么安装怎么注册?

你做外贸吗?必备的几个国际社媒安装好了吗?成功注册并使用了嘛? 如果你是外贸新人,刚刚接触外贸完全不知道通过哪些途径与客户联系,那WhatsApp绝对是必不可少的一个工具。如果你是老外贸人,更不能忽视掉Wh…

基于android的即时通讯APP 聊天APP

基于android的即时通讯APP 或者 聊天APP 一 项目概述 该项目是基于Android 的聊天APP系统,该APP包含前台,后台管理系统,前台包含用户通讯录,用户详情,用户聊天服务,用户二维码,发现功能,发现详情 , 个人中心, 个人信…

Android 第三方APP直接跳转WhatsApp 和指定联系人(可以非好友)聊天

业务需求中有点击按钮,从我们APP跳转到WhatsApp和某个人聊天,发现前端实现是 https://api.whatsapp.com/send?phonexxxxx 把该链接通过Android系统浏览器打开,如果手机安装WhatsApp会直接打开app并跳转到对应的账号下,说明 What…

2022年城市商品房销售价格趋势,房价是涨还是跌?

近年来随着国家政策对房地产进行调控,房价是涨还是跌,是很多人关注和关心的问题。下面是小编对国家统计局最新发布的报告进行报表数据处理分析后得到的数据可视化图表,展示了2022年上半年以来商品房的发展情况,大家来看下吧。 一&…

chatgpt赋能python:Python抽奖概率:了解随机性及如何提高中奖概率

Python抽奖概率:了解随机性及如何提高中奖概率 在现代社会,抽奖活动越来越受欢迎。无论是商家推销产品还是赢得大奖,抽奖都是吸引人们参与的有效方式。其中,Python作为一种能够生成随机数的编程语言,成为了抽奖活动中…

又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 大家好,今天是8月的第2天,友友们注意防暑降温哦! 日报君在此为您呈上科技圈值得关注的新鲜事~ 今日新闻 浪潮员工连续值班24小时致昏迷,被诊断为“呼吸性碱中毒” 据Tech星球消息&#…

说好的不加班呢?百度工作强度已经超过字节了啊

有个新入职的百度员工怀疑自己进了假百度,因为他天天加班到半夜,和外面传说的“百度不加班”根本不一样,才干了两个礼拜,他已经开始怀疑人生了。 网友们乐了,小伙子挺有想象力,可惜现实很残酷,这…

BAT大揭秘:在腾讯、百度、阿里上班,差别竟然这么大?

微信又改版了,为了方便第一时间看到我们的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员之家”-点击右上角“…”-点击“设为星标”。 可以啦,让我们继续相互陪伴。 谈到中国互联网,就绕不开…

2022这一年

前言 一年过得好快啊,这个年终总结不知道该写点啥,所以一直到现在也没动笔。 但如果不写吧,总感觉少了点什么。就像过年守夜,反正我是每年都要等到凌晨12点放完鞭炮后才睡。 前些天也看到不少博主发布了2022年终总结,…