【计算机网络笔记】传输层——TCP的可靠数据传输

系列文章目录

什么是计算机网络?
什么是网络协议?
计算机网络的结构
数据交换之电路交换
数据交换之报文交换和分组交换
分组交换 vs 电路交换
计算机网络性能(1)——速率、带宽、延迟
计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
计算机网络体系结构概念
OSI参考模型基本概念
OSI参考模型中非端-端层(物理层、数据链路层、网络层)功能介绍
OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍
TCP/IP参考模型基本概念,包括五层参考模型
网络应用的体系结构
网络应用进程通信
网络应用对传输服务的需求
Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)
Cookie技术
Web缓存/代理服务器技术
传输层服务概述、传输层 vs. 网络层
传输层——多路复用和多路分用
传输层——UDP简介
传输层——可靠数据传输原理之Rdt协议
传输层——可靠数据传输之流水线机制与滑动窗口协议
传输层——TCP特点与段结构


  • 系列文章目录
  • TCP的可靠数据传输
  • RTT和超时
  • TCP发送方要处理的事件
  • TCP接收方如何生成ACK
  • 快速重传机制
  • TCP流量控制机制


TCP的可靠数据传输

前面学习了可靠数据传输的原理,而TCP是要提供可靠数据传输服务的,那我们下面来看下TCP运用了哪些前面学过的原理、TCP的可靠数据传输是怎样实现的。

概括地来看:

  • TCP 在IP层提供的不可靠服务基础上实现可靠数据传输服务
  • 使用流水线机制,以便提高性能
  • 使用累积确认
  • 使用单一重传定时器
  • 触发重传的事件有:超时、收到重复ACK

我们在这里暂时不考虑重复ACK、拥塞控制、流量控制对可靠数据传输带来的影响。所以并不完整。

RTT和超时

要想处理丢失,就要设置定时器的超时时间,那这个时间多少是合理的?

我们有个重要的参考指标可以利用,那就是RTT,首先是要大于RTT。但是RTT是变化的,若超时时间过短可能造成不必要的重传, 若过长则可能对段丢失时间反应慢。

那首先要计算/估计RTT:使用SampleRTT测量对段丢失时间反应慢从段发出去 到收到ACK的时间。在这个过程中要忽略重传。为了更准确,我们测量多个SampleRTT,求平均值 ,形成RTT的估计值EstimatedRTT。使用一种指数加权移动平均的方法。阿尔法的典型值是0.125。

在这里插入图片描述

定时器超时时间的设置:EstimatedRTT + “安全边界“。若EstimatedRTT变化大,那就要加一个较大的边界。那我们继续测量RTT的变化值:,计算SampleRTT 与EstimatedRTT的差值,然后得到DevRTT。

在这里插入图片描述

然后就可以设置定时器超时时间:

在这里插入图片描述

TCP发送方要处理的事件

  • 从应用层收到数据

    • 创建Segment,序列号是Segment第一个字节 的编号
    • 开启计时器,设置超时时间TimeOutInterval
  • 如果超时

    • 重传引起超时的那一个Segment(这一点和SR一样)
    • 重启定时器
  • 收到ACK

    • 如果确认此前未确认的Segment,就滑动窗口,更新SendBase。如果窗口中还有未被确认的分组,重新启动定时器

上面的过程写成伪代码如下:

在这里插入图片描述

TCP接收方如何生成ACK

在这里插入图片描述

快速重传机制

TCP的实现中,如果发生超时,超时时间间隔将重新设置,也就是将超时时间间隔加倍,导致其很大。

可以通过重复ACK检测分组丢失。如果发送方收到对同一数据的 3 个ACK,则假定该数据之后 的段已经丢失,那就要执行快速重传机制,即在定时器超时之前就重传。

TCP流量控制机制

接收方会为TCP连接分配buffer。如果发送方传输的数据过快或过多的话,可能导致buffer溢出,这时可能会淹没接收方。所以流量控制的基本思想是发送方不会传输的太多 、太快以至于淹没接收方(buffer溢出)

所以本质上流量控制机制就是速度匹配机制

大概实现是这样的:

  • 接收方在段的头部字段将RcvWindow告诉接收方,告诉接收方自己还能接收多少字节的数据。发送方就会限制自己已经发 送的但还未收到ACK 的 数据不超过接收方的空闲RcvWindow尺寸。

那如果Receiver告知Sender RcvWindow=0,那么发送方就不再发了,那如果接收方又可以接收数据的话,发送方也还是不知道可以发送数据,这就可能导致死锁。所以要增加一个额外的处理,即使是RcvWindow=0的情况下,发送方仍然可以发送一个很小的段,从而从接收方带回来一个新的RcvWindow信息,避免发生死锁

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

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

相关文章

【npm run dev 报错:error:0308010C:digital envelope routines::unsupported】

问题原因: nodejs版本太高(nodejs v17版本发布了openSSL3.0对短发和密钥大小增加了更为严格的限制,nodejs v17之前版本没有影响,但之后的版本会出现这个错误,物品的node版本是20.9.0) 解决方式&#xff1…

搜维尔科技:网球运动员使用Xsens寻求精确的动作捕捉

