TCP/IP复习笔记(三)之流量控制

TCP数据包头复习

还记得TCP的数据包头中有个窗口大小的字段吗?

在TCP/IP复习笔记(一)中是这样写它的作用的:

窗口(2字节):表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制。

现在是时候来好好复习一下这个字段了。

首先,窗口字段的单位是字节

窗口字段指示的是本方的接收窗口的大小。

比如,A给B发送数据,A的发送窗口时20, 接收窗口是30,那么A发送给B的数据封包包头的窗口字段就是20。

为什么要这样呢?

因为这样B就知道了A的接收窗口大小来调整自己的发送窗口大小,以此来控制自己的发送速率与A的接收速率一致。

原理–变长滑动窗口

上面复习到,发送方与接收方通过互相协商(通过窗口大小字段)来各自调整自己的窗口,达到流量控制的目的。

那么,是怎么做的的?

上篇中复习到TCP协议有一个滑动窗口机制,通过滑动窗口来一次性发送和接收多个数据包。

而加入流量控制功能以后呢?

滑动窗口就变成了大小可伸缩的了。

当接收方的接收窗口变大时,发送发也相应增大自己的发送窗口;当接收方的接收窗口变小时,发送方也就适当收缩一下自己的发送窗口(不会是随便收缩)。

问题

零窗口

当接收方缓存已满不能接收时(接收窗口变为0),就会发送一个零窗口报文,不允许发送发发送数据。

现在假设这样一种情况,过了一段时间后,接收方能接收数据了。于是接收方就向发送发发送一个窗口大小为400的报文,但是,这个报文在路上丢失了。

这样的话就造成了一种发送方在等待接收方发送可发送数据的通知,接收方又在等待发送发发送数据的死锁局面。

于是,为了解决这个问题,TCP使用了一种持续计时器(persistence timer)的方法。

只要有一方收到了零窗口的报文后,就设置一个持续计时器,计时器的时间到期后就会发送一个零窗口探测报文段。另一方收到这个通知报文段后就给出自己的接收窗口值。如果这个接收窗口值还是0,就重置持续计时器。如果不是0,就可以发送数据啦。

糊涂窗口综合症

还有这么一种情况。

接收方的缓存已经满了,而上层应用一次只能从缓存中取走一个字节,然后接收方向发送方发送窗口大小是1字节的确认报文(注意,报文头要40字节),接收方收到确认报文后,又向接收方发送1字节的数据(发送方的数据字节现在是41字节,只有1字节是数据)。接收方接收后,又重复以上的过程。

长此以往,就会造成TCP的通信效率低下。

TCP给出的解决方法是等到接收方的缓存能够容纳的下一个最长的报文段或等到接收缓存已经有一半的空闲空间,再发送确认报文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值