您的位置:首页 > 理论基础 > 计算机网络

了解TCP的流量控制

2017-10-02 12:04 190 查看

说明

本文基于《计算机网络》(第6版)进行总结

正文

流量控制

当发送方发送数据过快,接受方来不及接受,这样就会造成数据的丢失。此时,需要进行流量控制:让发送方发送的速率不要太快,要让接受方来得及接受。注意:流量控制与拥塞控制不同,流量控制往往指点对点通信量的控制,是个端到端的问题。

利用滑动窗口机制在TCP连接上实现对发送方的流量控制。

发送方的发送窗口不能超过接受方给出的接受窗口的数值。接受窗口=rwnd(receiver windown),TCP的窗口单位是字节,不是报文段。



可以看到接受方B进行了三次流量控制,设置了三次rwnd的值。在B向A发送的三个报文段都设置了ACK=1,只有在ACK=1时确认号字段才有意义。

可能会出现的问题:

当B向A发送了零窗口的报文段之后,B又有了存储空间,接着向A发送rwnd=400的报文段,若此报文段丢失,A就会一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这时,就会发生互相等待的死锁局面。

解决方案:

TCP为每一个连接设有一个持续即使器(persistence timer),只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节数据),而对方就在确认这个探测报文段时给出现在的窗口值,如果窗口值仍为零,则收到这个报文段的一方就重新设置持续计时器,否则,死锁就会被打破。

传输效率

当应用程序把数据传送到TCP的发送缓存后,剩下的发送任务就由TCP控制。

不同发送机制:

TCP维持一个变量,等于最大报文段长度MSS,只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去

由发送方的应用进程指明要求发送报文段,即TCP支持推送(push)操作

发送方持有一个计时器,期限一到,就把当前缓存数据装入报文段(长度不能超过MSS)发送出去

使用Nagle算法控制:

算法描述: 若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来,当收到对第一个数据字符的确认后。再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。

算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度是,就立即发送一个报文段。

另一个可能出现的问题:

糊涂窗口综合征(silly window syndrome),就是当TCP接受方缓存已满,而应用进程一次中从缓存中读取一个字节(腾出1字节空间),然后发送确认,并把窗口设置为1字节,发送接受后发送1字节数据,如此反复,使用网络的效率很低。

解决方案:

可以让接受方等待一段时间,使缓存有足够的空间容纳一个最长的报文段,或者使缓存已有一半空闲的空间。此外,发送方也不要发送太小的报文段,而是把数据积累成足够大的报文段,或达到接收方缓存的空间的一半大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息