JavaEE: 深入探索TCP网络编程的奇妙世界(五)

文章目录

  • TCP核心机制
    • TCP核心机制六: 拥塞控制
      • 为什么要有拥塞控制?
      • 动态调整的拥塞控制
      • 拥塞控制中,窗口大小具体的变化过程
    • TCP核心机制七: 延时应答
    • TCP核心机制八: 捎带应答


TCP核心机制

前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(四)
书接上文~

TCP核心机制六: 拥塞控制

为什么要有拥塞控制?

虽然有了TCP滑动窗口这个大杀器,能够高效可靠的发送大量数据,但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题.

因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络的状态下,贸然发送大量的数据,可能导致雪上加霜.

动态调整的拥塞控制

在这里插入图片描述

流量控制可以使用接收方接收缓冲区剩余空间来进行衡量.

但是拥塞控制就比较复杂了.需要考虑中间节点的情况.比如:

  1. 中间的节点非常多.
  2. 每次传输的数据,走的路线还都不一样.
  3. 中间哪个节点遇到瓶颈了,都不好说.
  4. 中间节点传输数据不止有你A的数据,还有其他设备的数据.

虽然问题看起来更复杂了,但是不打紧,聪明的程序员总有办法.

我们可以通过"做实验"的方式,来找到一个合适的发送速度.

  1. 先按照一个比较小的速度,发送数据.
  2. 数据非常畅通,没有丢包,说明在网络上传输数据整体上是比较通畅的,此时就可以加快传输数据的速度~
  3. 增大到一定的速度之后,发现丢包了,说明网络上可能存在拥堵了,此时就可以减慢传输数据的速度.
  4. 减速之后,发现又不丢包了,继续再加速.
  5. 加速之后发现又丢包了,继续减速.

发送速度是会一直持续的动态变化的~
毕竟网络环境也是一直变化的.

流量控制,会限制发送窗口
拥塞控制,也会限制发送窗口
这两个机制,会同时起作用,最终实际的发送窗口大小,取决于上述两个机制得到的发送窗口的较小值~

拥塞控制中,窗口大小具体的变化过程

在这里插入图片描述

  1. 刚开始传输数据,拥塞窗口会非常小,用一个很小的速度来发送数据

    当前网络是否拥堵?未知.
    刚启动的时候,发数据的速度很慢~

  2. 不丢包,增大窗口大小(指数增长)

    增长速度特别快,短时间内达到很大的窗口大小.

  3. 增长到一定程度,达到某个指定的阈值,此时,即使没丢包,也会停止指数增删,变成线性增长.

    不至于太快的进入到丢包的节奏

  4. 线性增长,也会持续地使发送速度越来越快,达到某个情况下,就会出现丢包.

    一旦出现丢包,接下来就需要减少发送的速度,减小窗口大小.
    此时有以下两种出来方式:

    1. 经典的方案,回归到开始非常小的初始值,之后指数增长,线性增长~
    2. 现在的方案,回归到新的阈值上,线性增长(以后都不会指数增长了).

拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案.

流量控制和拥塞控制,实际上都是在对"可靠传输"进行补充~

TCP核心机制七: 延时应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小.

在这里插入图片描述

  • 假设接收端缓冲区为1M,一次收到了500K的数据,如果立刻应答,返回的窗口就是500K.
  • 但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了.
  • 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来.
  • 如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M.

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

所有的包都可以延迟应答吗?肯定也不是~

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

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

TCP核心机制八: 捎带应答

捎带应答是在延时应答的基础上,引入的提升效率的机制,它可以把返回的业务数据,和ACK两者合二为一.

在实际网络通信中,大部分的情况,都是"一问一答"这样的形式~
在这里插入图片描述
ack是内核返回的,是收到请求之后,立即就返回ack.

响应,则是应用程序返回的.在代码中,根据请求计算得到响应,再把响应写回到客户端.

正常情况下,ack和响应,是不同的时机返回的,无法合并.
但是,ack涉及到"延时应答".
延时应答就会使ack返回的时间,被往后拖.
这样一延时,就可能赶上接下来要发送响应数据的操作了.

于是就可以在发送响应的时候,把刚才ack的信息也带上.

本身ack报文,不需要载荷,ack报文主要设置以下内容

  • ack这一位为1
    设置窗口大小的值,设置确认序号…

相应数据主要是设置载荷,和ack不冲突.
这俩是可以共存的~

四次挥手,也涉及到类似的情况.
在这里插入图片描述

延时应答,捎带应答,都是TCP提升性能的机制.

TCP之所以复杂,不仅仅在考虑可靠传输,还要考虑在可靠传输的基础上,尽可能的提高效率~

本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布,这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2,还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进,其中最引人注目的当属 Parallels …

Python 入门(一、使用 VSCode 开发 Python 环境搭建)

