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异常情况(心跳包)

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

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

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

相关文章

深入浅出微前端架构

微前端(Micro-frontends)是一种设计思想,旨在将大型前端应用分解成小的、独立的、可复用的部分,每个部分都有自己独立的责任域。这种架构模式借鉴了微服务的理念,将其应用于前端开发,使得不同的团队可以独立…

私域流量优化:如何利用 AIPL 模型洞察客户生命周期价值

在当今这个数字化时代,商业战场的硝烟从未如此浓烈。随着互联网红利的逐渐消退,公域流量的成本水涨船高,企业间对于有限用户资源的争夺已进入白热化阶段。每一次点击、每一个曝光背后,都是企业不得不承担的高昂代价。在此背景下&a…

【前端】JS对象与JSON的区别

文章目录 虽然看着没啥区别 // js 对象 {name: "longxing",age: 64, } // json {"name": "longxing","age": 64, }但其实还是有的 1. JSON的属性名必须有双引号,而js对象可以不用 2. 属性值为字符串时,JSON只…

Linux内存管理——Swap

swap space 一个磁盘区域,作为内存使用。当系统内存不足时,会将一些很久不使用的数据转移到swap space中。 优点:扩展了内存空间 缺点:用磁盘做内存,读写效率降低。 swappiness swappiness的值表示建议swap space替…

用Rust解决鸡兔同笼问题

目录 一、什么是鸡兔同笼问题? 二、用Rust解决鸡兔同笼问题 三、鸡兔同笼问题在实际生活中的应用有哪些? 一、什么是鸡兔同笼问题? 鸡兔同笼问题是一种古代著名的数学问题,用于训练逻辑思维和解决方程的能力。 鸡兔同笼问题起…

VxTerm:C++很简单实现一个按给定区间返回随机数

#include <random>long Rand(const long pMin, const long pMax) {random_device rd; mt19937 gen(rd()); uniform_int_distribution<> distr(pMin, pMax); return distr(gen); } 代码是自己写的&#xff0c;在VxTerm中使用&#xff0c;未发现问题。 但在网上…

【MongoDB】安装与使用

前两篇文章介绍了前端vuevite&#xff0c;后端fastapi&#xff0c;这篇文章为项目搭建数据库。数据库选用MongoDB。如果你还没看过前两篇&#xff0c;你可以去看一下&#xff1a; 【Vue】搭建第一个vue3vite前段项目 【fastapi】搭建第一个fastapi后端项目 选择版本 官网最新…

pythonsql-随机问答小程序

随机问答-python&sql 智力问答测试&#xff0c;在答题过程中对做对、做错进行实时跟踪&#xff0c;测试完成后能根据玩家的答题情况给出成绩。 1. 设计思路 程序使用了一个SQLite试题库test.db&#xff0c;其中每个智力问答山题目、4个选项*1-1正确答案组成(question, An…

AndroidStudio Maven库下载400失败的问题

案例1: Could not GET https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.7.21/kotlin-gradle-plugin-1.7.21.pom. Received status code 400 from server: Bad Reques问题描述&#xff1a; 上面案例只是一种场景&#xff0c;只要是maven下…

速盾:服务器cdn加速的具体实现方式?

CDN&#xff08;Content Delivery Network&#xff09;即内容分发网络&#xff0c;是一种通过分布在各个地理位置的边缘节点服务器来缓存和传输网络内容的技术。CDN的主要目标是提高用户访问网站的速度和性能&#xff0c;并减轻源服务器的负载。 CDN加速是通过以下几个步骤来实…

day-32 不同路径 II

思路 典型的DP问题&#xff0c;状态转换方程为dp[i][j]dp[i-1][j]dp[i][j-1],边界情况单独讨论 解题方法 对于第一行&#xff1a;如果当前元素为0且在该元素的同一行的左边不存在1&#xff0c;则路径数皆为1&#xff0c;否则为零 对于第一列&#xff1a;如果当前元素为0且在该…

CSP-j 计算机硬件

计算机系统 计算机系统由计算机硬件和软件两部分组成。硬件包括中央处理器、存储器和外部设备等&#xff1b;软件是计算机的运行程序和相应的文档。计算机系统具有接收和存储信息、按程序快速计算和判断并输出处理结果等功能。 主要技术指标 字长&#xff1a;字长是指CPU能够同…

GO 使用get请求数据

使用 Go 语言发送 GET 请求到第三方接口相对简单。你可以使用 Go 标准库中的 net/http 包来实现这一操作。以下是一个基本的示例代码&#xff1a; package mainimport ("fmt""io/ioutil""net/http" )func main() {// 定义第三方接口的URLapiURL…

CloudCompare 二次开发(32)——点云多尺度格网坡度滤波

目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare与Eigen编程实现的点云多尺度格网坡度滤波。具体计算原理见:【论文复现】——基于多尺度虚拟网格与坡度阈值的机载LiDAR 点云滤波方法,此外,代码中还加入了多线程加速处理。 二、代码集成 1、mainwindow.h…

【Git实战】如何将本地仓库推送至Github(windows版)?

最近使用Go语言开发项目&#xff0c;想寻找位操作相关的工具包。找了一圈没有合适的&#xff0c;因此自己写了一个。又想将其推送到Github上&#xff0c;中间逢山开路&#xff0c;遇水搭桥&#xff0c;终于成功将本地Git仓库和Github进行了关联。现将我的方法公之于众&#xff…

docker资源限额

多数的应⽤场景要对Docker容器的运⾏内存进⾏限制&#xff0c;防⽌其使⽤过多的内存。 格式&#xff1a;-m或--memory 正常的内存大小 [rootadmin ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

RUST编程语言入门基础2024

庄晓立&#xff0c;2024年3月。 Rust简介 A language empowering everyone to build reliable and efficient software. Rust编程语言赋能所有人开发高可靠且高性能的软件。 性能 Rust is blazingly fast and memory-efficient: with no runtime or garbage collector, it can…

vue 自定义事件和子组件方法调用

举例说明了vue开发中&#xff0c;一个子组件需要响应另一个子组件事件的方法。 1自定义事件 显示声明事件 //.vue <script setup>defineEmits([search, cancel]) </script>使用方法1&#xff1a;在js代码中 function buttonClick() {emit(search) }使用方法2&a…

【0day漏洞复现】中移铁通禹路由器信息泄露漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

汇凯金业:白银价格下跌的原因有哪些

白银价格的下跌可能由多种因素引起&#xff0c;包括宏观经济因素、市场供需关系、货币政策以及投资者情绪等。以下是一些可能导致白银价格下跌的原因&#xff1a; 宏观经济状况改善&#xff1a;经济状况好转通常会减少对白银作为避险资产的需求。例如&#xff0c;经济增长加速…