TCP的特性(4)

TCP特性

  • 拥塞控制(可靠性机制)
  • 延迟应答(效率机制)
  • 捎带应答(效率机制)
  • 面向字节流(粘包问题)
  • TCP异常机制
  • 小结

拥塞控制(可靠性机制)

虽然TCP引入了滑动窗口,能够高效可靠的传输大量数据,但是在开始阶段就发送大量数据,可能引起一系列问题.
TCP引入了慢启动机制,先发少量的数据,判断当前的网络拥堵状态后,再决定按照多大的速度传输数据.
“拥塞窗口”: 在拥塞控制机制下,采用的窗口大小.

  1. 慢启动: 刚开始进行通信时,会使用非常小的窗口,探探路.
  2. 指数增长: 在传输通畅的条件下,拥塞窗口会指数型增长.
  3. 线性增长: 当指数增长到一个阈值后,就会从指数增长转变为线性增长.
  4. 拥塞窗口回归小窗口: 在窗口增大的过程中,如果传输出现丢包,认为当前网络出现拥堵了,
    此时就会把窗口大小调整为最初的小窗口,继续进行指数增长->线性增长的过程,会根据刚才
    丢包的窗口大小,调整阈值.

在这里插入图片描述

当出现网络拥堵(丢包)后,把丢包窗口大小 / 2变为新的阈值,拥塞窗口就是在这个过程不断发生变化,
在权衡之下,我们实际发送的窗口大小为 = min(拥塞窗口, 流量控制窗口).
拥塞控制和流量控制共同限制了滑动窗口机制,可以使滑动窗口在保证可靠性的前提下,提升效率了.

延迟应答(效率机制)

我们是否有办法在条件允许的基础上,尽可能的提高窗口大小呢?
延迟应答就向我们挥手了, 可以在接收方返回ACK的事后,拖延一下,利用拖延的时间尽可能的消费接收缓冲区的数据,这样接收缓冲区剩下的空间就会更大了.
通过延迟应答的方式,提高的速度取决于接收方实际的处理数据的能力,如果在拖延的时间里你还是没有处理更多数据,那么延迟应答带来的提升就会很小.

也不是所有的包都会出发延迟应答:

  1. 滑动窗口(数量限制): 每隔N个包就应答一次.
  2. 非滑动窗口(时间限制): 超过最大延迟时间就应答一次.

捎带应答(效率机制)

在延迟应答的基础上,引入了进一步提升效率的方式.
延迟应答: 让ACK传输的更慢.
捎带应答: 基于延迟应答,使数据合并

这是没有捎带应答的方式:

在这里插入图片描述
这是带有捎带应答的方式:
在这里插入图片描述

加入捎带应答后,两条效用合并了,这也是四次挥手也可能是三次的原因,主要是捎带应答和延迟应答起到的效果.

面向字节流(粘包问题)

这里用一个经典问题(“粘包问题”).包: 应用层数据报
发送方可以一次性发送很多应用层数据报,但是在接收的时候,如何区分呢?

此时不是传输层的问题,而是站在应用层的角度解决这个问题:

  1. 应用层协议中,引入分隔符,区分包的边界.
    在这里插入图片描述

接收方就可以按照\n区分应用层数据报的边界了.

  1. 应用层协议中,引入包长度,区分包的边界.

在这里插入图片描述

根据长度读取数据.
粘包问题不仅仅是TCP独有的,面向字节流机制的都用同样的问题,就可以引入分隔符和长度来解决.
xml / json是根据分隔符来区分的,protobuffer是根据长度来区分的.

TCP异常机制

  1. 进程崩溃:
    进程结束 -> PCB没了 -> 文件描述符表释放了 == socket.close().
    崩溃的一方会发出FIN -> 四次挥手 -> 连接正常释放了.
  2. 主机关机:
    正常关机后,会尝试终止所有进程,和进程崩溃时一样的处理结果.但是当接收方的FIN发过来是,请求方已经关机了,接收方收不到ACK就会重传FIN,连续尝试几次后都没有收到ACK,就单方面释放了.
  3. 拔掉电源:
  • 接收方正给发送方发消息:
    接收方收不到ACK就会重传FIN,连续尝试几次后都没有收到ACK,就单方面释放了.
  • 发送方正给接收方发消息:
    接收方在等待发送方的消息,至于等多久我们是不知道的,这里就涉及到心跳包.
    虽然是接收方,长时间收不到数据,也会周期性的给发送方发一个不带任何业务的TCP数据报,就是为了确认发送方是否正常工作/确认网络是否畅通.
  1. 网线断开:

此时发送方和接收方就无法通信了,有两种情况
如果是发送方断了,就是拔掉电源的接收方正给发送方发消息的情况.
如果是接收方断了,就是拔掉电源的发送方正给接收方发消息的情况.

小结

结合前面几篇博客,一共总结了TCP特性中的10个.

  1. 确认应答(可靠性核心机制)
  2. 超时重传(可靠性机制)
  3. 三次握手和四次挥手(可靠性机制)
  4. 滑动窗口(效率机制)
  5. 流量控制(可靠性机制)
  6. 拥塞控制(可靠性机制)
  7. 延迟应答(效率机制)
  8. 捎带应答(效率机制)
  9. 面向字节流(粘包问题)
  10. TCP异常情况(心跳包)

希望有收获的小伙伴多多支持!

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

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

相关文章

