那年那夏那些不太明白的TCP2

流量控制

流量控制的根本目的是防止分组丢失,是构成TCP安全性的一个方面。 如果发送者发送数据过快, 接收者来不及接收, 就会发生分组丢失。为了控制发送者的发送速度,跟接收端的接受速度更好的配合,就有了流量控制。通过滑动窗口来实现。
【】
滑动窗口

  • 如果没有滑动窗口,则客户端发送一个报文段后,就得停下来等待服务端的ACK确认。也正是这种方式,保证了TCP传输的可靠性,因为客户端在一定的时间内没有收到服务端的确认ACK后,就会进行重发。但是,这种方式效率不高,需要优化。
    在这里插入图片描述

  • TCP连接的两端都分别维持着一个发送窗口和一个接收窗口。(因为TCP是全双工的)。TCP头部中的窗口大小指的是接收窗口的大小。

  • 只有接收到了接收方的确认信号,发送窗口才会进行移动,将已经确认的段移除缓冲区。
    在这里插入图片描述

  • 窗口大小: 指无需等待确认应答,可以继续发送数据的最大值。该值是动态变化的(因为接收端的接收窗口是动态变化的),接收端每次发送确认ACK时,都会携带窗口的大小。
    在这里插入图片描述

  • 使用窗口控制发送的好处: 有时即便某个ACK发送方没有接收到,也不会进行重发,因为连续发送了好几个报文段,只要收到了后面的ACK, 前面的ACK发生了丢包也不会产生影响。但是如果,发送方发送的连续的报文段中,有一个发生了丢包,那么在接收端就会连发送ACK(假设值为x), 来告诉发送端未收到序列号为x的报文段,当发送端连续收到三个同样的ACK后,就会进行重发丢失的报文段。
    流量控制引发死锁? 如何避免?

  • 当发送者收到一个Win=0 (窗口为0)的应答, 发送者便停止发送,(因为此时,接收方的TCP缓冲,也就是接收窗口已满。)等待接收者的下一个应答。如果下一个窗口不为0的应答在传输过程中丢失,发送者就会一直等待下去,而接收者以为发送者已经收到该应答,一直在等待接收新数据,这样双方都在互相等待,产生了死锁。

  • 为了避免流量控制引发的死锁, 使用持续计时器。当发送者收到一个窗口为0的应答后,就开启该计时器。时间一到便主动发送报文询问接收者的窗口大小,避免死锁发生。

拥塞控制

有了TCP的窗口控制,发送端便可以在没有收到ACK应答前一次连续发送大小的数据,提高通信效率。可是事情往往不是那么美好,计算机网络是一个共享的环境,当网络出现拥塞时,仍然发送较大量的数据,会造成整个网络的瘫痪。(你自己发送大量的数据应该问题不大,但是如果网络中的设备都采取不考虑网络环境的策略,发送大量的包,就会容易造成网络的瘫痪。)。TCP为了防止该问题的发生,采取了拥塞控制。

  • 慢启动:意思就是不要一开始就发送大量的数据。这里又引入了两个个新的概念,拥塞窗口(cwnd)。 传输数据时,由小到大逐渐增大拥塞窗口的大小,每收到一个ACK, 拥塞窗口就增加一个MSS的大小。慢启动门限(ssthresh).
  • 对一个给定的连接, 初始化cwnd为1个报文段(即MSS),ssthresh为65535个字节。
  • 拥塞避免:当拥塞发生时(超时或者收到重复确认),ssthresh被设置为当前窗口的一半(cwnd和接收端的接收窗口的最小值,但至少为2个报文段)。如果是超时引起阻塞,则将cwnd设置为1个报文段。当新的数据对对方确认后,继续增加cwnd, 但是这是与慢启动不同,需要先判断是正在慢启动还是拥塞避免。如果cwnd小于或者等于ssthresh, (注意,此时的ssthresh已经变为了原来的1/2),则正在进行慢启动,否则正在进行拥塞避免。慢启动是每收到一个确认就加1,因此会发生指数增长。拥塞避免要求每收到一个确认增加1/cwnd,因此在拥塞避免下cwnd增长的速度要慢的多。当cwnd等于或大于ssthresh时, 就执行拥塞避免算法的cwnd增长方式。
  • 快重传: 当发送端收到三个同样的ACK时,就认为对应的某个报文段没有成功到达接收端, 进入快重传阶段,接收方在收到一个失序的报文段后就i立即发出重复确认ACK,(使发送方及早直到有报文段没有到达接收端),发送方重传丢失的数据报文段,而无需等待超时定时器溢出。
  • 快恢复:当发送方收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段, 设置cwnd为ssthresh加上3倍的报文段大小(MSS). 每次收到哟个重复的ACK, cwnd就增加一个报文段大小。当下一个确认新数据的ACK到达时, 设置cwnd为ssthresh. 即当分组丢失时,我们将当前的速率减半。

流量控制 vs 拥塞控制

  • 流量控制是接收方作用于发送方的,用于控制发送方的发送速度,防止分组丢失,保证传输的可靠性。
  • 拥塞控制作用于网络。为了防止过多的数据注入到网络中,避免出现网络负载过大的情况。常用方法: (1)慢开始,避免拥塞 (2)快重传、快恢复。
  • 流量控制是接收方控制的,拥塞控制是发送方主动控制的。

Nagle算法

Nagle算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组(小指的是小于MSS)。

延迟ACK

  • 如果TCP对每个数据包都发送一个ack确认,那么只是一个单独的数据包为了发送一个ACK, 代价比较高,所以tcp会延迟一段时间。如果这段时间内有数据发送到对端,则捎带着ack, 如果在延迟ack定时器触发的时候,发现ack尚未发送,则立即单独发送。(所以,我们可以看到在流量控制中,往往是用一个ack确认了好几个报文段)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值