【计算机网络】TCP如何保障传输可靠性_笔记

文章目录

  • 一、传输可靠性的6方面保障
  • 二、分段机制
  • 三、超时重传机制
  • 四、流量控制
  • 五、拥塞控制


提示:以下是本篇文章正文内容,下面案例可供参考 源网站
按TCP/IP 4层体系,TCP位于传输层,为应用层提供服务

一、传输可靠性的6方面保障

  1. 基于数据块的传输:待传输的数据被分割成TCP认为合适的数据块(报文段或段),再向下传给网络层
  2. 基于序号的数据包去重和重排:每个包有一个序列号,通过这个序列号进行排序和去重
  3. 校验和:保持头部和数据的校验和,防止数据中传输过程中发生变化。基于伪头部+反码计算。
  4. 超时重传机制:丢包或延迟的情况下重发数据包,直到接收到对方的ACK。重传机制主要有:基于计时器的重传、快速重传、选择性重传SACK和重复选择性重传D-SACK
  5. 流量控制:利用滑动窗口实现流量控制
  6. 拥塞控制:当网络拥塞时减少数据发送。TCP在发送数据时主要考虑1.接收方的接收能力;2.网络的拥塞程度。接收能力由滑动窗口表示,量化了接收方的剩余缓冲区的大小;拥塞程度由拥塞窗口表示,量化了发送方认为可以在网络中传输的数据量

三次握手和四次挥手机制也是保障可靠性的基础机制,有这个机制才能有上面的6个方面。

TCP报文头部:
在这里插入图片描述


二、分段机制

分段机制是将应用层数据分割成适合网络传输的报文段,分割逻辑是基于Maximum Segment Size(MSS,单个TCP报文段能携带的应用层数据最大长度)和滑动窗口动态调整的。

MSS的典型值:以太网(MTU=1500字节)下,MSS=MTU-IP(20)-TCP(20)=1460字节

MSS的作用:避免IP层分片,减小传输开销和丢包风险;确保报文段能适配路径上的最小MTU,避免在传输的时候被IP协议分片

分段的具体流程如下:

  1. 应用层程序调用send将数据存入发送缓冲区
  2. 按MSS分割数据:假设MSS=1460字节,应用层存入数据是3000字节,报文段1=1460字节,seq=1;报文段2=1460字节,seq=1461;报文段3=80字节,seq=2921;
  3. 给上面的报文段123添加TCP头部(如序列号、ACK号、窗口大小)
  4. 滑动窗口发送:在窗口内的报文段立即发送,窗口外的存在缓冲区内等待发送

影响分段的动态因素: 路径MTU发现;拥塞窗口;接收窗口;

TCP分段是必要的机制,但是IP层分片则是需要尽可能避免的

三、超时重传机制

超时重传触发条件:发送方发送一个数据段后启动重传计时器RTO Timer,如果在RTO时间内没有收到对应的ACK就重传这个数据段。

重传的关键组件和流程:

  1. RTO Timer组件:每个已发送但未确认(未收到ACK)的报文段都会关联一个独立的RTO计时器。计时器到期后出发重传,重置计时器并将超时时间设置为上一次RTO的2倍。其中RTO最小在Linux系统里是1秒。
  2. 动态RTO计算:使用Jacobson/Karels算法,基于往返时间RTT动态调整RTO

常见重传场景:

  1. 首次超时重传:重传丢失报文段,并重置 RTO 计时器,将超时时间设置为上一次RTO的2倍。
  2. 快速重传:收到3个重复ACK时,立即重传丢失报文(不用等待RTO超时)
    发送方发送 Seq=1,2,3,4,5
    接收方收到 Seq=1,3,4,5(Seq=2 丢失)
    接收方连续回复 3 个 ACK=2
    发送方立即重传 Seq=2
  3. 选择性重传SACK:通过 SACK 选项明确通知发送方哪些数据已接收,哪些缺失。ACK=5001, SACK=6001-7000 (表示5000之前的数据已收到,但5001-6000丢失,6001-7000已接收)
  4. 重复选择性重传D-SACK:在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了

四、流量控制

TCP 利用滑动窗口实现流量控制。流量控制涉及到发送方和接收方的发送缓冲区和接收缓冲区,双方都维护一个发送窗口和接收窗口。
发送窗口: TCP发送窗口可以分成4部分

  1. 已经发送并且确认的 TCP 段(已经发送并确认);
  2. 已经发送但是没有确认的 TCP 段(已经发送未确认);
  3. 未发送但是接收方准备接收的 TCP 段(可以发送);
  4. 未发送并且接收方也并未准备接受的 TCP 段(不可发送);

TCP 接收窗口可以划分成三个部分:

已经接收并且已经

  1. 确认的 TCP 段(已经接收并确认);
  2. 等待接收且允许发送方发送 TCP 段(可以接收未确认);
  3. 不可接收且不允许发送方发送 TCP 段(不可接收)。

五、拥塞控制

为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。TCP拥塞控制算法有4种:

  1. 慢开始:主机开始发送数据的时候,通过对cwnd加倍的方法从小到大增大发送窗口
  2. 拥塞避免:每经过一个往返时间 RTT, 就把发送方的cwnd加1, 让拥塞窗口 cwnd 缓慢增大
  3. 快重传和快恢复:当发送方连续收到3个重复的ACK时,立即重传丢失的报文段,而不等待RTO到期;在快重传触发后,不立即将cwnd降为1MSS,而是通过半窗恢复策略平滑过渡,避免吞吐量断崖式下降。
    在这里插入图片描述

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

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

相关文章

2025年保姆级教程:Powershell命令补全、主题美化、文件夹美化及Git扩展

