热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【计算机网络传输层】TCP可靠传输、TCP流量控制、拥塞控制

目录1.TCP的可靠传输1.1校验1.2序号(seq)1.3确认(ack)1.4重传1.4.1超时重传1.4.2快速重传&#

目录

  • 1. TCP的可靠传输
    • 1.1 校验
    • 1.2 序号(seq)
    • 1.3 确认(ack)
    • 1.4 重传
      • 1.4.1 超时重传
      • 1.4.2 快速重传(冗余ack-冗余确认)
  • 2. TCP流量控制
    • 2.1 定义
    • 2.2 滑动窗口
  • 3. TCP拥塞控制
    • 3.1 慢开始和拥塞避免
    • 3.3 快重传和快恢复


1. TCP的可靠传输

可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
比如,我客户端一个字节流发送的是,12345,那服务端收到的也是12345

1.1 校验

增加一个伪首部,通过使用二进制反码求和的方法来确定

1.2 序号(seq)

每次在传输的时候,我们的序号都是报文段的第一个字节

1.3 确认(ack)

每次在传输的时候,我们想要的报文段的第一个字节
在这里插入图片描述

1.4 重传

确认重传不分家,TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。

1.4.1 超时重传

重传时间:TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间 根据第一个报文段,根据第二个和第一个报文段 ·······)

1.4.2 快速重传(冗余ack-冗余确认)

每当比期望序号大的失序报文段到达时,发送一个冗余ack,指明下一个期待字节的序号。
发送方已发送1,2,3,4,5报文段
接收方收到1,返回给1的确认(确认号为2的第一个字节 )
接收方收到3,仍返回给1的确认(确认号为2的第一个字节)
接收方收到4,仍返回给1的确认( 确认号为2的第一个字节)
接收方收到5,仍返回给1的确认( 确认号为2的第一个字节)
发送方收到3个对于报文段1的冗余ack- >认为2报文段丢失, 重传2号报文段

2. TCP流量控制

2.1 定义

流量控制:让发送方慢点,要让接收方来得及接收。

2.2 滑动窗口

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd (接收方设置确认报文段的窗口字段来将rwnd通知给发送方), 发送方的发送窗口取接收窗口rwnd和拥塞窗口(网络堵了)cwnd的最小值。
在这里插入图片描述
在这里插入图片描述

3. TCP拥塞控制

在这里插入图片描述
在这里插入图片描述

3.1 慢开始和拥塞避免

在这里插入图片描述
拥塞窗口慢慢的变大(从0开始,1-2-4-8-16慢慢的探查),指数规律增长,等到达慢开始的界限值(给定一个初始值)时,由慢开始到拥塞避免,转到增加一个值(16-17-18-19),发生网络拥塞,将拥塞窗口置为1,再慢慢的变大(从0开始,1-2-4-8-16慢慢的探查),指数规律增长,等到达慢开始的界限值(这里的界限值是:发生网络拥塞的值除以2),由慢开始到拥塞避免,转到增加一个值(16-17-18-19)

3.3 快重传和快恢复

当收到3个重复的冗余ack时,直接进行快重传
快重传后,执行快恢复, 快恢复不需要降到0,降到发生堵塞的一半,再执行拥塞避免
在这里插入图片描述


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
author-avatar
取个名字忒难le
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有