PDF Shaper Ultimate 免安装中文破姐版 v14.1

软件介绍 PDF Shaper是一套完整的多功能PDF编辑工具,可实现最高的生产力和文档安全性。它允许你分割,合并,水印,署名,优化,转换,加密和解密您的PDF文件,也可插入和移动页&#xff0…

RabbitMQ知识点总结和复习

之前项目中用到RabbitMQ的场景主要是订单信息的传递,还有就是利用RabbitMQ的死信队列属性设置,实现延迟队列效果,实现超时支付取消功能,以及在两个不同项目中传递数据等场景。 最近几年的工作中都是一直用的RabbitMQ,…

【C++】深入剖析C++11 initializer_list 新的类功能 可变模板参数

目录 一、std::initializer_list 1、std::initializer_list是什么类型 2、std::initializer_list 的应用场景 ①给自定义容器赋值 ② 传递同类型的数据集合 二、新的类功能 1、默认成员函数 2、关键字default 3、关键字delete 三、可变参数模板 一、std::initialize…

关于Linux的“三十年河东,三十年河西”的思考

目录 一、何为“三十年河东,三十年河西”? 二、Linux系统的发展历程简介 三、Linux家族 四、Linux发展分支 五、关于对Linux发展的回顾 一、何为“三十年河东,三十年河西”? “三十年河东,三十年河西”原义是三十…

OpenWRT有线桥接部署教程

前言 之前咱们讲到OpenWRT部署WAN实现PPPoE拨号上网和自动获取IP模式上网的办法: OpenWRT设置PPPoE拨号教程 OpenWRT设置自动获取IP,作为二级路由器 这一次,咱们尝试用OpenWRT有线桥接上一级路由器的教程。 可能有小伙伴敏锐地发现了&am…

20232803 2023-2024-2 《网络攻防实践》实践八报告

目录 1. 实践内容2. 实践过程2.1 动手实践任务一2.2 动手实践任务二:分析Crackme程序2.2.1 crackme1.exe2.2.2 crackme2.exe 2.3 分析实践任务一2.4 分析实践任务二 3. 学习中遇到的问题及解决4. 学习感悟、思考等 1. 实践内容 动手实践任务一:对提供的r…

【Python编程实践1/3】模块

目录 目标 模块 import ​编辑 代码小结 题目 from...import 随机模块 代码小结 randint函数 骰子大战 choice函数 总结 目标 拧一颗螺丝,只会用到螺丝刀;但是修一台汽车,需要一整套汽修的工具。函数就像螺丝刀,可以帮…

Go实战训练之Web Server 与路由树

Server & 路由树 Server Web 核心 对于一个 Web 框架,至少要提供三个抽象: Server:代表服务器的抽象Context:表示上下文的抽象路由树 Server 从特性上来说,至少要提供三部分功能: 生命周期控制&…

FIFO Generate IP核使用——Native读写接口信号详解

Native FIFO接口信号是用于FIFO IP核与外部电路进行通信的信号。当FIFO支持独立的写和读时钟时,这些信号可以包括标准端口和可选端口。 1 当FIFO具有独立时钟时的接口信号 当FIFO具有独立的时钟时,其接口信号会相应地有所变化。特别是关于复位信号rst…

Hibernate入门学习

目录 1、ORM思想概述 2、自定义ORM框架 3、第一个Hibernate程序开发步骤(重要) 1)下载完整包 2)创建项目,导入所需jar包 3)建立student表 4)创建和student表对应的Student实体类 5&…

postman中百度preview无法加载的解决方案

问题 在使用postman关联时,百度接口与天气接口已使用glb_city关联,但在百度接口发送请求时,发现preview无法加载 解决方案 1、进入百度 百度全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中…

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建(推荐)vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

11个2024年热门的AI编码助手

大家好,人工智能(AI)领域的大型语言模型(LLMs)已经逐渐发展成熟,并且深入到了我们日常的工作当中。在众多AI应用中,编码助手尤为突出,是开发人员编写更高效、准确无误代码的必备辅助…

docker原理

Docker原理 在前面我们学习了Docker,接下来我们探究一下Docker的底层技术原理 Linux 命名空间(namespace)、控制组(cgroups)和 联合文件系统(UnionFS) 三大技术支撑了目前 Docker 的实现&…

STM32入门学习之DMA

1.直接存储访问DMA(Direct Memory Access):DMA传输不需要CPU的参与,直接在内存和I/O设备间开辟了一条新的数据传输通道,不仅提高数据传输的速率,还因为不需要CPU的干预,从而提高了CPU的利用率。(注:文中的资…

OpenCV如何在图像中寻找轮廓(60)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何模板匹配(59) 下一篇 :OpenCV检测凸包(61) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::findContours使用 OpenCV 函数 cv::d rawContours …

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过…

英语语法动词和动词的虚拟语气

动词 谓语动词的三大功能:时、态、气 1、时 和 态 的组合构成了英语的 16 种时态。 2、气 表示的是动作的情感和假设。

uboot-网络配置

文章目录 一、网络简介二、修改PHY芯片地址三、删除 uboot 中 74LV595 的驱动代码1.删除宏定义,添加ENET1和ENET2复位引脚,宏定义2.删除内容如下 四、添加 I.MX6U-ALPHA 开发板网络复位引脚驱动 一、网络简介 💦I.MX6UL/ULL 内部有个以太网 …