TCP 核心工作机制

TCP 的核心知识:如何保证传输可靠 + 如何提高传输效率

如何保证传输可靠:确认应答机制 + 超时重传机制

如何提高传输效率:滑动窗口机制、流量控制机制、延时应答机制、捎带确认机制、拥塞控制机制

可靠机制

        TCP的可靠性主要是通过 确认应答 + 超时重传 来体现的。

1.确认应答机制

        先看发送发:在没有滑动窗口机制之前,发送方一次只能发送一段报文,且每次发送完后要等待接收方的ACK确认,只有在收到接收方的ACK确认应答后,才能将发送缓冲区里对应的数据释放掉,并开始发送第二段报文。如果在规定时间内未收到ACK确认,则尝试重传这段报文(超时重传机制)。

        再看接收方:接收方每次接收到报文后,都要给发送方返回一个确认应答报文ACK,告知对方已正确接收数据,期望下次收到报文段的起始序列号是ack。

        确认应答机制本质上是接收方对发送方报文中的seq进行确认,TCP是字节流传输协议,seq就代表数据,seq被确认就意味着数据被确认。只有确认应答机制 + 超时重传机制才能保证数据传输的可靠性,但数据传输效率比较低(RTT时间越长,传输效率越低)

2.重传机制

2.1 超时重传机制

        TCP超时重传机制是针对确认应答阶段数据丢包的情况,TCP传输过程中,发送方发出的报文可能会丢失,接收方返回给对端的ACK报文也有可能丢失。无论是哪种丢包,发送方在发送完报文后如果在指定时间内(RTO,Retransmission Timeout 超时重传时间)未收到对端返回的ACK报文,就会重传这段报文。重传次数达到一定量时,如果还是无法收到ACK报文,发送方就会发送RST报文,要求重置连接,如果重置连接都失败那就彻底断开连接。

RTO随RTT动态变化。RTT越小,网络环境越好,RTO也随之变小。

如果超时重传的数据,因再次超时而重传时,超时重传时间将是先前值的两倍。

        接收方收到重复的报文怎么办?TCP接收数据时都先将数据写入到接收缓冲区(Receive Buffer),再根据seq对缓冲区数据进行排序,方便应用程序正确有序地读取数据。新接收到的数据在写入缓冲区后,自然也要根据seq排序,这时就很容易判断出这段数据是否重复,如果重复就直接丢弃,这种机制确保了应用层读取到的数据是有序且不重复的。

        超时重传存在的问题是,超时周期相对较长。

2.2 快速重传机制

        快速重传(Fast Retransmit)机制,本质还是为了提高传输效率,它不以时间为驱动,而是以数据驱动重传,在没有触发超时重传前,就已经触发发送方重传数据了。

        TCP为提高传输效率,使用了滑动窗口机制,什么是滑动窗口机制,我们在第4章节会讲到。使用滑动窗口时,发送方短时间内可发出了5条报文

  • 接收方收到seq1报文,返回ack2;
  • 接收方收到seq3报文,未收到seq2,还是返回ack2;
  • 接收方收到seq4和seq5报文,但还未收到seq2,最终还是返回ack2;
  • 发送方收到了3次重复的ack2,表明seq2丢失了,便立即重传丢失的seq2;
  • 接收方收到seq2报文,返回ack6。

        快速重传的工作方式是当发送方收到三次冗余的(不含第一次)重复的 ACK 报文时,在RTO生效前,立即重传丢失的报文段,这样就可以有效缩短重传时间。但这里面还存在效率的问题,如果发送方发出了6条或更多条报文,假设 seq2 和 seq3 都丢失了,发送方在收到3次冗余的ack2报文后,此时它首先能肯定的是seq2丢失了,但不确定seq2之后的数据有没有丢失,怎么办呢?只能先把seq2发出去再说,等收到后面的ack后再判读有没有其它数据丢失。假设当前通信网络环境不佳,发送方发送了很多条报文出去,丢包率为10%,发送方如果还是按照上面这种方式重传报文的话,其实效率也没提高多少。为了解决快重传的效率问题,于是就有了选择性确认SACK(Selective Acknowledgment),该参数位于TCP报头的Options,发送方可通过SACK值来判断哪部分数据丢失,有针对性地进行快重传,大大提高了重传效率。

2.3 SACK

        选择性确认(SACK,Selective Acknowledgment)用于数据重传机制,位于TCP报头的Options。接收方可通过SACK参数告知发送方我方收到了不连续的数据块(ack=200,SACK=300-400),发送方可根据此信息检查哪部分数据丢失(对方收到200字节数据,接收到了300-400段,说明200-299段丢失了)并重传丢失的数据。

        TCP三次握手过程中,双方会通过“SACK Permitted”来互相声明自己是否支持SACK,只有双方都支持SACK时,TCP才会使用SACK。Linux开启SACK的方法如下