文章目录 1. 美化 Powershell 缘起2. 安装 oh-my-posh 和 posh-git3. 安装文件夹美化主题【可选】 1. 美化 Powershell 缘起 背景:用了 N 年的 Windows 系统突然觉得命令行实在太难用了,没有补全功能、界面也不美观。所以,我决定改变它。但是…

基于Mongodb的分布式文件存储实现

分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储。 基于 MongoDB GridFS 的分布式文件存储实现:从原理到实战 一、引言 当系统存在大量的图片、…

【Linux】Linux安装并配置Redis

目录 1.安装 2.启动服务 3.配置 3.1.绑定地址 3.2.保护模式 3.3.持久化选项 3.3.1.RDB 持久化 3.3.2.AOF 持久化 3.3.3.如何选择 1.安装 Redis 可以从默认的 CentOS 软件仓库中安装。运行以下命令来安装 Redis sudo dnf install redis -y 响应如下 2.启动服务 安装完成后&…

python-数据可视化(大数据、数据分析、可视化图像、HTML页面)

通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…

黑马点评相关知识总结

黑马点评的项目总结 主要就黑马点评项目里面的一些比较重要部分的一次总结,方便以后做复习。 基于Session实现短信登录 短信验证码登录 这部分使用常规的session来存储用户的登录状态,其中短信发送采取逻辑形式,并不配置云服务验证码功能。…

手搓四人麻将程序

一、麻将牌的表示 在麻将游戏中,总共有一百四十四张牌,这些牌被分为多个类别,每个类别又包含了不同的牌型。具体来说,麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中,包含有万子、条子和筒子,每种花色…

【Java高阶面经:数据库篇】17、分库分表分页查询优化:告别慢查询与内存爆炸

一、分库分表基础:策略与中间件形态 1.1 分库分表核心策略 分库分表是应对海量数据存储和高并发访问的关键架构设计,其核心在于将数据分散到不同的数据库或表中,以突破单库单表的性能限制。常见的分库分表策略包括: 1.1.1 哈希…

贪心算法之跳跃游戏问题

问题背景 本文背景是leetcode的一道经典题目:跳跃游戏,描述如下: 给定一个非负整数数组 nums,初始位于数组的第一个位置(下标0)。数组中的每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后…

Label Studio:开源标注神器

目录 一、Label Studio 是什么? 二、核心功能大揭秘 2.1 多类型数据全兼容 2.2 个性化定制随心配 2.3 团队协作超给力 2.4 机器学习巧集成 三、上手实操超简单 3.1 安装部署不头疼 3.1.1 Docker安装 3.1.2 pip安装 3.1.3 Anaconda安装 3.2 快速开启标注…

创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k

在 Java 生态中,HttpClient 和 Feign 都是调用第三方接口的常用工具,但它们的定位、设计理念和使用场景有显著差异。以下是详细对比: DIFF1. 定位与抽象层级 特性HttpClientFeign层级底层 HTTP 客户端库(处理原始请求/响应&#…

从零基础到最佳实践:Vue.js 系列(7/10):《常用内置 API 与插件》

引言 Vue.js 是一款轻量且强大的前端框架,因其易用性和灵活性受到广泛欢迎。无论是初学者还是资深开发者,都可以通过其内置 API 和插件生态快速构建高效、可维护的 Web 应用。本文将从基础用法讲起,逐步深入到进阶技巧,结合大量实…

线性代数:AI大模型的数学基石

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

Java-System工具类深度解析

Java-System工具类深度解析 前言一、System 类概述1.1 基本定义与特点1.2 重要成员变量 二、标准输入输出功能2.1 标准输入(System.in)2.2 标准输出(System.out)2.3 标准错误输出(System.err) 三、系统属性…

删除用户凭证

Git 部分仓库无法操作,部分仓库没问题 问题出现 我用个人电脑修改了项目,提交了git。然后第二天在公司电脑git pull的时候失败,只有部分仓库,git colne直接失败,部分仓库无问题。 解决方式 删除git相关凭证&#xff…

19. 结合Selenium和YAML对页面实例化PO对象改造

19. 结合Selenium和YAML对页面实例化PO对象改造 一、架构升级核心思路 1.1 改造核心目标 # 原始PO模式:显式定义元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式:动态属性访问 self.username.send_keys(Tester) # 自动触发元素定…

鸿蒙App开发学习路径

以下是一份系统的鸿蒙(HarmonyOS)App开发学习路径,适合从零开始逐步掌握相关技能: 1. 基础知识储备 1.1 理解鸿蒙系统 鸿蒙核心特性:分布式能力、一次开发多端部署、原子化服务、ArkUI框架。与Android/iOS的区别&…

spring boot启动报错:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

错误代码 10061 通常表明无法建立到指定服务器的网络连接。这个错误属于 Windows Sockets 错误代码,具体指的是无法建立网络连接,通常是因为目标地址不可达。以下是一些解决此问题的步骤: 检查 IP 地址和端口: 确保你输入的 IP …

ARMv7的NVIC中断优先级

1. 优先级模型 数值规则:数值越小,优先级越高(例如优先级0的异常比优先级1的异常更高);若多个异常的优先级相同,则 异常号(Exception Number) 较小的异常优先执行。固定优先级异常(不可配置):异常类型 优先级值 说明 Reset -3 最高优先级(系统复位) NMI -2 不可屏…

gitee错误处理总结

背景 如上图,根据图片中的 Git 错误提示,我们遇到的问题是 ​本地分支落后于远程分支,导致 git push 被拒绝。 ​问题原因​ 远程仓库的 master 分支有其他人推送的新提交,而您的本地 master 分支未同步这些更新(即本…

阿里云合集(不定期更新)

一、阿里云申请免费域名证书流程:https://blog.csdn.net/humors221/article/details/143266059 二、阿里云发送国内短信怎样编程:https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服务器磁盘空间不足的几个文件:h…