【计算机网络】TCP协议特点3

心跳机制
什么是心跳机制
心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制,用于检测两个实体之间的连接是否仍然活跃,或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端,服务端回复一个固定消息,如果服务端一段时间没有收到固定消息就自动断开连接
心跳机制有什么用
在长连接下 可能很长时间都没有数据往来,理论上说 这个连接是一直保持连接得 但实际情况 会因为什么故障什么的 难以维持连接,在这个时候 我们要知道 需要心跳包的 用于保持长时间连接 和保活
心跳机制怎么实现
1 应用层自己的心跳包
2 使用SO_KEEPALIVE 套接字选项
3 在一些硬件设备中,例如网络路由器,会有专门的芯片和电路来实现心跳机制
拥塞控制
算机网络领域中用于管理和防止网络拥塞的一系列机制
为什么要拥塞控制
1 网络中的链路容量和交换结点的缓存机制和处理机制都有工作极限 当网络需求超过它的工作极限时候 就会出现拥塞
2 在网络拥塞时候 如果继续发送大量数据包 肯会导致数据包时延 丢失等
3 这是TCP就会重传数据 但是这一重传会导致网络负担更重 于是导致更大时延以及更多丢包 这个情况会导致恶性循环不断放大

控制方法和触发机制
- 慢开始(Slow - Start)
- 原理:在连接建立初期,发送方会以一个较小的拥塞窗口开始发送数据,这个窗口大小通常初始化为 1 个或几个最大报文段长度(MSS)。然后,每次收到接收方的确认(ACK),拥塞窗口就会成倍增加。
- 目的:通过这种方式,发送方可以快速探测网络的可用带宽,同时避免一开始就向网络中注入过多的数据包而导致拥塞。
- 拥塞避免(Congestion Avoidance)
- 原理:当拥塞窗口增长到一定程度后,发送方进入拥塞避免阶段。在这个阶段,拥塞窗口不再成倍增长,而是每次收到一个 ACK 后,cwnd 增加 1MSS。这类似于在发现事情进展比较顺利后,开始放慢扩张的速度,更加谨慎地前进,以防止过度扩张导致问题。
- 目的:这种线性增长方式可以使发送方更加平稳地利用网络带宽,避免过快地占用网络资源而引发拥塞。
- 快速重传(Fast Retransmit)
- 原理:当接收方收到乱序的数据包时,会立即发送重复的 ACK,告知发送方期望收到的数据包序列号。如果发送方收到三个或更多连续的重复 ACK,就会认为相应的数据包丢失了,然后立即重传该数据包,而不需要等待超时定时器(RTO)到期。
- 目的:这种机制可以快速恢复丢失的数据包,减少数据传输的延迟,因为等待 RTO 到期的时间通常比收到三个重复 ACK 的时间长。
- 快速恢复(Fast Recovery)
- 原理:在快速重传之后,发送方会进入快速恢复阶段。此时,发送方会将拥塞窗口减半(cwnd = cwnd/2),同时将慢启动阈值设置为当前拥塞窗口的值。
- 目的:快速恢复机制使得发送方可以在数据包丢失后,尽快地调整发送策略,恢复数据传输,同时避免过度降低发送速率,以保持网络的利用率。
实现方式
端到端(End - to - End)拥塞控制
- 这是一种在传输层(如 TCP 协议)实现的拥塞控制方式。发送端根据从接收端反馈的信息(如 ACK)来调整发送策略。
网络辅助(Network - Assisted)拥塞控制
- 这种方式是由网络中的路由器等设备参与拥塞控制。路由器可以监测经过它的数据包流量,当发现拥塞迹象时,向发送端发送拥塞反馈信息。
Nagle算法
为了发送大数据块 避免网络拥塞许多小数据块
什么是Nagle算法
Nagle 算法是一种用于网络拥塞控制的算法,主要应用在 TCP 协议中。它的目的是减少网络中因频繁发送小数据包而导致的带宽浪费和网络拥塞
运输相同数量的人 利用出租车 和大客车 大客车数量少更不容易造成拥堵
所以再传输数据时候 利用路由器 再每个包里存放数量越大 包个数越少 传递速度越快
Nalge算法也是TCP发送端产生粘包问题主要原因
算法规则
1 如果包长度达到mss(最大报文长度)则允许发送
2 如果该包含FIN则允许发送
3 设置TCP_NODELAY选项允许发送
4 未设置TCP_CORK选项(网络比较通畅)时 则所有发送出去的最小数据包小于mss长度
5 上述条件都未满足时候 但发生超时(一般200ms)则立即发送
Nagle算法是默认打开的
Nagle算法是默认打开的 如果对应一些需要小数据包交互场景程序 比如talent ssh这样交互性比较强的程序 则需要关闭Nagle算法
TCP特有功能
1 RTT 往返时延
往返时延(RTT)是指从发送端发送数据开始,到发送端收到来自接收端的确认(ACK)所经历的时间。它是计算机网络性能评估中的一个重要指标
RTT决定三部分
1 链路传播时间
2 末端系统处理时间
3 路由器缓存和排队时间和处理时间
2 RTO 超时重传
RTO即超时重传时间,是指在 TCP(协议中,发送端在发送数据后等待接收端确认(ACK)的最长时间。如果在这个时间内没有收到 ACK,发送端就会认为数据包丢失,从而进行重传。这是一种保障数据可靠传输的机制
TCP发送一个报文段 就对此报文段设置一个超时重传计时器 这个计时器设置超时重传时间应当略大于TCP报文段平均往返时延PTO=2RTT
影响因素
网络拥塞程度:当网络拥塞严重时,数据包的传输延迟会增加,往返时延(RTT)也会随之增大。
链路质量和稳定性:链路的质量差(如信号干扰大、带宽不足等)或者稳定性差(如频繁断连)会影响 RTT 的测量,从而影响 RTO 的计算。
接收端和发送端的处理能力:如果接收端或发送端的处理速度慢,例如接收端处理数据包的速度跟不上接收速度,可能会导致 ACK 返回延迟,使得发送端误认为数据包丢失而触发 RTO。
可以根据实时 情况调整RTO
3 累计应答
1 累计几个data包一起回复ack效率高
2 累计几个和滑动窗口TCP有关
3 ack=4001代表seq=4000之前数据都接收成功
优点
减少网络开销:通过累计应答,可以减少确认消息的数量。如果对每个数据包都单独发送确认,在网络中会产生大量的确认消息,占用网络带宽和设备资源。而累计应答机制使得确认消息的数量与按序接收的数据包组数量相对应,有效降低了网络中的信令开销。
提高确认效率:这种机制与发送方的发送策略(如滑动窗口机制)配合良好。发送方可以根据累计确认来判断接收方的接收情况,快速了解哪些数据包已经被成功接收,哪些可能丢失或延迟。
4 滑动窗口
- 滑动窗口(Sliding Window)是一种流量控制和可靠传输的机制,主要应用于传输协议(如 TCP 协议)中。它允许发送方在未收到接收方确认的情况下,连续发送多个数据包,这些数据包的数量由窗口大小决定。
- 可以将滑动窗口想象成一个有固定容量的管道。发送方在这个管道中填充数据包发送给接收方,接收方从管道的另一端接收数据包并进行处理。窗口大小就代表了这个管道的容量,它决定了发送方一次最多能发送多少个数据包。
优点
- 流量控制:通过接收方窗口大小的反馈,滑动窗口机制能够有效地控制发送方的发送速率,使其与接收方的接收能力相匹配。这样可以避免接收方因为来不及处理过多的数据包而导致数据丢失或性能下降。
- 提高传输效率:与逐个发送数据包并等待确认的方式相比,滑动窗口允许发送方在等待确认的同时发送多个数据包,大大提高了数据传输的效率。特别是在网络延迟较高的情况下,滑动窗口机制可以充分利用等待确认的时间来发送更多的数据包,减少了传输时间。
- 可靠传输:结合累计应答机制,滑动窗口能够确保数据的可靠传输。发送方可以根据接收方的确认消息准确地判断哪些数据包已经被成功接收,哪些需要重传。
有了窗口 可以指定窗口大小 。
窗口大小每到达最大限度等待应答,可以继续发送到数据最大值。
相关文章:
【计算机网络】TCP协议特点3
心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制,用于检测两个实体之间的连接是否仍然活跃,或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端,服务端回复一个固定…...
移植LVGL8.2以及移植过程的理解
一、LVGL刷新显示(画点 OR 区域刷新颜色) 原来LCD的区域填充,由于没用到DMA就是普通的遍历区域块的坐标,需要传入的坐标就是显示区域的x轴起始与x轴尾部。y轴的起始与y轴的尾部。 怎么实现呢? SPI不加DMA实现区域填充…...
动态规划-背包问题——1049.最后一块石头的重量II
1.题目解析 题目来源 1049.最后一块石头的重量II——力扣 测试用例 2.算法原理 首先需要将该问题转化为0-1背包问题后再做分析 1.状态表示 根据数学中的知识我们知道将一个数字分为两个子数后求这两个子数的最小差值,那么就要求这两个子数尽可能接近于原数字的一…...
【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?
并发性模式(如生产者-消费者、读写锁等)和架构模式(如 MVC、MVVM 等)并不属于 Gang of Four(GoF) 提出的 23 种经典设计模式 中。这些模式是其他领域中的设计模式,虽然它们和 GoF 的设计模式有交集,尤其是在程序架构和资源管理方面,但并不直接包含在 GoF 的 23 种设计…...
[Mysql] Mysql的多表查询----多表关系(下)
4、操作 方式二:创建表之后设置外键约束 外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。 语法: alter table <从表名> add constr…...
命名空间(namespace)详解(一)
域 在学习命名空间之前,我们首先要了解几种常见的域 一、域的种类 1、类作用域 类作用域是指定义在类内部的成员(包括数据成员和成员函数)的可见性和访问权限的范围 代码示例: #define _CRT_SECURE_NO_WARNINGS 1#include &…...
HarmonyOS ArkTs 解决流式传输编码问题
工作日志 日期:2024-11-15 标题:HarmonyOS ArkTs 解决流式传输编码问题 问题描述 问题:在处理流式数据的 HTTP 请求时,服务器返回的数据存在编码问题,导致数据无法正确地解码为字符串。部分数据在解码后出现了乱码…...
NPOI 实现Excel模板导出
记录一下使用NPOI实现定制的Excel导出模板,已下实现需求及主要逻辑 所需Json数据 对应参数 List<PurQuoteExportDataCrInput> listData [{"ItemName": "电缆VV3*162*10","Spec": "电缆VV3*162*10","Uom":…...
【OpenGL】OpenGL简介
文章目录 OpenGL概述OpenGL的本质OpenGL相关库核心库窗口管理glutfreeglutglfw 函数加载glewGLAD OpenGL概述 OpenGL(Open Graphics Library) 严格来说,本身并不是一个API,它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了…...
shell命令笔记
一、shell基本基础知识 1. shell命令中捕获上一个命令执行是否成功,通过判断 $? 是否为0,为0则表示成功,其他错误码则表示执行失败。 2. sheel命令中,变量赋值时默认都是字符串类型。赋值时须注意单引号与双引号的区别…...
qml显示OpenCV mat图片
文章目录 方式一QQuickPaintedItem 类介绍主要特点使用方法示例代码在 QML 中使用主要方法和属性注意事项编写OpenCV mat显示代码方式二本篇博客介绍在Qt6.5.3 qml项目里介绍如何显示OpenCV mat图片。视频:https://edu.csdn.net/learn/40003/654043?spm=3001.4143 在qml里显示…...
类与对象(2)---类的6个默认成员函数
1.类的6个默认成员函数 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 2.构造函数 2.1构造函数特性 构造函数的主要任务是初始化对象。 它有如下特…...
华为云租户网络-用的是隧道技术
1.验证租户网络是vxlan 2.验证用OVS 2.1控制节点VXLAN 本端ip(local ip)192.168.31.8 2.2计算节点VXLAN 本端ip(local ip)192.168.31.11 计算节点用的是bond0做隧道网络 2.3查看bond文件是否主备模式...
手搓神经网络(MLP)解决MNIST手写数字识别问题 | 数学推导+代码实现 | 仅用numpy,tensor和torch基本计算 | 含正反向传播数学推导
手写数字识别(神经网络入门) 文章目录 手写数字识别(神经网络入门)实验概述实验过程数据准备模型实现线性变换层前向传播反向传播更新参数整体实现 激活函数层(ReLU)前向传播反向传播整体实现 Softmax层&am…...
esp32c3安装micropython环境
esp32c3竟然支持micropython环境,真的太让人高兴了。主要是python开发比较友好,开发速度要快于C和C, 可以用来快速创意验证。 下载 首先到官网:MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…...
ES6的Iterator 和 for...of 循环
写在前面 在JavaScript中,Iterator(遍历器)是一种接口,用于遍历数据结构(如数组、对象等)中的元素。它提供了一种统一的方式来访问集合中的每个项,包括值和位置。 默认 Iterator 接口 许多内…...
《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义
文章目录 助记提要7章 基本类型7.1 整数类型有符号整数和无符号整数整数类型的说明符整数类型的范围整型常量整数溢出读/写整数 7.2 浮点类型浮点数的范围浮点常量读/写浮点数 7.3 字符类型字符被当做整数来操作转义序列大小写转换scanf和printf读/写字符getchar和putchar读写字…...
MySQL(4)【数据类型 —— 数值类型】
阅读导航 引言一、数据类型分类二、数值类型取值范围三、tinyint 类型1. 💻数值越界测试⭕有符号案例⭕无符号案例 四、bit 类型1. 基本语法2. 使用示例✅创建表并插入数据✅使用 BIT 存储多个设置✅查询和格式化 BIT 数据✅更新 BIT 数据 五、小数类型1. float&…...
Golang超详细入门教程
Golang超详细入门教程 部分图片可能加载不出来,所以这里我上传到了自己的个人网站上也可以查看:http://dahua.bloggo.chat/testimonials/490.html 一、数据类型转换 C语言中数据可以隐式转换或显示转换, 但是Go语言中数据只能显示转换格式: 数据类型(…...
鸿蒙NEXT自定义组件:太极Loading
【引言】(完整代码在最后面) 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件,为你的应用增添独特的视觉效果。 【环境准备】 电脑系统:windows 10 开发工具:DevEco Studio NEXT Beta1 Build Vers…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
