TCP的滑动窗口与拥塞控制

  • TCP的可靠传输
  • 数据能够到达对方
  • 到达的数据不重复,不乱序
  • 到达的数据不失真
    - 实现方法
    1.超时重传
    2.应答确认
    3.滑动窗口
    4.拥塞控制

- 滑动窗口机制

保证发送方发送数据的速率与接收方接收数据的速率相匹配
滑动窗口分为**接受窗口**和**发送窗口**
滑动窗口协议是传输层进行流控的一种措施,接收方告诉发送方自己窗口的大小,从而控制发送方的发送速度
**滑动**:发送方首先根据接收窗口决定本端的能够发送的数据窗口。这个窗口的位置会随着收到接收方的确认报文段不断的向后滑动,并且窗口大小也会随着接受窗口的值,大小也会不断变化。
**窗口**:TCP头部结构中16位的窗口大小
**接收窗口**:它由接收方填充,来通告发送方当前接收方的接收缓冲区中还能容纳的数据大小。决定了发送方能够发送的数据的窗口大小。(接收窗口会随着接收方的应用程序的数据处理动态变化)

在这里插入图片描述在这里插入图片描述
- 滑动机构的死锁状态
概述: 当接收端向发送端发送零窗口报文段后,接收端的接收缓存又有了一些存储空间,于是接收端向发送端发送了size = 2的报文段,然而这个报文段在传输过程中丢失了。发送端一直等待收到接收端发送的非零窗口的通知,而接收端一直等待发送端发送数据,这样就死锁了。
解决方法: TCP为每个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
- Nagle算法
主旨:避免大量发送小包
初衷:避免发送大量的小包,防止小包泛滥于网络,在理想情况下,对于一个TCP连接而言,网络上每次只能有一个小包存在。它更多的是端到端意义上的优化。
发送方将第一个数据字节发送出去,把后面到达的数据字节缓存起来。当发送方接收对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段再发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认之后,才继续发送下一个报文段。规定一个TCP连接最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其它的小分组。当数据到达较快而网络速率较慢时,用这样的方法可以明显的减少所用的网络带宽。
Nagle算法还规定:当达到的数据已经达到发送窗口大小的一半或者已经达到报文段的最大长度时,就可以立即发送一个报文段。
- 糊涂窗口综合症
概述:TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存区中读取1字节(这样就使接收缓存空间仅腾出1字节),然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报为40字节的话),然后,发送方又发来1字节的数据(发送方的IP数据报是41字节),接收方发回确认,仍将窗口设置为1个字节,这样,网络效率就会很低
解决办法:对于接收方而言, 延迟ACK可以拖延ACK发送时间,进而延迟窗口通告,在这段时间内,接收窗口有机会进一步放大。对于发送方而言, 不理会接收端的小窗口通告等于说不马上1发送小包,小包有时间积累成大包

- 拥塞控制

控制发送方发送数据的速率与当前网络环境相匹配

  1. 慢启动
    假设当前发送方拥塞窗口cwnd的值为1,而发送窗口swnd等于拥塞窗口cwnd,因此发送方当前只能发送一个数据报文段(拥塞窗口cwnd的值是几,就能发送几个数据报文段),接收方收到该数据报文段后,给发送方回复一个确认报文段,发送方收到该确认报文后,将拥塞窗口的值变为2,
  2. 拥塞避免
    也就是每个传输轮次,拥塞窗口cwnd只能线性加一,而不是像慢开始算法时,每个传输轮次,拥塞窗口cwnd按指数增长。同理,16+1……直至到达24,假设24个报文段在传输过程中丢失4个,接收方只收到20个报文段,给发送方依次回复20个确认报文段,一段时间后,丢失的4个报文段的重传计时器超时了,发送发判断可能出现拥塞,更改cwnd和ssthresh.并重新开始慢开始算法
  3. 快速重传
    发送端一旦接收一个确认应答后,又连续三次接收到相同的确认应答,则认为数据段已经丢失,需要进行重发,这时会立即进行重发二不必等到超时,这种机制比起超时机制可以提供更为快速的重传服务。
  4. 快速恢复
    当发送方连续收到三个重复确认,执行乘法减小,ssthresh减半。由于发送方可能认为网络现在没有拥塞,因此与慢开始不同,把cwnd值设置为ssthresh减半之后的值,然后执行拥塞避免算法,线性增大cwnd
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值