TCP可靠传输原理
停止等待协议
“停止等待”就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送。
超时重传
发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有送达,从而重新发送分组。
TCP通过以下的方式实现超时重传:
- 超时计时器:每发送完一个分组后,tcp都会设置一个超时计时器。超时计时器的超时时间往往要大于报文的平均往返时间。
- 分组副本:发送分组后,tcp会保留分组的副本,只有收到分组的确认后才会清除
- 分组编号:TCP会对每一个分组编号,确认分组和发送的分组编号对应。
连续ARQ协议
如果TCP每发送一个分组就要等待的话,势必会浪费大量的时间,使得网络利用率降低。所以TCP采用了连续ARQ的方式,也就是每次发送多个分组,然后使用累积确认的方式确认。
- 累积确认:接收方只对按序到达的最后一个分组发送确认。
假如发送方一次性发送了[1,2,3,4,5]五个分组,接收方只接受到了[1,2,4,5]四个分组。按照按序最后一个的规则,接收方只会发送 2 号分组的确认。发送方将收不到后面三个分组的确认,所以会重传3,4,5。
累积确认使用了滑动窗口实现,它的优点是不需要对每个分组发送确认,从而减少了网络开销。缺点是不能向发送方真实反映收到分组的信息,比如上面例子里,发送方认为 3 号分组以后的都没有收到,但是接收方其实是收到了4,5号分组的。
以字节为单位的滑动窗口
发送方和接收方分别维护 发送窗口 和 接收窗口 两个滑动窗口。
发送窗口维护了三个指针p1、p2、p3,它们划分了发送窗口的区域:
- [p1, p2):等待确认区域,记录已发送但没收到确认的分组。
- [p2, p3] :可用窗口,允许发送但是还未发送的分组。
既然是滑动窗口,那么它的左右边界应该是能够移动的,下面来分析发送窗口的左右边界的移动。
p2前移
p2指针指向的是第一个允许发送但还未发送的分组,所以p2的前移是发送方发送了新的分组。
p1前移
p1指针只有在收到确认后才会移动到被确认分组的下一个分组。
因为采用的累积确认的方式,接收方只会发送按序到达最后一个分组的确认,所以p1的前移可能不止一个分组。
比如向上图的情况,假如接收方收到了31,32,33三个分组,它只会发送按序到达最后分组的确认,也就是33号分组的确认。此时发送方的p1指针将会直接从31号位置移动到34号位置,也就是收到确认分组的下一个。
p3前移
p3的前移是收到接收方发送的确认报文的窗口字段控制的。
窗口值表示从确认分组号开始到p3的分组数量。比如确认分组号为101,窗口值为200,那么p3就会移动到301的位置。
接收方通过窗口值来控制发送窗口的大小也叫做流量控制,这里不过多介绍。
TCP缓存
TCP既然能够保留未确认的分组以及按序发送确认,它肯定需要一个内存空间作为缓存,而不是直接用应用进程的内存。
如图所示,接收方和发送方各自维护了一个缓存,发送窗口和接收窗口都在这个缓存中。首先TCP缓存有以下特点:
- 因为缓存空间和序号有限,TCP缓存是循环使用的,是一个环形的结构。
- 滑动窗口只是缓存的一部分,已经确认的数据会被删除。
发送缓存和接收缓存结构相同但是作用不同。
发送缓存
- 缓存应用程序让TCP发送的数据
- 暂存已经发送但未收到确认的数据
接收缓存
- 暂存未按序到达的数据
- 缓存按序到达但没有被应用程序读取的数据
总结
- TCP可靠传输的原理是超时重传和连续ARQ
- 超时重传时间大于分组平均往返时间
- 连续ARQ采用了累积确认的方式发送确认
- TCP通过发送窗口和接收窗口实现可靠传输
- 发送窗口大小受到接收方的窗口值控制
- 滑动窗口是TCP缓存的一部分,TCP缓存是一个环形结构,还负责缓存应用程序数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步