#linux系统中可通过修改net.ipv4.tcp_sack来决定是否开启SACK,Linux 2.4后默认开启
[root@reader ~]# sysctl -a | grep net.ipv4.tcp_sack
net.ipv4.tcp_sack = 1
[root@reader ~]# find / -name *tcp_sack*
/proc/sys/net/ipv4/tcp_sack
[root@reader ~]# cat /proc/sys/net/ipv4/tcp_sack
1
[root@reader ~]# 可以用echo或sysctl -w 来临时修改tcp_sack
也可以在系统配置文件 /etc/sysctl.conf 中,添加如下一行代码,永久修改 tcp_sack
net.ipv4.tcp_sack = <new_value>

2.4 D-SACK

        Duplicate SACK 又称D-SACK,主要是通过SACK来告知发送方有哪些数据被重复接收了。通过D-SACK可让发送方知道是我方发出的报文丢失还是对端返回的ACK报文丢失。如,发送方收到ack= 500,SACK=300-400这样的报文,意味着500之前的数据都接收到了,且重复收到了300-400的数据。

#linux系统中可通过修改net.ipv4.tcp_dsack来决定是否开启SACK,Linux 2.4后默认开启
[root@reader ~]# sysctl -a | grep net.ipv4.tcp_dsack
net.ipv4.tcp_dsack = 1
[root@reader ~]# find / -name *tcp_dsack*
/proc/sys/net/ipv4/tcp_dsack
[root@reader ~]# cat /proc/sys/net/ipv4/tcp_dsack
1
[root@reader ~]# 可以用echo或sysctl -w 来临时修改tcp_dsack
也可以在系统配置文件 /etc/sysctl.conf 中,添加如下一行代码,永久修改 tcp_dsack
net.ipv4.tcp_dsack= <new_value>

3.连接管理机制

        通过三次握手建立连接,再通过四次挥手断开连接。

        参考文章 TCP三次握手、四次挥手及状态转换详解

效率机制

        TCP为了能最大限度的提高传输效率,分别从三方面对传输过程进行优化

  • 提高发送方的发送量(发送速率),如滑动窗口机制;
  • 提高接收方的接收能力(对方是否能承受大的数据量),如流量控制机制、延时应答机制;
  • 提高网络的转发能力(网络是否能转发大的数据量),如拥塞控制机制。

4.滑动窗口机制

4.1 什么是缓冲区?

  • TCP在操作系统中开辟的一块缓存空间,用于缓存将要发送和接收的数据;
  • TCP有两个缓冲区,分别是发送缓冲区接收缓冲区
  • 发送缓冲区和接收缓冲区都是环形队列
  • 应用层调用send函数将数据写入发送缓冲区,TCP从发送缓冲区获取数据并发送;
  • 网络层递交给TCP的数据最终被存放到接收缓冲区,应用层调用recv函数将数据从接收缓冲区读出。

4.2 什么是窗口?

        为解决因确认应答机制而导致的传输效率低下的问题,TCP引入了窗口概念。即使在RTT较长的情况下,也不会降低传输效率。

        窗口分“发送窗口”和“接收窗口”,首先它俩针对的缓冲区有所不同,发送窗口针对的是发送缓冲区,而接收窗口针对的是接收缓冲区。其次,发送方发送窗口的大小由接收方接收窗口的大小决定,但两者并不完全相等(因为有网络延迟),接收窗口大小约等于发送窗口大小。还需注意的是,窗口大小并不代表缓冲区的大小

        接收窗口(大小)就是我们通常讲的窗口(大小),对应TCP报头中的Window字段,表示接收端还剩多少接收缓冲区可用于接收数据。

        发送窗口(大小)指的是发送缓冲区中“已发送但未收到ACK确认”和“可以发送但还未发送”两块缓冲区的组成部分。这两部分的数据无需TCP确认就可直接推送给网络层。

        “已发送但未收到ACK确认”很好理解,就是已发送的报文在未等到确认应答ACK返回之前,必须保留在发送缓冲区中,如果在规定时间(RTO)内收到了ACK报文,就将数据从缓存区清除,否则重传报文。

        “可以发送但还未发送”指的是“可以发送但还没来得及发送,且总大小在接收方窗口大小范围之内”。

        注意:窗口是会动态变化的,可大可小,并不是下图中画的那样只有20字节;

        下面图中,如果32 ~ 45字节的数据状态不变,46 ~ 51字节的数据也已成功发送且未收到ACK确认,那么此时发送方的可用窗口就是0,在未收到新的ACK确认应答前无法继续发送数据。 

