4.TCP重传+滑动窗口

1.TCP重传

TCP是一个可靠性传输协议,其可靠性主要体现在数据重传、数据确认机制。载链路情况较差时,通过重传可以在报文丢失或ack丢失的情况下对报文重新发送,保证接收端正确无误的接收报文,重传条件如下:

  • (1)超时重传:超时重传在报文或ack丢失时存在,表示发送端无法确认报文是否接收;此时发送端等待一个RTO(超时重传时间)的时间进行重传,若重传后仍未收到ack,继续等待直到2RTO后再次重传,若仍未收到,继续等待4RTO后重传,以此类推,每多一次重传,等待时间会加倍,直到达到最大重传次数;
  • (2)重复ACK:接收端在正常接收报文时,会在ack中通知发送端下一个期望接收的报文起始字节SN,若此时收到的报文非期望报文,表示链路中可能存在乱序或丢包,此时接收端发送Dup_Ack;发送端接收到的Dup_Ack个数等于3次时会执行报文重传;

(问题:为什么非要是3次才要重传?
重复ack造成的原因有两种,乱序或丢包。若仅仅是乱序造成,报文并未丢失,只是到达时间延迟,因此给予一定的时间进行等待接收,若收到一次重复ack就重传,会造成链路中大量报文的重复,浪费资源;在收到两次重复ack的情况下接收端仍然未接收到乱序报文,表示报文已经真正丢失,此时重传正好,最大程度的避免了链路中重复报文的数量;若是4次及以上,相对于3次,造成了时间上的浪费,会造成流量不稳定情况)

2.滑动窗口

发送一包并等待确认后再发送下一包,会极大程度的保证数据可靠性,但是在时间上会有大量的浪费,并且无法提升TCP传输速率,无法满足大流量的时代的需求。
因此为了更快的提高TCP传输速率,通过在发送端、接收端分别设置发送缓存与接收缓存的方式提高吞吐率,而这个缓存大小,我们称之为窗口,具体设置如下:

  • 发送端缓存:Cwnd(拥塞窗口),表示在未收到确认ack的情况下发送端发送的最大报文数;
  • 接收端缓存:Rwnd(接收窗口),表示在未确认的情况下接收端可接收的最大报文数;

其中Rwnd就是我们常说的滑动窗口,是体现在接收端一侧的一个值。在每一次向发送端回复ACK时,通过设置TCP协议头中的Window Size位告知发送端此时接收端剩余的接收缓存大小,而发送端在收到ACK后除了判断下一个要发送的字节外,还需检查Window Size值,进行下一次发送字节数的设置;
Cwnd是体现在发送端的一个值,主要是用在TCP拥塞控制中的一个变量,下一篇拥塞控制中会说到。

2019.7.6 修改:
【滑动窗口呢,其实并非说是接收端窗口,它在发送端、接收端都可以体现。
在发送端呢,窗口中的数据类型可能有未发送、待发送、发送待确认、发送已确认等状态;
在接收端呢,窗口中数据类型可能有接收并确认、接收未确认、待接收等状态;无论接收端还是发送端,窗口都会随着吞吐量的增加而滑动,但是我们实际中可能站在接收端或者观察接收端的情况较多,所以会认为它只是局限于接收端的一个说法。】

(问题:为何叫滑动窗口,怎么个滑动法?
TCP是基于字节流的传输协议,通过对发送的字节进行编号来维持可靠性,以及流量的计算,在实际发送中随着发送数据量的增加,这个编号值是不断增加的,并且窗口缓存的大小也是基于字节SN来计算,因此随着传输数据量的增加,这个SN不断增加,就好像窗口在移动,而实际上其值并未改变,因此称为滑动窗口,通过wireshark抓包后,通过图形曲线变化查看吞吐量以及窗口等是非常直观的,这里贴图不方便就不贴了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值