计算机网络-TCP断开连接阶段错误应对机制

连接断开阶段

  • 四次挥手机制:TCP连接的断开需要四次挥手,这是因为双方都需要独立地关闭数据传输。第二次和第三次挥手不能合并,因为在回复第二次挥手的时候,可能还有数据没有接收完成,所以需要先回复ACK报文,等待所有的数据接收完成之后再发送FIN报文。这样可以确保数据的完整性。

  • 延迟应答:TCP为了提高传输效率,采用了延迟应答的策略。如果没有响应数据要发送,TCP会延迟一段时间,等待是否有响应数据可以一起发送。这样可以减少网络的负载。如果在等待发送ACK期间,对方的第二个数据报文又到达了,这时就会立刻发送ACK。这样可以确保数据的及时性。如果开启了延迟应答的TCP,并且没有响应数据要发送,那么就可能看到ACK和FIN报文合并的情况。这是因为TCP为了提高效率,尽可能地将多个报文合并发送。

  • 报文丢失:如果某次挥手的报文丢失了,TCP会进行超时重传,达到最大次数之后就强制断开连接。这是因为TCP为了确保数据的可靠性,采用了超时重传的策略。如果超过一定的时间还没有收到对方的应答,就会认为报文丢失,然后进行重传。

  • 主机宕机:如果客户端/服务端建立连接后宕机/断网,会有以下几种情况:

    • 未宕机方传输数据:如果服务端向客户端传输数据的过程中发现客户端宕机并重启,客户端的TCP连接的数据结构已经丢失,那么会发送RST报文;如果客户端仍在宕机,服务端会触发超时重传,次数达上限后断开。这是因为TCP为了确保数据的可靠性,采用了超时重传的策略。
    • 宕机方传输数据:如果客户端宕机之后重启,希望与同一服务端连接,会发送SYN报文。如果客户端SYN报文中端口号与历史连接相同,服务端会认为这个SYN是乱序的,所以回复历史连接中的正确ACK(Challenge ACK),但是客户端发现这个ACK不是自己希望收到的,就会发送RST,双方断开连接。这是因为TCP为了防止乱序的报文影响到正常的连接,采用了Challenge ACK的策略。
    • 长时间无数据传输:为了防止客户端长时间不发送报文占用服务端资源,服务端可以开启TCP保活机制,发送探测报文来探测客户端还是否处于正常状态,否则只有服务端重启才能断开。这是因为TCP为了防止无效的连接占用资源,采用了保活机制。
  • 进程崩溃:如果进程崩溃,操作系统会在回收资源的时候代为进行挥手过程,这与主机宕机是不同的,因为TCP的连接信息是由内核维护的。这是因为TCP为了防止进程崩溃导致的资源泄露,采用了进程崩溃后自动断开连接的策略。

  • TIME_WAIT状态

    TIME_WAIT状态是TCP连接断开后的一个必要状态。这个状态的存在有两个主要原因:
    • 防止旧报文干扰新连接:TIME_WAIT状态可以防止“旧的重复报文”在新的连接中被错误地接收。这是通过让TCP连接在TIME_WAIT状态持续2MSL的时间,使得网络中可能存在的属于“旧连接”的报文都消失,这样新的连接就不会收到旧的报文了。
    • 保证正常关闭:TIME_WAIT状态可以确保TCP连接可靠地关闭。这是通过在TIME_WAIT状态期间等待2MSL(报文最大生存时间)来实现的,这样可以保证对方收到了我们的FIN报文,如果对方没有收到,我们可以在这个时间内重发。
  • 主动断开连接

    主动断开连接会导致有很多处于TIME_WAIT状态的TCP连接,这会占用系统资源,因此,应该尽量让客户端承受TIME_WAIT。

    TCP连接可以在以下几种情况下被主动断开:
    • 长连接数量达上限:如果长连接的数量达到了系统的上限,系统可能会主动断开一些连接以释放资源。
    • 长连接超时:如果客户端长时间无请求,长连接可能会超时,此时服务端可能会主动断开连接。
    • 没有使用长连接:如果没有使用长连接(Keep-Alive),短链接一般由服务端主动关闭
  • 快速复用

    当TIME_WAIT状态过长会导致占用系统资源过多时,可以选择快速复用,但这相当于放弃了TIME_WAIT的作用,所以最好在保证安全的情况下复用。
    • tcp_tw_reuse选项:tcp_tw_reuse选项可以快速复用处于TIME_WAIT的连接,但需要配合时间戳一同开启。虽然有了时间戳控制可以避免历史报文,但是历史RST报文只要在接收窗口内就不会丢弃,而且也无法保证被动关闭方正常关闭。
    • tcp_tw_recycle选项:tcp_tw_recycle选项也可以快速复用,但是在使用了NAT网络的情况下是不安全的,因为tcp_tw_recycle和时间戳是针对IP地址做PAWS检查的,使用NAT会导致内网下的两个主机会映射到同一个IP,此时两端传输数据包,一端的时间戳会比另一端小,在服务器看来,会认为小的那一端是非法报文,从而丢弃。
    • tcp_max_tw_buckets选项:tcp_max_tw_buckets选项可以设定当前主机最多存在的TIME_WAIT状态的TCP连接的数量,当超过这个上限就可以直接关闭。

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

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

