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发送方窗口队列图
- 窗口移动
- 当发送方收到接收方的确认时,左边界会向右移动,表示已经确认的数据从缓存区中移除。
- 当接收方的缓存空间增加时,右边界会向右移动,表示发送方可以发送更多的数据。
热门推荐
长城内外百花香 ——长城国家文化公园建设巡礼
《永夜星河》人物关系图
原神讲了一个什么故事 剧情分析
种植牙集采后,武汉牙齿矫正会降价吗?2025金属托槽vs隐形牙套成本拆解表分享
提升角色行为的技巧与策略,助你更好塑造角色
拔牙后多少天可以镶牙
一年减利400亿元,谁是锂业公司“真龙头”?
车门限位器的更换步骤是什怎么?这些步骤有哪些需要注意的细节?
如何使用 Print Screen 键在 Windows 中打印屏幕
人最怕的就是精血不足,精血够不够,医生教你看这几个地方就知
节能改造新方法:磁悬浮压缩机提升效率与降低能耗的实效技巧
that和which的用法区别
深入探讨英语中“that”的发音及多样用法解析
纪录片《血战湘江》:英雄血染湘江渡
竹子的生长周期是多长时间
公路工程工期定额,如何科学合理地估算与管理?
无主之地3多次点击效果详解:如何优化游戏体验与战斗策略
利用红绿灯缓解交通拥堵?广州719个路口有“妙招”
并不是所有人都适合午睡,这4个错误方法,可能越睡越伤身
合规纳税小课堂丨积极修复纳税信用,助力企业更好发展
八字命理学:十神的强弱分析及其对命运的影响
如何理解货币供给对利率的影响机制?这种影响机制如何进行分析?
前端如何识别图片文字
如何分析黄金投资的主要方式?这些方式存在哪些风险和机遇?
首个多模态大模型的可解释性综述全面深度剖析
2025宝鸡事业编招聘公告发布时间预测及历年数据
《双城之战2》:被剧情拖后腿的顶级制作
实发工资和应发工资大概差多少
芙蓉楼别离辛渐之诗意解析
鲨鱼研究新进展:科学家如何解读其生存策略