就像其他一些运动一样,近年来网球迷们没有机会去参加许多真正优秀的模拟游戏,所以当一个人出现并承诺有这种体验时,很难不激动。开发者圆环游戏 匹配点:网球锦标赛 现在,我们承诺在单一支付者和多人组成部分的球场上有一个坚实的经验,我们对游戏和游戏的内部和外部都很好奇,我…

XSpirit 2智能边缘计算机使用测评

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 拆箱过程介绍视频使用感受 我之前就参加过 Spirit 1 第一代智能边缘计…

Nginx搭载负载均衡及前端项目部署

目录 ​编辑 一.Nginx安装 1.安装所需依赖 2.下载并解压Nginx安装包 3.安装nginx 4.启动Nginx服务 二.Tomcat负载均衡 1.准备环境 1.1 准备两个Tomcat 1.2 修改端口号 1.3 配置Nginx服务器集群 2.效果展示 ​编辑三.前端项目打包 ​编辑四.前端项目部署 1.上传项目…

Maven修改仓库和镜像地址

目录 1、修改仓库地址2、修改镜像地址 1、修改仓库地址 使用IDEA时,如果不指定自己下载的Maven,idea会默认使用自带的Maven 3(bundle)。maven 3默认的仓库路径一般是在c盘的用户文件夹中的.m2目录下: 当maven下的pom文件中的依赖逐渐增加时,maven仓库下…

进程控制(二):进程等待

文章目录 进程控制(二)进程等待wait函数waitpid函数wait/waitpid获取子进程状态码的过程进程等待相关的宏 总结 进程控制(二) 延续对于上文进程结束,我们继续对于进程控制进行学习,本文我们主要是对于进程…

详解IPD需求分析工具$APPEALS

够让企业生存下去的是客户,所以,众多企业提出要“以客户为中心”,那如何做到以客户为中心?IPD中给出的答案是需求管理。 需求管理流程,是IPD(集成管理开发)体系中的四大支撑流程之一&#xff0…

【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总)

【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总) 文章目录 低功耗模式(此章节可直接跳过)低功耗模式简介睡眠模式停止模式待机模式 建立自己的低功耗模式配置库通过结构体的方式来进行传参RTC配置…

python如何使用gspread读取google在线excel数据?

一、背景 公司使用google在线excel管理测试用例,为了方便把手工测试用到的测试数据用来做自动化用例测试数据,所以就想使用python读取在线excel数据,通过数据驱动方式,完成自动化回归测试,提升手动复制,粘…

【深度学习基础】专业术语汇总(欠拟合和过拟合、泛化能力与迁移学习、调参和超参数、训练集、测试集和验证集)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

以太网【FPGA】

1物理: 2接线: 信号名 信号类型 对应引脚 备注 sys_clk Input B5 系统晶振输入时钟,频率 50MHz sys_rst_n Input E8 系统复位信号,低有效 eth_rxc Input E17 PHY 输入时钟,频率 125MHz eth_rx_ctl Inpu…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(五)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。…

Redis ----使用Java代码操作redis(2)

⭐⭐ Redis专栏:Redis专栏 ⭐⭐ 个人主页:个人主页 目录 一.Java连接redis 二.Java操作redis常见数据类型存储 2.1 String类型的操作 2.2 hash 2.3 集合 list 三.redis的运用场景 一.Java连接redis 第一步:导入依赖…

第十五章 EM期望极大算法及其推广

文章目录 导读符号说明混合模型伯努利混合模型(三硬币模型)问题描述三硬币模型的EM算法1.初值2.E步3.M步初值影响p,q 含义 EM算法另外视角Q 函数BMM的EM算法目标函数LEM算法导出 高斯混合模型GMM的EM算法1. 明确隐变量, 初值2. E步,确定Q函数3. M步4. 停止条件 如何应用GMM在聚…

ConnectionError: HTTPSConnectionPool

ConnectionError: HTTPSConnectionPool(host‘zbbfxstatic.figtingdream.com’, port443): Max retries exceeded with url: /api/cache (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x00000249795AD9A0>: Failed to establish a ne…

iOS实现弹簧放大动画

效果图 实现代码 - (void)setUpContraints {CGFloat topImageCentery (SCREEN_HEIGHT - 370 * PLUS_SCALE) / 2;[self.topIconView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.mas_equalTo(0);make.centerY.equalTo(self.view.mas_top).with.offset(t…

Halcon计算点到直线的垂线方程

一、我们都知道&#xff0c;点到直线最短距离就是垂线。Halcon也有现成的算子可以计算点到直线的距离 distance_pl( : : Row, Column, Row1, Column1, Row2, Column2 : Distance)。但是此算子不会返回具体的垂点坐标。当我们希望显示垂线的时候是需要知道垂点坐标&#xff0c;才…

Leetcode刷题详解——全排列

1. 题目链接&#xff1a;46. 全排列 2. 题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V&#xff0c;电流高达500mA&#xff0c;而三个同步降压转换器的输入电压范围为3.0V至4.2V&#xff0c;输出电压范围为0.8V至3.9875V&#xff0c;峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

提升ChatGPT答案质量和准确性的方法Prompt engineering

文章目录 怎么获得优质的答案设计一个优质prompt的步骤:Prompt公式:示例怎么获得优质的答案 影响模型回答精确度的因素 我们应该知道一个好的提示词,要具备一下要点: 清晰简洁,不要有歧义; 有明确的任务/问题,任务如果太复杂,需要拆分成子任务分步完成; 确保prompt中…