相关文章

【U8+】打开固定资产卡片,提示:运行时错误‘91’,未设置对象变量或with block变量。

【问题描述】 用友U8软件,固定资产模中打开某张卡片后, 提示:运行时错误‘91’,未设置对象变量或with block变量。 Ps:但不是所有卡片打开的时候都会提示,有的正常。 【解决方法】 跟踪数据库后&#xff…

SpringBoot入门(Hello World 项目)

SpringBoot关键结构 1.2.1 Core Container The Core Container consists of the Core, Beans, Context, and Expression Language modules. The Core and Beans modules provide the fundamental parts of the framework, including the IoC and Dependency Injection featur…

C语言易错知识点(3):字符数组的修改、sscanf、sprintf

字符数组是一个很细节的语法,涉及很多知识点,这篇文章我主要分享一下如何理解字符数组,以及对应的sscanf、sprintf有什么用 1.字符数组的初始化以及内容修改易错点 字符数组的初始化方式有两种,一种是直接用字符串进行初始化&am…

每日一题---OJ题: 相交链表

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go! ! ! emmm,看这道题好像不怎么难,我们一起画图分析分析 上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交 …

渗压计在测压管与测井中的安装方法

在地下水动态监测与工程安全评估中,渗压计扮演着至关重要的角色。它能够精准地测量地下水压力的变化,为工程师提供决策依据。本文将详细阐述在测压管或测井中如何正确安装渗压计,以确保其准确度和可靠性。 一、建立零读数并浸透透水石 在安装…

PandasAI的应用与实战解析(一):环境安装、运行demo

文章目录 1.源码包下载、明确依赖版本2.安装python依赖3.运行demo 本博客源码仓库地址:gitlab,本篇博客对应01分支python版本为3.10.x 什么是PandasAI?一句话总结的话,PandasAI就是一个结合了Pandas和AI的开源工具,更…

windwos安全加固

一、账号管理 按用户类型分配账号 目的:根据系统要求,设定不同账户和组,管理员、数据库 sa、审计用户、来宾用户等 实施方法: 打开本地用户和计算机管理器 ​ 1.打开运行,输入lusrmgr.msc 2.根据用户要求将账户加入…

秋招算法刷题7

20240410 1.接雨水 方法一,动态规划,时间复杂度O(n^2),空间复杂度O(n) public int trap(int[] height) { int nheight.length; if(n0){ return 0; } …

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…

open-sora

Open-Sora,高效复现类Sora视频生成方案开源!魔搭社区最佳实践教程来啦!https://mp.weixin.qq.com/s/WMQIDgZs2MBPGtx18XSXgw Open-Sora开源方案讲解开源但“平替”的方案。https://mp.weixin.qq.com/s/nPYCzgBA7hIsPZ6PCyXxKQOpen-Sora/docs…

数据分析案例(一):地区收入的PCA主成分分析

练习1 地区收入的PCA主成分分析 0.变量说明 1.导包操作 核心思路:导入基础数据操作库包,PCA、k-means 库包,数据可视化库包 import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing i…

YOLOV5训练KITTI数据集实践

目录 一、YOLOV5下载安装二、KITTI数据集三、标签格式转换四、修改配置文件五、训练六、测试 一、YOLOV5下载安装 git clone https://github.com/ultralytics/yolov5.git conda create -n yolov5 python3.8 -y conda activate yolov5 cd yolov5 pip install -r requirements.t…

2024最火的情感短视频素材在哪下载?这里有几个素材网站可以下载

在这个看似无边无际的短视频海洋中,我就像那个手握罗盘、脚踏破旧木筏的勇敢航海家,时刻准备着发现新大陆。而我的罗盘,就是那些能够指引我找到珍稀素材的网站。让我带你领略一下我的航海日记吧。九才素材网: 九才素材网提供了丰…

青少年体能素质教育平台

一、项目背景与意义 随着社会的快速发展和人们生活水平的提高,青少年体能素质教育逐渐受到社会各界的广泛关注。体能素质作为青少年全面发展的重要组成部分,对于提升他们的健康水平、增强自信心、培养团队协作精神和创新能力具有重要意义。然而&#xf…

继承【C/C++复习版】

目录 一、什么是继承?怎么定义继承? 二、继承关系和访问限定符? 三、基类和派生类对象可以赋值转换吗? 四、什么是隐藏?隐藏vs重载? 五、派生类的默认成员函数? 1)派生类构造函…

关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题&#xff0c;记录一下&#xff0c;先看一段代码 <?php $str&#xff0c;&#xff0c;"\\"; $pattern&#xff0c;&#xff0c;"/\\/"; if(preg_match($partern,$str,$arr)) { &#xff0c;&#xff0c;&#xff0c;&…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

如何修复在Deepin系统中因`apt-get autoremove systemd`导致的启动问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

选择正确的Go Module Path

最近我在查看项目代码时&#xff0c;注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法&#xff0c;相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path&#xff0c;但这…

Jmeter针对多种响应断言的判断

有时候response返回的结果并非一种&#xff0c;有多种&#xff0c;需要对这几种进行判断的时候需要使用Bean Shell。 &#xff08;1&#xff09;首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…