【计网】从零开始理解TCP协议 --- 拥塞控制机制,延迟应答机制,捎带应答,面向字节流

news2024/10/22 2:55:26

在这里插入图片描述

时间就是性命。
无端的空耗别人的时间,
其实是无异于谋财害命的。
--- 鲁迅 ---

从零开始理解TCP协议

  • 1 拥塞控制
  • 2 延迟应答
  • 3 捎带应答
  • 4 面向字节流
  • 5 TCP异常情况
  • TCP小结

1 拥塞控制

尽管TCP拥有滑动窗口这一高效的数据传输机制,能够确保在对方接收能力下将大量数据可靠发送,但在通信初期若盲目发送大量数据,仍有可能触发网络问题。

当网络出现问题时,通过滑动窗口等机制是没有办法解决的。网络拥塞就是一种情况,网络中需要处理的数据太多了,导致十分堵塞,此时就需要拥塞控制进行管理!那么如何识别出来时网络出现问题呢?当出现了大量报文的丢失问题时,就可以大概率确定网络出现了严重的拥塞问题!

考虑到网络中众多计算机的交互,当前网络状态可能已经处于相对拥堵的状况。在不明确当前网络状况的前提下,大量数据的急速发送很可能加剧网络拥堵,造成“雪上加霜”的效应。

为此,TCP采用了慢启动机制,它首先发送少量的数据包,以此作为“探针”来感知和评估当前网络的拥堵程度。在此基础上,TCP会根据网络的实际状况,逐步调整数据传输的速度,确保数据传输的平稳与高效。这样才能更高效的进行处理! 此处引入一个概念:拥塞窗口

  • 每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口

通过拥塞窗口,可以保证传输的数据不会超出网络的承载能力,也能保证不会超出接收端的接收能力! 网络的状态是浮动的,拥塞窗口的大小也是浮动的!那么主机如何得知拥塞窗口的接近大小是多大呢?这个大小是通过尝试出来的,是一个经验数据!
在这里插入图片描述
发送开始的时候, 定义拥塞窗口大小为 1,接受到ACK时就通过指数规律进行增长,这就是慢启动窗口。指数在变量较大时会发生指数爆炸,所以就有慢启动的阈值!当拥塞窗口超过这个阈值的时候,会改为线性增长,避免造成拥塞!

  • 前期慢,可以慢慢减少网络发送,让网络发送
  • 网络恢复之后,我们的通信过程也要恢复起来,中期增速快,快速提高效率;后期慢线性增长,避免指数爆炸,同时可以准确找到拥塞的边界值!
  • 阈值也是可以动态调整的,可以根据网络拥塞的边界值调整慢启动算法的阈值!

网络中每个主机都使用这样的拥塞控制机制,遇到网络拥塞时,所有主机都调整窗口为1,然后同一个慢启动算法逐渐恢复,最终找到下一次拥塞的临界值,继续调整… 这样动态调节,保证网络传输的效率最大!

2 延迟应答

在发送方和接收方进行通信时,接收方的接收缓冲区收到了来自发送方的一批报文(滑动窗口机制),接收方收到第一个数据时,不会立刻进行ACK,会延迟一会再进行发送!这个延迟时间不会超过超时重传的时间。这个延迟一会,就能保证,向发送方的ACK可以是更大的接收窗口,通过滑动窗口算法,就能让下次并发发送的数据更多!

一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率!

那么所有的包都可以延迟应答么? 肯定也不是!

  • 数量限制: 每隔 N 个包就应答一次;
  • 时间限制: 超过最大延迟时间就应答一次;

具体的数量和超时时间,依操作系统不同也有差异。一般 N 取 2, 超时时间取 200ms。

延迟应答的效果再单台主机的通信中可能不明显,因为延迟的一会不一定会等到更大的接收窗口。但是网络中并不是只有一台主机!主机的数量是很多的,那么再小的概率,在如此大的基数中也是不容小觑的大小!所以延迟应答的效果在网络中是很棒的!

3 捎带应答

