tcp 超时计时器

在 TCP(传输控制协议)中有以下四种重要的计时器:

  1. 重传计时器(Retransmission Timer)

    • 作用:用于处理数据包丢失的情况。当发送方发送一个数据段后,就会启动重传计时器。如果在计时器超时之前没有收到接收方对该数据段的确认(ACK),发送方就会认为这个数据段丢失了,进而重新发送这个数据段。
    • 示例:假设主机 A 向主机 B 发送一个数据段,发送后启动重传计时器,设置时间为 3 秒。如果 3 秒内没有收到主机 B 发送的 ACK 确认该数据段已接收,主机 A 就会重新发送这个数据段。
    • 原理细节:重传时间的计算是一个复杂的过程。它通常是根据往返时间(RTT,Round - Trip Time)来估算的。RTT 是指一个数据段从发送出去到收到对应的确认所经历的时间。最初,TCP 会对 RTT 进行一个初始估计,随着通信的进行,会不断根据实际的往返时间来更新这个估计值,从而动态地调整重传计时器的超时时间,使重传策略更加合理。
  2. 持续计时器(Persistent Timer)

    • 作用:主要用于处理零窗口大小通知的情况。当接收方的接收缓冲区已满,会向发送方发送一个窗口大小为 0 的通知。发送方收到这个通知后就会停止发送数据,直到接收方重新打开窗口。但是接收方可能由于某些原因(如进程繁忙等)无法及时发送新的窗口大小更新通知,这时候持续计时器就会起作用。当持续计时器超时,发送方会发送一个字节的数据段,接收方会在收到这个数据段后返回一个确认,这个确认中就包含了当前接收窗口的大小,这样发送方就可以根据这个窗口大小来判断是否可以继续发送数据。
    • 示例:主机 A 向主机 B 发送数据,主机 B 的接收缓冲区满了,给主机 A 发送窗口大小为 0 的通知。主机 A 收到通知后停止发送并启动持续计时器。假设持续计时器设置为 60 秒,60 秒后主机 A 发送一个字节的数据给主机 B,主机 B 收到后返回确认信息告知当前窗口大小,若窗口大小不为 0,主机 A 就可以继续发送数据。
    • 原理细节:这种机制可以有效地防止因为接收窗口长时间关闭而导致的死锁情况。持续计时器的值一般是通过系统设置的,并且可以根据网络环境等因素进行适当调整。
  3. 保活计时器(Keep - Alive Timer)

    • 作用:用于检测连接的对端是否还存活。在一个长时间没有数据交互的 TCP 连接中,发送方可以通过保活计时器来定期发送一个探测报文段,来检查连接是否还可用。如果连续发送多个探测报文段后都没有收到对方的响应,就可以认为连接已经中断,进而可以释放相关的资源。
    • 示例:有一个 TCP 连接在两个服务器之间建立,但是经过一段时间(比如 2 小时)没有数据传输。此时保活计时器开始工作,假设保活计时器设置为每 75 分钟发送一次探测报文段。发送方发送探测报文段后,如果在一段时间内没有收到对方的响应,经过几次尝试后,就可以判定连接失效,关闭连接并释放资源。
    • 原理细节:保活计时器的时间间隔和探测次数等参数通常是可以配置的。不同的操作系统可能有不同的默认设置。这个计时器的存在有助于及时清理那些实际上已经失效但没有被正常关闭的连接,节省系统资源。
  4. 时间等待计时器(Time - Wait Timer)

    • 作用:当 TCP 连接的一方主动关闭连接时,会进入 TIME - WAIT 状态,此时时间等待计时器开始计时。这个状态和计时器主要是为了确保连接的正常关闭,防止旧连接的重复数据包对新连接造成干扰。在 TIME - WAIT 状态下,该连接会停留一段时间,这个时间足以让网络中延迟的数据包全部到达目的地或者自然过期。
    • 示例:主机 A 主动关闭和主机 B 的 TCP 连接,主机 A 进入 TIME - WAIT 状态,时间等待计时器开始计时,假设计时时间为 2MSL(MSL 是最长报文段寿命,Maximum Segment Lifetime)。在这 2MSL 时间内,主机 A 会等待可能延迟的数据包到达,并且丢弃来自旧连接的迟到数据包,确保连接的干净关闭。
    • 原理细节:2MSL 的时间设置是基于网络数据包生存时间的考虑。一个数据段在网络中最多存活 MSL 时间,通过等待 2MSL 时间,可以保证在这个连接上发送的所有数据包都从网络中消失,避免对后续相同 IP 地址和端口组合的新连接产生影响。例如,如果没有这个等待时间,旧连接的延迟数据包可能会被新连接误认为是新的数据,从而导致数据混乱。
  5. 网络:TCP分割数据以及MSL、MTU、MSS的关系_tcp msl-CSDN博客

计算机网络微课堂第026讲 可靠传输的实现机制 — 回退N帧协议(有字幕有背景音乐版)_哔哩哔哩_bilibili

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

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

相关文章

go环境搭建

华子目录 下载vscode安装vscodego编译器下载go编译器安装配置go环境变量vscode安装go插件测试 下载vscode 官方:https://code.visualstudio.com/Download 安装vscode vscod安装成功 go编译器下载 官方:https://golang.google.cn/ 点击下载 go编译器安…