4.3 发送方的滑动窗口

        如下图,当32 ~ 36字节的数据收到ACK确认应答后,如果发送窗口大小不变,则滑动窗口往右移动5个字节,此时发送窗口就变成了由37 ~ 56字节组成的缓冲区了,后续就可以继续发送52 ~ 56字节之间的数据了。

4.4 发送方滑动窗口的四个组成部分

  • SND.WND:发送窗口大小(由接收窗口Window大小决定);
  • SND.UNA:是一个绝对指针,指向的是#2已发送但未收到ACK确认应答内容的第一个字节数据所对应的序列号;
  • SND.NXT:是一个绝对指针,指向的是#3可以发送但未发送内容的第一个字节数据所对应的序列号;
  • 是一个相对指针,SND.UNA + SND.WND,指向的是#4未发送且不能发送内容的第一个字节数据对应的序列号。

可用窗口大小 = SND.WND -(SND.NXT - SND.UNA)

4.5 接收方的滑动窗口(三部分)

  • RCV.WND:接收窗口大小,会赋值给Window并发送给发送方
  • RCV.NXT:是一个绝对指针,指向的是期望发送方下次发送来的数据的起始序列号,即ack值
  • 是一个相对指针,RCV.NXT + RCV.WND,指向的是#4未收到且不可以接收的第一个字节数据对应的序列号。

5.流量控制机制

        通过接收方的接收能力来控制发送方的发送数据量

6.延时应答机制

        接收方通过延时一小会,想要给发送方回复一个接收能力(更大的窗口大小)

7.捎带应答机制

8.拥塞控制机制

        通过不同的策略,不断的探测网络的转发能力,调整发送方的发送数据量

  • 慢启动
  • 拥塞避免
  • 快恢复

粘包处理

异常处理


参考文章:4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding

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

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

相关文章

【轻量化篇】YOLOv8改进实战 | 更换主干网络 Backbone 之 RepGhostnet,重参数化实现硬件高效的Ghost模块

YOLOv8专栏导航:点击此处跳转 前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操…

[学习笔记]SQL Server中批量查找所有符合Where条件的记录

目标&#xff1a;在SQL Server中查找所有表的UserId 50的记录 创建一个表变量来存储所有包含’UserId’列的表的名称。然后使用一个游标遍历这些表&#xff0c;并对每个表执行一个动态SQL查询 DECLARE TableName nvarchar(256), ColumnName nvarchar(128), SearchStr2 nvarc…

CentOS 宣布停更3年后,服务器操作系统何去何从?

“CentOS 要停止更新了&#xff1f;” 盯着电脑&#xff0c;某大型企业数字化部门的负责人彭素素看到这个消息&#xff0c;不仅在心里发出了一声惊呼。 2020年&#xff0c;CentOS 停止更新的消息&#xff0c;不仅彭素素所在的企业&#xff0c;对于不少正在使用 CentOS 的厂商…

Python多个列表连接实例代码解析

概要 在Python中&#xff0c;连接多个列表是一种常见的操作&#xff0c;用于将多个列表合并为一个。这个过程可以应用于各种数据处理和编程任务中。本文将介绍多种连接多个列表的方法&#xff0c;并提供详细的示例代码来帮助大家更好地理解。 使用 运算符 最简单的方法是使用…

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC搭建框架

第一章 初识SpringMVC 1.1 SpringMVC概述 SpringMVC是Spring子框架 SpringMVC是Spring 为**【展现层|表示层|表述层|控制层】**提供的基于 MVC 设计理念的优秀的 Web 框架&#xff0c;是目前最主流的MVC 框架。 SpringMVC是非侵入式&#xff1a;可以使用注解让普通java对象&…

JS模块化规范之CMD

JS模块化规范之CMD 模块化规范CMD&#xff08;Common Module Definition&#xff09;概念基本语法CMD实现 模块化规范 CMD&#xff08;Common Module Definition&#xff09; 概念 CommonJS module definition CMD规范专门用于浏览器端&#xff0c;模块的加载时异步的&#x…

应用 Strangler 模式将遗留系统分解为微服务