捎带应答(Piggybacking)是TCP协议中一种优化网络传输效率的机制。在TCP通信过程中,数据的发送方和接收方需要通过确认应答(ACK)来确保数据的可靠传输。捎带应答技术允许在数据传输的过程中,将确认应答信息“捎带”在数据包中一起发送,而不是单独发送一个ACK包!

通过我们对TCP报头结构的学习,捎带应答的本质就是在通过6位标志位:

  • URG:指示紧急指针字段是否有效,用于处理紧急数据。
  • ACK:确认号字段是否有效,用于确认已成功接收的数据。
  • PSH:提示接收端的应用程序应立即从TCP缓冲区中读取数据。
  • RST:要求对方重新建立连接,携带RST标志的报文段被称为复位报文段。
  • SYN:用于发起连接请求,携带SYN标志的报文段被称为同步报文段。
  • FIN:通知对方本端即将关闭连接,携带FIN标志的报文段被称为结束报文段。

每次传输的报文中,可以同时将多个标记位设置为1,那么这份报文就具有了多重含义!这样的传输策略大大提供了通信效率!

  1. 减少网络流量:由于不需要单独发送ACK包,因此可以减少网络上的数据包数量,降低网络负载。
  2. 提高网络利用率:通过减少数据包数量,网络带宽可以被更有效地利用。
  3. 降低延迟:减少了单独ACK包的传输,可以减少通信的往返时间(RTT)

注意,三次握手的最后一次是可以进行捎带数据的 !

4 面向字节流

创建一个 TCP 的 socket, 同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区。

  • 调用 write 时, 数据会先写入发送缓冲区中;
  • 如果发送的字节数太长, 会被拆分成多个 TCP 的数据包发出;
  • 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了,或者其他合适的时机发送出去;
  • 接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;
  • 然后应用程序可以调用 read 从接收缓冲区拿数据;
  • 另一方面, TCP 的一个连接, 既有发送缓冲区, 也有接收缓冲区,那么对于这一个连接, 既可以读数据, 也可以写数据。这个概念叫做 全双工

由于缓冲区的存在, TCP 程序的读和写不需要一一匹配, 例如:

  • 写 100 个字节数据时, 可以调用一次 write 写 100 个字节, 也可以调用 100 次write, 每次写一个字节;
  • 读 100 个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以一次read 100 个字节, 也可以一次 read 一个字节, 重复 100 次;

所以说TCP协议是面向字节流的,对方发送的数据不一定是一个完整的报文。发送的数据是对方操作系统从缓冲区中刷新过来的,也就是说这些数据是不确定的,不一定完整!

这种面向字节流的通信过程必然会有粘包问题:多个报文粘连在一起,无法区分!那么如何避免粘包问题呢? 归根结底就是一句话, 明确两个包之间的边界!

所以为了保证面向字节流的通信过程可以正常读取报文,就需要一些特殊处理,保证我们可以找到边界!之前在使用TCP进行Socket套接字编程时,通过设计报文为:"len"\r\n"{json}"\r\n 我们通过\r\n找到len报文长度,然后来判断是否有完整报文!

UDP协议中,有一个16位UDP长度。操作系统可以知道报文多长,一次性就能将整个完整报文发送出去!而在TCP中是没有TCP长度的!TCP是面向字节流的,不需要对长度进行处理!TCP协议不需要解决粘包问题,粘包问题是应用层需要解决的!TCP协议是通过字节流保证了通信的可靠性!

5 TCP异常情况

TCP在通信过程中如果发生异常怎么办?

  1. 进程终止: 进程终止会释放文件描述符,仍然可以发送 FIN。和正常关闭没有什么区别。我们测试的时候一般都是通过ctrl+c关闭服务端或客户端,这种就是进程终止,和正常关闭时一样的!操作系统会自动进行四次挥手
  2. 机器关机/重启: 机器关机/重启需要所有进程关闭才可以,所以这种情况和进程终止的情况相同。也会自动进行四次挥手!
  3. 机器掉电/网线断开: 这种情况下接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行 reset。即使没有写入操作,TCP协议内部设置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。生活中我们长时间挂载一个APP在后台也是同样的道理!

TCP小结