Minikube 上安装 Argo Workflow

文章目录 步骤 1:启动 Minikube 集群步骤 2:安装Argo Workflow步骤 3:访问UI创建流水线任务参考 前提条件: Minikube:确保你已经安装并启动了 Minikube。 kubectl:确保你已经安装并配置了 kubectl&#xff…

Stable Diffusion核心网络结构——CLIP Text Encoder

🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…

git日志查询和导出

背景 查看git的提交记录并下载 操作 1、找到你idea代码的路径,然后 git bash here打开窗口 2、下载所有的日志记录 git log > commit.log3、下载特定日期范围内记录 git log --since"2024-09-01" --until"2024-11-18" 你的分支 > c…

Go中数组和切片

数组和切片 【1】、数组 1、什么是数组 一组数 数组需要是相同类型的数据的集合 数组是需要定义大小的 数组一旦定义了大小是不可以改变的。 package mainimport "fmt"// 数组 // 数组和其他变量定义没什么区别,唯一的就是这个是一组数,需要…

three.js加载GLTF模型

要在three.js中正确加载和显示GLTF模型,需要遵循一系列步骤来确保模型的纹理和材质被正确应用。以下是加载GLTF模型的基本步骤: 引入必要的three.js模块: 引入了GLTFLoader模块,用来加载GLTF格式模型的类。 创建加载器实例&#…

消息中间件分类

消息中间件(Message Middleware)是一种在分布式系统中实现跨平台、跨应用通信的软件架构。它基于消息传递机制,允许不同系统、不同编程语言的应用之间进行异步通信。 常见的消息中间件类型包括: 1. JMS(Java Message S…

形态学图像处理(Morphological Image Processing)

形态学图像处理(Morphological Image Processing) 前言 ‍ 本博客为个人总结数字图像处理一课所写,并给出适当的扩展和相应的demo。 写博客跟做 checkpoint​ 很像,毕竟个人还不能达到那种信手拈来的境界,忘了就是从零开始训练&#xff0…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 (简单) 2.移除元素 (简单) 3.删除有序数组中的重复项 (简单) 4.删除有序数组中的重复项 II(中等) 5.多数元素(简单&am…

项目进度计划表:详细的甘特图的制作步骤

甘特图(Gantt chart),又称为横道图、条状图(Bar chart),是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特(Henry Laurence Gantt)发明,是一种通过条状图来…

netty之内存泄露检测

写在前面 本文看下netty内存泄露检测相关内容,当然,这里的内存泄露不是bytebuf对象本身,是bytebuf关联的堆外内存。 1:实战 我们还是使用netty源码的example模块的echo例子,但是我们需要对server的handler稍微做些改…

服务器上部署并启动 Go 语言框架 **GoZero** 的项目

要在服务器上部署并启动 Go 语言框架 **GoZero** 的项目,下面是一步步的操作指南: ### 1. 安装 Go 语言环境 首先,确保你的服务器上已安装 Go 语言。如果还没有安装,可以通过以下步骤进行安装: #### 1.1 安装 Go 语…

如何去掉el-input 中 type=“number“两侧的上下按键

<el-input v-model.trim"row.length" type"number" min"0" placeholder""></el-input> // 如何去掉el-input-number两侧的上下按键 ::v-deep input::-webkit-outer-spin-button, ::v-deep input::-webkit-inner-spin-butt…

前端注册代码

代码 <template><el-card class"register" style"max-width: 480px ; background-color: aliceblue;"><template #header><div class"card-header"><span>注册</span></div></template><el…

【第六课】Rust所有权系统(二)

目录 前言 借用和引用 借用规则 切片和迭代器 总结 前言 上节课介绍了Rust中的所有权系统&#xff0c;简单回顾一下&#xff0c;rust的内存系统系统&#xff0c;每一块内存都有一个主人&#xff0c;主人对这块内存有着读写和释放的权限&#xff0c;当主人离开作用域之后&am…

1024程序员节:永无bug

引言 每年的10月24日是程序员节。这一天不仅是程序员们的节日&#xff0c;更是对整个行业的庆祝与思考。在这个特殊的日子里&#xff0c;我们不仅回顾过去一年的成就与挑战&#xff0c;也展望未来的发展与机遇。本篇文章将围绕程序员节的主题&#xff0c;探讨前端技术的最新动…

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心&#xff0c;结合传感器技术、无线通信技…

Node.js | Yarn下载安装与环境配置

一、安装Node.js Yarn 是 Node.js 下的包管理工具&#xff0c;因此想要使用 Yarn 就必须先下载 Node.js。 推荐参考&#xff1a;Node.js | npm下载安装及环境配置教程 二、Yarn安装 打开cmd&#xff0c;输入以下命令&#xff1a; npm install -g yarn检查是否安装成功&…

【MySQL】MySQL在Centos环境安装

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; MySQL 目录 &#x1f308;前言&#x1f525;卸载不要的环境&#x1f525;检查系统安装包&#x1f525;卸载这些默认安装包&#x1f525;获取mysql官方yum源&#x1f525;安装mysql yum源…