TCP流量控制

前言

流量控制也是TCP一个很重要的功能。在前面TCP可靠传输的实现 中已经提到了一个移动窗口的概念。通信双方都各自维护自己的发送窗口和接收窗口,发送方根据接收方的TCP首部的窗口字段调整自己的发送窗口大小。

流量控制

那今天要提到的流量控制就是让发送方的速率不要太快,使接收方来得及接收。若来不及接收可能会导致信息丢失(缓冲区溢出?)。

其实前面TCP可靠传输那篇文章提到的窗口的移动就是流量控制的关键,接下来来看一个例子使这个概念更清晰。

情景
A向B发送数据,建立连接时,B的接收窗口大小 为 400,然后每一个报文段是100字节长。看看下面的过程。
发送了在这里插入图片描述
这里一共进行了几次流量控制?
1、rwnd 变成300
2、rwnd 变成100
3、rwnd 变成0
流量控制本质:使用自己的窗口值,使发送方调整它的发送窗口。

一个问题

设想:A发送完数据后发送窗口为 0 ,B处理完一些数据后接收窗口变大,于是发送报文告诉A新的 rwnd值,但是,这个报文不幸丢失了,此时A一直在等待收到B发送的非0窗口的通知,B也一直等待A的数据,造成死锁局面。

这能怎么办呢? TCP的方法是设置了一个计时器,只要TCP一方收到0窗口通知,就启动计时器,若时间到了,就发送一个 零窗口探测报文(1字节数据),对方会确认这个报文并给出rwnd值。如果是 0 重新设置计时器,否则设置发送窗口。

一些问题

报文的发送时机对TCP的传输效率影响很大,也影响了流量控制。我们知道,应用程序
将数据传送到TCP的缓冲区后,接下来就由TCP决定发送时机了。

问题一: 如果每次发送都只发送很少的数据(比如1字节),那开销浪费太多了。

解决方案: nagle算法是现在TCP实现中广泛使用的方法。
1、应用程序将要发送的数据传进TCP发送缓冲区
2、先将第一个字节发送过去,后续到的数据存进缓冲区
3、若第一个字节收到回应,则将缓冲区中所有数据组成数据报一起发送过去
4、对于后面的数据报,只有前一个数据报收到回复后才能继续发送
5、同时规定:到达数据达到发送窗口一半 或 达到最大报文数据,就发送,能提高吞吐量

问题二:糊涂窗口综合征
自己皮,每次只读一个字节,然后发送rwnd给对方,这样 发送方每次发 41字节(40首部),使网络效率很低。

解决方案
1、接收方等待,等到接收缓存足够大(一半),再通知发送方

注意,nagle和下面的方法分别对应发送方和接收方,可以配合使用。
不要发送太小的报文,也不要刚有一点接收缓存就通知对方。

参考书籍
《计算机网络》谢希仁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值