许多来源在一般情况下提供了微服务的解释&#xff0c;但缺乏特定领域的示例。新来者或不确定从哪里开始的人可能会发现掌握如何将遗留系统过渡到微服务架构具有挑战性。本指南主要面向那些正在努力启动迁移工作的个人&#xff0c;它提供了特定于业务的示例来帮助理解该过程。 …

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列&#xff0c;旨在通过简单标准的性能测试&#xff0c;帮助开发者、企业了解云数据库的性能&#xff0c;以选择适合的规格与类型。这个系列还包括&#xff1a; * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

C++ 模拟实现string

目录 一.类的声明 二.确定成员变量 三.成员函数 1.带参的构造函数&#xff0c;析构函数&#xff0c;拷贝构造 2.size()与capacity() 3.运算符重载 重载数组下标访问[] 重载 重载比较运算符&#xff08;<&#xff0c; < &#xff0c; > &#xff0c; > …

改变传媒格局的新趋势

在如今信息高速发展的时代&#xff0c;人们早已进入了一个以手机为中心的智能化时代。随着科技的迅猛发展&#xff0c;手机无人直播成为了一种新兴的传媒形态&#xff0c;正逐渐改变着传媒格局。本文将从手机无人直播的定义、发展背景和影响等方面进行探讨。 首先&#xff0c;…

数字孪生开发技术分析

数字孪生的开发涉及多个技术领域&#xff0c;包括计算机科学、数据科学、人工智能和工程等。以下是数字孪生开发中常用的一些关键技术&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.建模和仿真&am…

《论文阅读28》Unsupervised 3D Shape Completion through GAN Inversion

GAN&#xff0c;全称GenerativeAdversarialNetworks&#xff0c;中文叫生成式对抗网络。顾名思义GAN分为两个模块&#xff0c;生成网络以及判别网络&#xff0c;其中 生成网络负责根据随机向量产生图片、语音等内容&#xff0c;产生的内容是数据集中没有见过的&#xff0c;也可…

hive 用户自定义函数udf,udaf,udtf

udf&#xff1a;一对一的关系 udtf&#xff1a;一对多的关系 udaf&#xff1a;多对一的关系 使用Java实现步骤 自定义编写UDF函数注意&#xff1a; 1.需要继承org.apache.hadoop.hive.ql.exec.UDF 2.需要实现evaluete函数 编写UDTF函数注意&#xff1a; 1.需要继承org.apache…

Vue前端设计模式

文章目录 一、什么是设计模式&#xff1f;二、设计几个原则三、常见的设计模式及实际案例3.1、单例模式3.1.1、Element UI3.1.2、Vuex 3.2、工厂模式3.2.1、VNode3.2.2、vue-route 3.3、策略模式3.3.1、表格 formatter3.3.2、表单验证 3.4、代理模式3.4.1、拦截器3.4.2、前端框…

【分享】如何给Excel加密?码住这三种方法!

想要给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了正确的密码才能打开并且编辑文件&#xff0c;如果密码错误…

Elasticsearch常见面试题

文章目录 1.简单介绍下ES&#xff1f;2.简单介绍当前可以下载的ES稳定版本&#xff1f;3.安装ES前需要安装哪种软件&#xff1f;4.请介绍启动ES服务的步骤&#xff1f;5.ES中的倒排索引是什么&#xff1f;6. ES是如何实现master选举的&#xff1f;7. 如何解决ES集群的脑裂问题8…

高速视频采集卡设计方案:620-基于PCIe的高速视频采集卡

一、产品概述 基于PCIe的高速视频采集卡&#xff0c;通过PCIe3.0X8传输到存储计算服务器&#xff0c;实现信号的分析、存储。 北京太速科技 产品固化FPGA逻辑&#xff0c;适配视频连续采集&#xff0c;缓存容量2GB&#xff0c;开源的PCIe QT客户端软件&#xff0c…

(七)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启

目录 1. 中断相关知识简介 1.1 什么是中断 1.2 什么是内中断、外中断 1.3 什么是可屏蔽中断、不可屏蔽中断 2. CM3 内核中断介绍 2.1 F103系统异常清单 2.2 F103 外部中断清单 3. NVIC 简介 3.1 NVIC 寄存器简介 3.2 NVIC 相关寄存器的介绍 4. 中断优先级 4.1 优先…

2017年第六届数学建模国际赛小美赛B题电子邮件中的笔迹分析解题全过程文档及程序

2017年第六届数学建模国际赛小美赛 B题 电子邮件中的笔迹分析 原题再现&#xff1a; 笔迹分析是一种非常特殊的调查形式&#xff0c;用于将人们与书面证据联系起来。在法庭或刑事调查中&#xff0c;通常要求笔迹鉴定人确认笔迹样本是否来自特定的人。由于许多语言证据出现在电…