TCP到底怎么流量控制?

转载于 技术原理君

原文链接:https://mp.weixin.qq.com/s/4vKaZwzpzwEGZdELnruFVw

 

我们都知道TCP是一种可靠的,面向连接的传输层协议。我们总是希望TCP能够传输的数据越快越好。如果存在这样一种情况,发送方数据发送的非常快,而且接收方耗尽自己的资源也根本来不及接收,那这些多余的数据就会被丢弃,这就违背了TCP可靠的宗旨了。

 

所以就需要引入一种流量控制的手段:让发送方不要发送太快,既让接收方能够顺利接收数据,而且也不会造成网络链路的阻塞。

 

 

思路

沿着这个思路:让发送方不要发送的太快。那就让接收方控制发送方的数据大小,每次应答的时候通知发送方自己还剩多少空间可以接收数据。当然实际交互没有这么的简单,只是提供了一种思路。利用这种思路,诞生了滑动窗口的方式。

 

滑动窗口

滑动窗口类似一个窗口,是用来告诉发送方可以发送数据的大小。也可以说是窗口标记了接收方缓冲区的大小。窗口大小也就表示一次能发送多少数据量,而且这个窗口可以滑动,滑动窗口因此得名。

 

怎样告知发送方窗口大小?

怎样通知发送方窗口大小呢?难道要重新发送一包数据告诉对方吗,这显然是不合理的。可以巧妙的使用确认应答包。有了确认应答包还是不够,如果是第一次交互呢?所以还需要在三次握手时候,就需要告知对方。(rwnd表示接收窗口)

 

 

在原来的确认应答策略中,每一次发送数据,都需要Ack应答,在接收到Ack之后才会发送下一个数据段,发送方没有接收到Ack应答呢?这样做的方式效率实在太低。使用了滑动窗口,可以多次发送数据,只要不要超过对方窗口大小。这样就大大提高了效率。

 

滑动窗口细节

  1. 接收方将自己能够接收的缓冲区大小是在TCP首部中的“窗口大小”字段表示的,通过Ack通知发送方。

  2. 窗口大小是发送方可以发送的最大值,也就是说可以不需要Ack应答,可以发送多次数据,前提发送总数据量不要超过窗口大小。

  3. 窗口大小大说明网络的吞吐率高

  4. 操作系统内核维护了一块接收缓冲区,只有Ack应答之后的数据才能从缓冲区中删除。

  5. 接收方一旦发现自己的缓冲区快满了,就会通知对方自己的窗口为更小的值。

  6. 如果接收方发现自己的缓冲区满了,就会将窗口的大小设置为0,此时发送方将不再发送数据,但是需要定期发送一个窗口探测数据段,使接收方把窗口大小告诉发送方 。(针对这一点重点说明下为什么需要定期发送窗口探针?可以想象下,如果接收方缓冲区满了,然后通过Ack告知发送方窗口大小为0。发送方从此不会发送数据给接收方,接收方也没办法告知对方自己缓冲区可以接收数据,就会出现“卡死”的情况

 

实例

A 向 B 发送数据。在连接建立时,B 告诉 A:“我的接收窗口 rwnd = 400(字节)。注意:图中的箭头上面大写的ACK表示首部中的确认位ACK,小写ack表示确认字段的值。

上面的过程是这样的:

  1. A发送了数据序号1至100,还能发送300字节
  2. A发送了数据序号101至200,还能发送200字节
  3. A发送了数据序号201至300,但是丢失了数据
  4. B发送了ACK,同时通知A,允许A发送序号201至500,300字节
  5. A发送了数据序号301至400,还能发送100字节
  6. A发送了数据序号401至500,不能发送数据了
  7. A超时重传旧的数据,但不能发送新数据
  8. B发送了ACK,同时通知A,允许A发送序号501至600,100字节
  9. A发送了数据序号501至600,不能发送数据了
  10. B发送了ACK,同时通知A,不允许A发送数据

 

 

END

 

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务