TCP流量控制协议
说明: 本文仅供学习交流。转载请标明出处,欢迎转载!
本文是下面文献相关内容的总结
[1] 《TCP/IP具体解释 卷1:协议》
[2] 《TCP/IP协议族 第4版》
[3] 《计算机网络 第5版》
TCP流量控制的目的是限制发送端的发送速率,使得接收方可以及时接收。
TCP主要是通过滑动窗体来实现流量控制的。实际上,发送窗体的大小不仅受接收窗体rwnd的大小的限制,还受拥塞窗体cwnd窗体的限制,为了实现点到点的流量控制,本文如果拥塞窗体足够大(即网络链路比較流畅),仅考虑发送窗体swnd受接收窗体的限制。
窗体由左臂和右臂组成。左臂右移称为关闭,右臂左移称为收缩,右臂右移称为打开。
发送窗体和接收窗体的移动操作
接收窗体:当接收方收到发送方的很多其它的字节时(不包含反复的报文段),接收窗体关闭。当接收缓存中的字节被接收进程pull时,接收窗体打开,通常接收窗体不会发送收缩操作。
发送窗体:发送窗体的关闭、收缩和打开受接收方的控制。当一个有效的确认时,发送窗体关闭;当接收方通告发送方同意的窗体大小能够更大时,发送窗体会打开。当接收方通告发送方同意的窗体大小更小时。发送窗体就收缩,可是TCP强烈不建议发送窗体收缩。
注意:TCP窗体的单位是字节。不是报文段。所以TCP窗体中,每一格相应1B。
利用滑动窗体进行流量控制过程
上图中,在发送端与接收端建立连接时,接收端告诉发送端当前接收窗体rwnd=400。所以发送端最多可以发送400B,如果每个报文段为100B。
发送端连续发送4个报文段。各自是1-100,101-200,201-300,301-400,401-500。发送后数据段101-200在路上丢失了,其它几个报文都被接收了。并放入到接收缓存中,接收方便向发送方发送1-200报文段的ACK。并期望收到序号为201相应的报文段。同一时候设置接收窗体大小rwnd=300,发送端便重传序号201相应的报文段。当接收端收到该报文段后,并向发送端发送前500个报文的ACK,并期望收到序号为501的报文段,并设置接收窗体rwnd=100。发送端收到该ACK报文段后,便向接收端发送序号为501-600的报文段,接收端收到该报文段后,发送ACK报文段。并设置rwnd=0,意在通知发送端不要临时再发送数据段。
糊涂窗体综合症
当发送应用程序产生数据的速度非常慢,或接收应用程序消耗数据的速度非常慢,或者两者都有,都会使得发送数据的报文段非常小,使得网络效率非常低,这个问题称为糊涂窗体综合症SWS(silly
window syndrome)。
发送方产生的症状
假设发送方应用程序产生数据的速度非常慢。比如一次仅仅产生1B,那么就有可能产生糊涂窗体综合症。解决办法是防止发送TCP一次仅仅发送1B。必须让发送TCP等待。并把数据收集成较大的数据块后再发送。
发送TCP须要等待多长时间再发送呢?
假设等待时间过长。则会延迟整个过程。
假设等待时间过短,最后非常可能还是发送一个个小报文段。Nagle提出了一种解决办法,我们称之为Nagle算法,过程例如以下:
1.发送TCP把它从应用程序收到的第一块数据发送出去。哪怕仅仅有一个字节;
2.在发送了第一个报文段后。发送TCP先把发送应用程序兴许到达的数据字节缓存起来。直到收到接收端发来的ACK,或者已积累了足够的数据。发送TCP就能够发送这个报文段了。
注意:足够的数据指的是数据达到0.5*MSS(最大报文段长度的一半)或者发送窗体大小的一半时。
接收方产生的症状
假设接收端应用程序pull速度非常慢,比如一次仅仅消耗1B的数据。若TCP接收方的缓存已满,而应用程序一次仅仅能从接收缓存中读取1B,然后向发送方发送ACK。并把窗体设置为1B(由于从接收缓存中取出了1B),但发送方的缓存中有非常多数据。这样发送方有仅仅能一次发送1B,接收方发回确认,仍然将窗体设置为1B,这样进行下去。网络的效率非常低,此时能够採取两种解决方法:
方法1:採用Clark解决方法。该方法是:接收端仅仅要有数据到达就向发送端发送零值窗体ACK报文段。直到(1)缓存中有足够大的空间能够放入1MSS报文段,或者(2)至少有一半的缓存空间空暇。仅仅要出现这两种情况之中的一个,接收端就向发送端发送非零值窗体ACK报文。
方法2:推迟确认。当报文段到达时并不马上发送确认,接收方在对收到的报文段进行确认之前一直等待,直至接收缓存有足够的空间为止。
推迟发送确认防止了发送TCP滑动它的窗体。
推迟确认的另外一个长处:降低了网络的通信量;相应的缺点是:假设推迟的时间比較长,会使得发送方以为发送的报文丢失,而产生不必要的重传。
总之。发送方和接收方能够配合解决该问题。整体的思想是:发送方不发送非常小的报文段的同一时候,接收方也不要在缓存刚刚有了一点小空间就急慌忙这个非常小的窗体大小的信息通知发件人。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
TCP流量控制协议的更多相关文章
- OSI七层模型详解 TCP/IP协议
总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...
- TCP/IP协议(一)网络基础知识
参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...
- TCP/IP协议学习笔记
计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...
- 计算机网络中的TCP/UDP协议到底是怎么回事(二)
上一篇博客阐述了TCP/IP五层网络结构模型以及一些关于TCP.UDP的基础知识,这篇博客会接着写一些关于TCP拥塞控制的算法以及对TCP中常有的疑问进行解答. TCP拥塞控制 首先了解几个概念,为下 ...
- OSI 七层模型和 TCP/IP 协议比较
OSI (Open System Interconnection), 开放式系统互联参考模型.从下到上七层模型功能及其代表协议: 物理层(Physical) :规定了激活.维持.关闭通信端点之间的 ...
- TCP/IP 协议理解
TCP/IP 协议(Transmission Control Protocol / internet Protocol),因特网互联协议,又名网络通讯协议.通俗而言:TCP负责发现传输的问题,一有问题 ...
- ISO/OSI网络体系结构和TCP/IP协议模型
1. ISO/OSI的参考模型共有7层,由低层至高层分别为:物理层.数据链路层.网络层.传输层.会话层.表示层. 应用层.各层功能分别为: (1)物理层 提供建立.维护和拆除 ...
- 15、TCP/IP协议
15.TCP/IP协议 几台孤立计算机系统组在一起形成网络,几个孤立网络连在一起形成一个网络的网络,即互连网.一个互连网就是一组通过相同协议族互连在一起的网络. 互联网的目的之一是在应用程 ...
- 浅析TCP/IP 协议
TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族. TCP/IP协议模块关系 从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层.网络层.传输层.应用层 ...
随机推荐
- Android开发框架SmartAndroid2.0 强劲框架
SmartAndroid 是一个功能强劲的 Android 框架,作为一个简单而"优雅"的工具库包,它能够为 Android 开发人员建立功能完好的Android 应用程序. 经过 ...
- HTML5游戏开发实战--当心
1.WebSocket它是HTML5该标准的一部分.Web页面可以用它来连接到持久socketserver在.该接口提供一个浏览器和server与事件驱动的连接.这意味着client每次需要时不再se ...
- HDU-2857-Mirror and Light(计算几何)
Problem Description The light travels in a straight line and always goes in the minimal path between ...
- Xcode 凝视代码
#pragma mark ---------------凝视信息-------------------- -(void)RequestSP { // MARK: 凝视信息 // TODO: 凝视信息 ...
- java提高篇(十一)-----代码块
在编程过程中我们可能会遇到如下这种形式的程序: public class Test { { //// } } 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起, ...
- TestNg显示器(一个)-----监听器,类型和配置使用---另外META-INF详细解释
原创文章,版权所有所有.转载,归因:http://blog.csdn.net/wanghantong/article/details/40404939 TestNg提供了听众和拦截多种接口开发我们自己 ...
- DataTable填补了实体类返回泛型集合
坤哥见我昨天找了一段代码,如下面: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我,假设实体有500多个属性,难道也要 ...
- Swift开发学习(两):Playground
Swift开发学习:Playground 大约 对于软件用户.游戏玩家,我一直提倡用户体验.也是用户,是各种开发工具的使用者.也会喜欢用户体验做得好的工具软件.这次苹果想开发人员所想,提供了一个能够玩 ...
- 依据Uri获得sd卡图片
<pre name="code" class="java">String mBigImage = URLEncoder.encode(mImageU ...
- HDU 1272 小希迷宫(并检查集合)
意甲冠军:被判处无向图无环和连接无处不在 思考:并检查集合,trap 您可能有一个直接输入0 0 并且....合并的时候按某一个方向会爆栈,爆了好几次...下次考虑一下直接递归找祖先吧 #includ ...