计算机网络-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连接的数量,当超过这个上限就可以直接关闭。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机IGBT驱动电路一例

概述: 驱动的作用有三个: 1.是作为放大器获得所需要的驱动电压。 2.是提高输出电流能力。 3.是进行功率回路和控制回路的隔离 信号从MCU到IGBT驱动芯片 首先驱动电流需要放大 MCU的输出电流是mA级别,而IGBT需要的驱动电流可能达到几安培…

基于小程序+ssm实现的悬赏信息发布系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:ssm 【…

ubuntu系统安装k8s1.28精简步骤

目录 一、规划二、环境准备2.1 配置apt仓库配置系统基本软件仓库配置k8s软件仓库安装常用软件包 2.2 修改静态ip、ntp时间同步、主机名、hosts文件、主机免密2.3 内核配置2.4 关闭防火墙、selinux、swap2.5 安装软件安装docker安装containerd安装k8s软件包 三、安装配置k8s3.1 …

【linux】基础IO(三)

上一节基础IO我们着重理解了重定向与缓冲区,这节我们需要重点理解文件再磁盘中是怎样存储。以及上一节我们没有涉及到的知识。 stderr到时有什么用? 目录 fd-> 0 1 2:初步理解2怎样将错误与正确输出都打印在一个文件? 文件在硬…

如何从应用商店Microsoft Store免费下载安装HEVC视频扩展插件

在电脑上打开一张HEIC类型的图片提示缺少HEVC解码器,无法打开查看,现象如下: 这种情况一般会提示我们需要下载安装HEVC解码器,点击“立即下载并安装”会跳转到应用商店,但是我们发现需要付费7元才能下载安装 免费安装…

独家福利:Figma汉化大礼包,让UI设计零障碍!快来领取吧!

Figma是国外开发的软件。全英文页面限制了国内很多UI设计师的发挥,只能用Figma中文插件中文使用。Figma中文插件虽然不如中文版好用,但基本可以理解意思。那么Figma中文插件在哪里可以下载呢?下面介绍两种Figma中文插件的下载和安装方法&…

Redis数据库②高可用+持久化+性能管理

目录 一.高可用 二.持久化 1.Redis 提供两种方式进行持久化 2.RDB 持久化 (1)手动触发 (2)自动触发 (3)执行流程 (4)启动时加载 3.AOF持久化 (1)开…

如何进行软件质量评估?

一、为何评估 软件质量评估的重要性体现在以下几个关键方面: 确保用户需求满足: 软件质量评估首先是为了确保软件产品能够准确、完整地满足用户的需求。通过评估,可以发现软件在功能、性能、安全性等方面的不足之处,及时进行修正…

uniapp中自定义tabbar无法跳转?如何解决

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

0基础如何进入IT行业?一文揭秘成功蜕变之路!|TodayAI

一、引言 在数字化转型的浪潮下,IT行业的魅力日益增强,吸引了大量跨领域人才的关注。然而,对于那些零基础的人来说,进入这个充满机遇和挑战的领域似乎是一条充满未知和困难的道路。本文旨在探讨零基础者如何通过有效的学习路径、…

1688详情API接口:解锁多元化应用场景java php c++

随着互联网的快速发展,数据交换和信息共享已成为企业日常运营不可或缺的一部分。在这样的背景下,API(应用程序接口)接口作为实现数据互通的重要工具,受到了越来越多企业的青睐。1688详情API接口作为阿里巴巴旗下的重要…

Games101Homework【6】Acceleration structure(Including framework analysis)

Code Analysis&#xff1a; friend&#xff1a; C中友元&#xff08;友元函数和友元类&#xff09;的用法和功能_friend class a<b>-CSDN博客 [C&#xff1a;不如Coding]&#xff08;11&#xff09;&#xff1a;友元函数与友元类_哔哩哔哩_bilibili Here is a simple…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…

C语言结构体大小

1、结构体成员类型 结构体成员的类型&#xff0c;不同的结构体成员占用的内存大小不同 2、结构体对齐 为了提高内存访问的效率&#xff0c;编译器会对结构体进行对齐。对齐的方式是按照成员的类型和顺序来进行的。对齐的目的是为了让结构体成员的地址能够被整除&#xff0c;从…

✌2024/4/3—力扣—字符串转换整数

代码实现&#xff1a; int myAtoi(char *str) {long ret 0;int flag 1; // 默认正数// 去除空格及判断符号位while (*str ) {str;}if (*str -) {flag -1;str;} else if (*str ) {str;}// 排除非数字的情况if (*str < 0 || *str > 9) {return 0;}while (*str > …

[C++][算法基础]堆排序(堆)

输入一个长度为 n 的整数数列&#xff0c;从小到大输出前 m 小的数。 输入格式 第一行包含整数 n 和 m。 第二行包含 n 个整数&#xff0c;表示整数数列。 输出格式 共一行&#xff0c;包含 m 个整数&#xff0c;表示整数数列中前 m 小的数。 数据范围 1≤m≤n≤&#x…

真实的招生办对话邮件及美国高校官网更新的反 AI 政策

这两年 ChatGPT 的热度水涨船高&#xff0c;其编写功能强大&#xff0c;且具备强大的信息整合效果&#xff0c;所以呈现的内容在一定程度上具备可读性。 那么&#xff0c;美国留学文书可以用 ChatGPT 写吗&#xff1f;使用是否有风险&#xff1f;外网博主 Kushi Uppu 在这个申…

C++ vector顺序表模拟实现

目录 前言&#xff1a; 模拟实现&#xff1a; 构造函数&#xff1a; 析构函数&#xff1a; 容量调整&#xff08;reserve&#xff09;&#xff1a; resize函数&#xff1a; 尾插&#xff08;push_back&#xff09;: 尾删&#xff08;pop_back&#xff09;: 插入&#xff…

基于Spring boot+Vue的业余排球俱乐部会员管理系统

5 系统功能模块的具体实现 5.1超级会员角色 5.1.1 登录 超级管理员登录通过用户名和密码去数据库查询用户表&#xff0c;该名称是否在用户表中存在&#xff0c;如果存在&#xff0c;则通过用户名和密码查询密码是否正确&#xff0c;然后吧用户的信息存在jwt的负载里&#xf…

表1和表2怎么查找相同的内容?3种实用技巧赶紧学起来

-- 为啥会感觉给不了一个人幸福&#xff0c;而选择分开不打扰&#xff1f; 核对不同工作表中的数据&#xff0c;是大家在处理工作表时会遇到的高频场景&#xff0c;这篇文章跟大家分享一下如何查找不同工作表中的相同内容。 比对数据的方法有很多&#xff0c;这里跟大家分享3种…