经过三篇文章的讲解,现在我们已经对TCP协议有了一个大概的了解!
TCP的可靠性通过:

  1. 16位校验和:确保数据不被修改
  2. 32位序列号/32位确认号:这两个字段用于管理TCP连接中的数据传输顺序,确保数据的有序交付!保证不会出现丢包问题
  3. 确认应答机制:通过应答机制,必要时进行重发,确保了数据一定可以被接收端接收
  4. 超时重传:长时间没有接受到应答,会触发超时重传机制,确保了数据一定可以被接收端接收
  5. 连接管理机制:三次握手保证了双方具有发送接收的能力,以及连接的意向!四次挥手保证了在双方都要断开连接时才断开连接!
  6. 流量控制机制:通过滑动窗口来保证发送的数据不会超出接收端的能力范畴!
  7. 拥塞控制机制:通过对网络状况的动态监测,避免发生网络拥塞,最大程度地保证网络通畅!

TCP中提高性能的机制也很多:

  1. 滑动窗口:并发的发送一批数据,与确认序号机制配合,大大提高发送效率!
  2. 快速重传:发送一批数据出现丢包问题时,快重传机制能够快速完成处理工作,不需要等待触发超时!
  3. 延迟应答:通过延迟一段时间,尽可能将更大的窗口大小通过ACK返回给发送端,提高并发发送的效率!
  4. 捎带应答: 合并多种属性的报文,减少使用网络流量,大大提高效率!

实际使用中如何选择TCP/UDP ?
我们说了 TCP 是可靠连接, 那么是不是 TCP 一定就优于 UDP 呢? TCP 和 UDP 之间的优点和缺点, 不能简单的,绝对的进行比较

  • TCP 用于可靠传输的情况,应用于文件传输,重要状态更新等场景。
  • UDP 用于对高速传输和实时性要求较高的通信领域,例如,早期的 QQ,视频传输等。另外 UDP 可以用于广播。

归根结底,TCP 和 UDP 都是程序员的工具,什么时机用,具体怎么用,还是要根据具体的需求场景去判定!!!

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

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

相关文章

基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili (一)简介 基于卷积神…

关于vue3中如何实现多个v-model的自定义组件

实现自定义组件<User v-model"userInfo" v-model:gender"gender"></User> User组件中更改数据可以同步更改父组件中的数据&#xff1a; 1 父组件&#xff1a; <User v-model"userInfo" v-model:gender"gender">&…

ROUGE:摘要自动评估软件包

算法解析 ROUGE&#xff08;Recall-Oriented Understudy for Gisting Evaluation&#xff09;是一组用于自动评估文本摘要质量的指标&#xff0c;主要通过比较机器生成的摘要与一个或多个参考摘要之间的重合程度来衡量。ROUGE 包括多个变体&#xff0c;其中最常用的有 ROUGE-N…

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

WebGoat SQL Injection (intro) 源码分析

首先了解 java 中 mysql 的连接&#xff1a;java连接Mysql WebGoat SQL Injection (intro) 10 根据提示&#xff1a;下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据 发现请求路径为 SqlInjection/assignment5b 定位到所在文件如下&#xff0c;根据代码…

基于递推式最小二乘法的PMSM参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 最小二乘法是一种回归估计法&#xff0c;适用于被辨识的参数与系统输出为线性关 系的情况。它是在一定数据量下&#xff0c;基于系统输出误差的平方和最小的准则对参 数进行辨识的方法。此模型通过…

使用Flask实现本机的模型部署

前言 模型部署是指将大模型运行在专属的计算资源上&#xff0c;使模型在独立的运行环境中高效、可靠地运行&#xff0c;并为业务应用提供推理服务。其目标是将机器学习模型应用于实际业务中&#xff0c;使最终用户或系统能够利用模型的输出&#xff0c;从而发挥其作用。 一、设…

unity 屏幕波动反馈打击效果(附资源下载)

unity 屏幕波动反馈打击效果 一枪打出去整个屏幕都回波动的效果反馈。 知识点&#xff1a; 1、动画事件 2、屏幕后处理 效果如图&#xff1a;&#xff08;波动速度浮动都可调整&#xff09; 附件下载

