TCP可靠性机制详解:排序、确认、重传与流量控制
创作时间:
作者:
@小白创作中心
TCP可靠性机制详解:排序、确认、重传与流量控制
引用
1
来源
1.
https://cloud.tencent.com.cn/developer/article/2481258
TCP(传输控制协议)是互联网中最重要的协议之一,它提供了可靠的数据传输服务。本文将深入探讨TCP的可靠性机制,包括排序机制、确认机制、重传机制和流量控制机制,帮助读者更好地理解TCP协议的工作原理。
TCP的可靠性
1. 排序机制
TCP保证数据按顺序到达接收端。由于数据在网络中可能会通过不同的路径传输,因此不同的数据包可能会到达接收端的顺序不一致。排序机制的作用是确保数据按发送的顺序被正确接收。
具体实现:
- 每个数据段都有序列号:每个TCP数据段(Segment)都包含一个序列号,这个序列号标识该数据段在整个数据流中的位置。接收方通过序列号来判断数据包的顺序。
- 接收方按序列号重组数据:接收方会根据序列号对收到的数据进行排序。如果接收到的数据包的顺序与预期不符,接收方会将其缓存在接收缓冲区,等待缺失的包到达。接收方只会将按顺序到达的数据交给上层应用。
如果接收方发现某个数据包的序列号不对或者缺失,它会将该信息反馈给发送方(通过确认机制),发送方会进行相应的重传。
2. 确认机制和重传机制
2.1. 重传机制
TCP的重传机制是保证数据丢失情况下能够成功传输的关键。由于网络中可能会出现数据丢失、错误或延迟,TCP需要提供一种机制来检测丢失的包并重新发送。
具体实现:
- 超时重传:如果发送方在一个预定的时间内没有收到接收方的确认(ACK),它会认为该数据包丢失或出现了其他错误,随后会重传该数据包。这个超时是由发送方的“重传计时器”控制的。若在计时器超时之前收到确认,则不进行重传。
超时重传的时间间隔是动态调整的,通常采用“加倍间隔”的策略,即每次超时后,重传间隔会增加,直到成功接收到确认。TCP使用一种叫做自适应重传算法(例如:TCP的慢启动、拥塞控制)来优化超时重传的时间。 - 快速重传:如果接收方发现丢失的包(通过序列号的跳跃)并且收到的连续数据包中有重复的确认号,它会发送多个重复确认(重复ACK)。当发送方收到三个重复确认时,它会立刻重传丢失的数据包,而无需等待重传计时器超时。这种机制被称为快速重传,它能够减少数据包丢失后等待的时间,提高效率。
在快速重传机制中,并不是因为RTO时间到达从而触发重传机制,该重传机制是根据对端的反馈信息进行重传,当连续3三收到相同的ACK报文时,发送端会重传数据。这3个连续的ACK报文被称为冗余ACK。 - 快速恢复:与快速重传结合使用,快速恢复机制用于在发生丢包时,通过减小拥塞窗口(窗口大小)来快速调整TCP连接的拥塞控制状态,以恢复到正常的传输状态。快速恢复机制一般通过调整TCP的拥塞控制算法来实现,如慢启动与拥塞避免等。
2.2. 确认机制
TCP使用确认机制(Acknowledgment)来确保数据的可靠传输。每当接收方收到数据包时,它会发送一个确认消息,告诉发送方该数据包已经成功接收。
具体实现:
- 确认号(Acknowledgment Number):接收方在返回的TCP包中会包含一个确认号,这个确认号表示接收方期望接收的下一个字节的序列号。也就是说,确认号是“下一个期望字节”的序列号,确认号表示前面所有数据已经成功接收。
例如,如果接收方已经成功接收到序列号为1000到2000的数据,它会向发送方发送一个确认号2001,表示它已经成功接收了序列号小于2001的数据。 - 累积确认:TCP的确认机制是累积确认的,意味着如果接收方确认了某个序列号(比如2001),它也隐含地表示所有之前序列号的数据包都已成功接收。接收方不会为每个数据段单独发送确认,而是按照序列号的累积情况发送一个确认号。
- 延迟确认:为了提高网络效率,接收方可能会延迟确认,即在短时间内合并多个数据包的确认,减少网络负载。这也使得发送方不会因为过早的确认而频繁发送数据包。
注意:选择确认机制也是需要进行协商的。
3. 流量控制机制
3.1流量控制的背景
- 在网络通信中,接收方的缓冲区容量是有限的。如果发送方的数据流速过快,而接收方来不及处理这些数据,接收方的缓冲区可能会被填满,进而导致数据丢失或者需要丢弃多余的数据。因此,必须有一种机制来控制发送方的发送速率,确保接收方的缓冲区不会被溢出。
- TCP的流量控制是端到端的机制,通过在发送方和接收方之间动态调整窗口大小,来避免过多的数据被发送到接收方,直到接收方有足够的空间来存储和处理这些数据。
3.2.流量控制的核心概念:滑动窗口(Sliding Window)
TCP流量控制的机制基于滑动窗口协议(Sliding Window Protocol)。这个协议用于动态控制数据的传输速率,确保发送方不会超出接收方的缓冲区容量。
滑动窗口的工作原理:
- 接收窗口(Receiver Window):接收方的接收窗口(也叫窗口大小)是接收方的可用缓冲区大小,它告诉发送方当前接收方可以接收多少数据。接收方在发送ACK报文时,会告诉发送方它的接收窗口的大小。接收方的接收窗口大小会随着它处理数据的进度而变化。
- 发送方窗口:发送方基于接收方的窗口大小来调整自己的发送速率。发送方窗口的大小不能超过接收方报告的接收窗口的大小,也不能超过发送方的缓冲区大小。
- 滑动窗口的动态变化:随着接收方处理数据并释放缓冲区空间,接收方的接收窗口会增大,发送方可以继续发送更多的数据。如果接收方的接收窗口变小,发送方则必须减少发送的数据量,直到接收方有足够的空间可以接收更多的数据。
3.3窗口大小体现在缓存区的大小
- TCP要求发送方依据接收窗口rwnd来控制数据的发送量。rwnd等于接收方接收缓存大小减去已存数据量大小。即rwnd变量是可变的。
- 如下图所示:
TCP发送方窗口队列图
- 发送窗口的概念
- 发送窗口:是指发送方在没有收到确认的情况下,可以连续发送的数据量。它由一个左边界和一个右边界界定,表示一个字节序列的范围。
- 左边界(left edge):表示已经发送并被确认的数据的最右边界。
- 右边界(right edge):表示发送窗口的最右边界,即发送方可以发送的数据的最大序列号。
- 缓存区与发送窗口的关系
- 缓存区:在 TCP 中,发送方和接收方都有缓存区。发送方的缓存区用于存储待发送的数据,而接收方的缓存区用于存储接收到的数据。
- 发送窗口大小:直接反映了发送方缓存区中可以用来存储待发送数据的大小。
TCP发送方窗口队列图
- 图片中的示例
- 窗口大小:图中显示的发送窗口大小为 20 字节。这意味着发送方在没有收到确认的情况下,可以连续发送 20 字节的数据。
- 缓存区的划分
- 已发送已确认的数据(#1):在左边界左侧,表示已经发送并且被接收方确认的数据。这些数据已经从发送方的缓存区中移除。
- ** 已发送但未确认的数据(#2):在左边界和右边界之间的蓝色区域,表示已经发送但尚未收到接收方确认的数据。这些数据仍然在发送方的缓存区中。
- 即将发送的数据(#3):在右边界左侧的绿色区域,表示可以立即发送的数据。这些数据在发送方的缓存区中等待发送。
- 未发送数据(#4):在右边界右侧的黄色区域,表示由于接收方没有足够的缓存空间,不能发送的数据。这些数据在发送方的缓存区中等待发送机会。
TCP发送方窗口队列图
- 缓存区大小的体现
- 已用窗口(used window):图中显示为 14 字节,表示已经发送但尚未确认的数据(#2)加上即将发送的数据(#3)。
- 未用窗口(unused window):图中显示为 6 字节,表示由于接收方没有足够的缓存空间,不能发送的数据(#4)。
TCP发送方窗口队列图
- 窗口移动
- 当发送方收到接收方的确认时,左边界会向右移动,表示已经确认的数据从缓存区中移除。
- 当接收方的缓存空间增加时,右边界会向右移动,表示发送方可以发送更多的数据。
热门推荐
《觅仙途》引力流玩法攻略
促进能力发展的0-6岁玩具清单——来自美国国家幼儿教育学会的推荐
上海地铁最新建设消息!
神经酸与大脑
战国时期的“魏武卒”什么水平,为何能以五万横扫秦军五十万呢
“顶流”山西,急需高铁
赛季讨论,已经收获成功的活塞
历代皇帝龙袍颜色多以黄色为主,为啥独有秦始皇的龙袍是黑色的?
古籍风水资料分享堪輿雑著
一入秋冬就龟裂?水嫩足跟好Easy!
医院挂号小程序开发,如何让就医变得简单?
延长胰腺癌患者术后生存期,这一项目获上海市科技进步一等奖
《哪吒2之魔童闹海》为什么好看?
中美航母对比:福特号不如福建舰先进?
《哪吒2》北美正式上映 点映观看评价高 票房预售强劲
学历的重要性如何体现
地铁日均客流量突破800万乘次 深圳城市交通与区域发展新篇
英国环境专业排名TOP4院校解析
直播带货如何提高用户粘性?粘性提升技巧分享!
新能源汽车更易起火?“统计数据+专家解读”告诉你真相!
食物中毒后的护理要点及预防措施
首个零碳公园!深圳、上海、成都...
甲状腺结节的分级
打板投资策略:如何把握短线机会和最佳入场时机
八字命理中辛亥日柱的属性及其详细解析是什么
DeepSeek-V2论文解读:混合专家架构的新突破
章泽天透露家庭帕金森基因,帕金森病真的都会遗传吗?
销售的根本:信任与需求
焦煤期货的价格波动受哪些因素影响?这些因素如何进行分析?
运价战开打!货量不足,大型船公司美西航线直降800美元