TCP如何保证传输可靠


tcp是一种面向连接,可靠的传输控制协议,那么tcp是如何保证传输可靠的呢?本文只细数其三个策略

一 ARQ(Automatic Repeat-reQuest )

ARQ,自动重传请求。是传输层和数据链路层用来纠错的协议之一。顾名思义,会在传输出错时自动重传。ARQ使用确认和超时两个两个机制,在不可靠的基础上实现可靠的传输。ARQ包括停止等待ARQ和连续ARQ

1.1 停止等待ARQ

  • 每发完一个分组就停下来等待,等待接收方传回ACK的确认。如果过了一段时间没有得到ACK的确认,就重新发送。如果收到确认就发下一个分组。
  • 受到多方因素影响,接收方收到数据后,返回的ACK确认会丢失,这个时候发送方会重发数据,在停止等待ARQ中,接收方如果会丢弃掉重复的数据
  • 这种方式简单,但是每发一次就停一下,信道利用率很低

1.2 连续ARQ

  • 在发送方维持一个发送窗口,在窗口内的分组可以连续发送而不用等待确认。接收方采用累计确认,对按序到达的最后一个分组返回发送确认消息,表明到这个分组为止所有的分组都正确收到了。
  • 假设排序好的20个分组里,第6个分组丢失了,没有送到接收方,其余均到达了,这个时候发送发怎么办?实际上接收方收到5以前排好序的分组和6以后的分组,但返回确认消息时,只会确认1-5的分组已经收到了,后面的分组虽然收到了但是并没有完整收到,因此不会返回确认消息,那接收方就只知道对方收到了1-5的分组,因此6-20的分组还会重新发送。这被称为go-back-N,表示需要退回来冲重传已经发过的N个消息

二 流量控制(滑动窗口RWND)

场景

在讲流量控制前,可以想象这么一个场景,高数老师张三给学生李四上课,张三一个劲地想把知识灌输给李四,奈何高数的水太深,李四把握不住。一堂课下来,张三讲完半本高数,再看李四,那个知识一点都没进脑子。

目的

经过以上场景,我们就知道流量控制的目的了,实际上是为了照顾接收方的接收速度而控制发送方的发送速度。在上述场景中,张三疯狂输出,没考虑李四的接收速度,结果就是两败俱伤。

手段

那如何控制这个发送速度呢?就需要使用到滑动窗口了。我们在发送发确认两个参数:最后一次发送的字节位置和最后一次收到ACK的字节位置,在接收方也确认两个位置:最后一次接收的字节码位置,最后一次字节码写入的位置。我们只需要确认这个滑动窗口大小。在发送方和接收方控制两个位置的差值不超过滑动窗口即可,而实际上这边的滑动窗口就是一个值而已,一个差值。

三 拥塞控制(拥塞窗口CWND)

场景和目的

和流量控制不同,拥塞控制的目的是为了缓解网络压力,而流量控制是为了缓解接收方压力。网络为什么会有压力呢?数据包在网络中传输的时候,就拿路由器来说,涉及到路由选择和转发,每个路由器都维护一张转发表,每个数据包都是通过路由器转发表的索引去转发,那必然会有缓存缓存数据包,那如果发送速度过快,就会导致缓存泄露,数据丢失的可能性,这就是网络压力的表现之一

手段

因此我们发送方除了维护滑动窗口外,还要维护一个拥塞窗口,拥塞窗口的大小由什么决定呢?其实就是由丢包与否决定,发送发发送数据后,定期得不到ACK确认,那么发送方会默认网络拥塞导致包丢失,这个时候就降低拥塞窗口大小,如果能得到ACK确认,那么增加拥塞窗口大小。但是我们需要使发送方最后一次发送的位置到最后一次接收到ACK确认的位置的长度小于拥塞窗口和滑动窗口的较小值。

拥塞控制算法

以上我们所说的控制拥塞窗口大小只是一个大概的思,路,实际上tcp的拥塞控制有四种算法:

  • 慢开始:先将拥塞窗口大小设置为1,在获取ACK顺利的情况下每次拓宽2倍
  • 拥塞避免:让拥塞窗口大小每次增1
  • 快重传:收到三次重复数据包的ACK后,立刻重新发送该数据包后面一个数据包
  • 快恢复:快重传之后直接从阈值开始增加拥塞窗口大小

过程

  • 拥塞窗口先采取慢开始的方式增加自己的大小
  • 达到阈值后采用拥塞避免增加自己的大小,达到上限后将阈值减半,把拥塞窗口大小变为1重新开始慢开始算法
  • 接收端如果丢失了分组,我们希望发送端很快就能发现并且重传,假设接收端接收到分组A,下一个分组B丢失了没收到,而是先收到下下个分组C,那么他会不断返回分组A的ACK,发送端连续接收到三次A的ACK之后知道B丢失,重发B,这就叫做快重传。这个时候仍然先减半阈值,但是不再是把拥塞窗口变为1,而是将拥塞窗口大小从阈值大小开始拥塞避免,这就叫做快恢复
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油光发亮的小猛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值