TH-OCR:高效的文字识别工具与护照阅读器的完美结合

在数字化的时代&#xff0c;高效准确的文字识别工具变得越来越重要。今天我要给大家介绍一下 TH-OCR。 TH-OCR 是一款功能强大的文字识别软件&#xff0c;它能够快速准确地识别各种文档中的文字&#xff0c;大大提高了工作效率。 而其中&#xff0c;TH-OCR 在护照阅读器方面的应…

Gitlab 完全卸载–亲测可行

1、停止gitlab gitlab-ctl stop2.卸载gitlab&#xff08;注意这里写的是gitlab-ce&#xff09; rpm -e gitlab-ce 3、查看gitlab进程 ps aux | grep gitlab 4、杀掉第一个进程&#xff08;就是带有好多.............的进程&#xff09; 5、删除所有包含gitlab文件 find / …

工业自动化为什么依赖光耦隔离器 --- 腾恩科技

光耦合器隔离器在工业自动化中必不可少&#xff0c;可确保信号传输&#xff0c;同时保护敏感电子设备和人员免受高压影响。选择合适的光耦合器隔离器取决于对操作环境和隔离要求的了解。本文将重点介绍在为工业应用选择光耦合器隔离器时需要考虑的关键因素。 光耦合器隔离器在工…

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

python获取当前鼠标位置的RGB值

效果 依赖 pip install Pillow pyautoguisudo apt install gnome-screenshot代码 import pyautogui import timedef get_rgb_at_mouse():try:while True:# 获取当前鼠标的位置x, y pyautogui.position()# 截取当前屏幕图像screenshot pyautogui.screenshot()# 获取鼠标位置…

【C语言备课课件】(下)指针pointer

目录 定义type *var_name;初始化int *p &a; // p指向变量a的地址 空指针NULL,野指针&#xff0c;指针悬挂 解引用指针的算术运算指针与数组 数组名—首指针二维数组指针 行指针列指针 多级指针&#xff08;进阶&#xff09;数组指针,指针数组&#xff08;进阶&#xff09…

ZYNQ:流水灯实验

实验目的 PL_LED0 和 PL_LED1 连接到 ZYNQ 的 PL 端&#xff0c;PL_LED0 和 PL_LED1循环往复产生流水灯的效果&#xff0c;流水间隔时间为 0.5s。 原理图 程序设计 本次实验是需要实现两个LED的循环熄灭点亮&#xff0c;时间间隔是0.5S,对时间间隔的控制使用计数器来完成。本…

改变函数调用上下文:apply与call方法详解及实例

目录 改变函数调用上下文&#xff1a;apply与call方法详解及实例 一、什么是 apply 方法&#xff1f; 1、apply 语法 2、apply 示例 二、什么是 call 方法&#xff1f; 1、call 语法 2、call 示例 三、apply 和 call 的共同与差异 1、apply 和 call 的共同点 2、apply…

一文读懂什么是数据即产品(Data as a Product,DaaP)

企业每天都要产生并消费大量数据&#xff0c;但如果这些数据一直保持在原始格式&#xff0c;就很难真正应用起来。因此&#xff0c;为了充分发挥数据的最大潜力&#xff0c;必须改变组织内部处理数据的方式。 “数据即产品”&#xff08;DaaP&#xff09;就是这样一种思维方式…

ERROR [internal] load metadata for docker.io/library/nginx:latest

docker执行错误解决方法 1、执行docker pull nginx2、docker build -t xxx:xx

RISC-V笔记——显式同步

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Explicit Synchronization(显示同步)。 2. 显示同步 显示同步指的是&#xff1a…

02篇 机械考研复试简历保姆级教程,考研简历联系导师邮件复试调剂超全攻略 导师喜欢看到的简历(附模板)

考研复试简历怎么写&#xff1f;导师喜欢看到的简历&#xff08;附模板&#xff09; 复试简历&#xff0c;重要程度max&#xff01;绝非小事一桩&#xff01;它就像是你硬核经历的闪亮外衣&#xff0c;条理清晰、逻辑严谨且设计感十足&#xff0c;一定能在导师心中留下深刻印象…