Python 入门第一课 ,环境搭建...... by 矜辰所致前言 现在不会 Python ,好像不那么合适,咱先不求精通,但也不能不会,话不多说,开干! 这是 Python 入门第一课,当然是做好准备工作&a…

计算机毕业设计 校园失物招领网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

嵌入式单片机STM32开发板详细制作过程--01

大家好,今天主要给大家分享一下,单片机开发板的制作过程,原理图的制作与PCB设计,以及电子元器件采购与焊接。 第一:单片机开发板成品展示 板子正面都有各个芯片的丝印与标号,方便焊接元器件的时候,可以参考。(焊接完成之后,成品图如下) 第二:开发板原理图制作 在制…

MATLAB中多张fig图合并为一个图

将下列两个图和为一个图 打开查看-----绘图浏览器 点击第一幅图中曲线右键复制,到第二幅图中粘贴即可完成

布草洗涤-酒店分楼层统计报表--———未来之窗行业应用跨平台架构

一、大酒店分层管理 1. 精准管理库存 - 能够清晰了解每个楼层布草的具体数量和状况,实现对布草库存的精细化管理,避免出现某些楼层布草短缺或过剩的情况。 2. 优化资源分配 - 依据各楼层的使用频率和需求差异,合理调配布草资源&…

排序--归并排序

1.什么是归并排序? 归并排序将待排序的数组分成两部分,对每部分递归地应用归并排序,然后将两个有序的子数组合并成一个有序的数组。这个过程一直重复,直到数组完全有序。归并排序的过程可以用一棵完全二叉树来形象地表示&#xf…

frpc内网穿透

官网地址:frp官网 本次用到的Liunx包: https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz下载: wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.g…

申论笔记杉树林

同义词尽量用文章中的词进行拼凑不一定要有前置词分条 单一题 同义词给分不一定需要前置词分条 1、2、3、尽量抄文章中的词,通顺即可,不一定要成句子不要过分关注形式 题干: 条理清晰:要求分条,尽量有提示词…

脱离枯燥的CRUD,灵活使用Mybatis,根据mybatis动态的xml片段和接口规范动态生成代理类,轻松应付简单业务场景。

需求 需求是这样的,我们有一个数据服务平台的产品,用户先将数据源信息保存到平台上,一个数据源可以提供多个接口服务,而每个接口服务在数据库中存一个具有mybatis语法的sql片段。这样的话,对于一些简单的业务只需要编…

c++进阶学习-----继承

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 继承呈现了面向对象 程序设计的…

006——队列

队列: 一种受限的线性表(线性逻辑结构),只允许在一段进行添加操作,在另一端只允许进行删除操作,中间位置不可操作,入队的一端被称为队尾,出队的一端被称为队头,在而我们…

iOS 中 KVC 与 KVO 底层原理

KVC 本质: [object setValue: forKey:];即使没有在.h 文件中有property 的属性声明,setValue:forKey依然会按照上图流程执行代码 KVC 如果成功改变了成员变量,是一定可以被 KVO 监听到成员变量的前后改变的 KVO runtime会生成中间类&…

Leetcode 378. 有序矩阵中第 K 小的元素

1.题目基本信息 1.1.题目描述 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n^2…

GPT1-GPT3论文理解

GPT1-GPT3论文理解 视频参考:https://www.bilibili.com/video/BV1AF411b7xQ/?spm_id_from333.788&vd_sourcecdb0bc0dda1dccea0b8dc91485ef3e74 1 历史 2017.6 Transformer 2018.6 GPT 2018.10 BERT 2019.2 GPT-2 2020…

ER论文阅读-Decoupled Multimodal Distilling for Emotion Recognition

基本介绍:CVPR, 2023, CCF-A 原文链接:https://openaccess.thecvf.com/content/CVPR2023/papers/Li_Decoupled_Multimodal_Distilling_for_Emotion_Recognition_CVPR_2023_paper.pdf Abstract 多模态情感识别(MER)旨在通过语言、…

闯关leetcode——67. Add Binary

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/add-binary/description/ 内容 Given two binary strings a and b, return their sum as a binary string. Example 1: Input: a “11”, b “1” Output: “100” Example 2: Input: a “101…

【LeetCode:116. 填充每个节点的下一个右侧节点指针 + BFS(层次遍历)】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

MFC - 常用基础控件

前言 各位师傅大家好,我是qmx_07,今天给大家讲解MFC中的基础控件 基础控件 单选按钮 绘图准备: 调整窗口大小,设置 radio button 单选按钮button 按钮 设置单选按钮变量分别为 m_BN1、 m_BN2、m_BN3 void CMFCApplication3Dlg::OnBnC…

【笔记】机器学习算法在异常网络流量监测中的应用

先从一些相对简单的综述类看起,顺便学学怎么写摘要相关工作的,边译边学 机器学习算法在异常网络流量监测中的应用 原文:Detecting Network Anomalies in NetFlow Traffic with Machine Learning Algorithms Authors: Quc Vo, Philippe Ea, Os…