概述
在进行数据传输时,我们总希望在最短的时间内完成数据的发送,,但如果发送方发送的太快,接收方来不及接收,就会造成数据丢失。而流量控制就是为了让发送方保持一个合适的发送速率,不要太快,要让接收方来得及接收。
流量控制其实就是接收窗口变化的过程,这里直接通过图解来稍加说明:
如上图,接收方进行了三次流量控制。
此时有一个问题,我们看到,在最后一次流量控制时,接收窗口已经满了,不能再接收数据了,这个时候只有当接受端再重新发出一个新的窗口值为止,但是,如说重新发出的这个窗口信息丢失了,那此时接收方和发送方都不知道对方是什么情况,这是就形成了一种僵局。
解决方法:TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就会启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段,此报文段仅携带一字节的数据,而对方就在确认这个探测报文段时给出了自己现在接受窗口值,如果窗口仍然是0,那么收到这个报文段的一方就重新设置持续计时器;如果窗口不为0,那么死锁的僵局就可以打破了。
TCP的传输效率
在应用进程把数据传送给TCP缓存后,由TCP来控制发送。这里的发送机制有三种:
一、TCP维持一个变量,它等于最大报文长度MSS,只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去。
二、由发送方的应用进程明确要求发送报文段,即TCP支持的推送操作(PUSH)。
三、发送方设置一个计时器,计时器期限到了,这是就把当前已有的数据装入报文段发送出去(但长度不能超过MSS)。
此时我们需要考虑这样一个问题,我们现在只需要发送一个字节的数据,那么这一个字节加上20字节固定的TCP头部和20字节的固定IP首部的话,就构成了41字节的IP数据报,在接收方收到这一个字节数据之后,会会送40字节的确认信息。这样,我们仅仅仅发送了一个字节的数据,竟然大动干戈的构成了41字节的数据报,这个效率实在是有是太低了。
TCP给出的解决办法是使用Nagle算法:
若发送应用进程把要发送的数据逐个字节地发送到TCP的发送缓存,则发送方先将第一个字节发送出去,在收到对这个字节的确认信息前,我们先将后面到达的数据字节都缓存起来。当发送端收到确认信息后,再将此时缓存中的数据组装成一个报文段发送出去,同时继续缓存后边的数据,只有收到对前一个报文段的确认信息之后,才继续发送新的报文段。循环上述步骤Nagle还规定,当到达的数据已达到发送窗口大小的一般或者达到最大报文段的长度时,就立即发送一个报文段。
另外一个问题叫做糊涂窗口综合征,其实和上述问题差不多,主要区别就是上边是发送方设置每次只发送一个字节而引起效率低下;而这个问题是,接收方每次的接收窗口就只有一个字节,发送方被迫每次只能发送一个字节,这个效率也太低了。
解决方法和上述也相似,接收窗口只有一个字节,说明它剩余的缓存空间只要一个字节,此时我们暂时先不发送确认信息,先等待一段时间,等接收缓存有足够容纳一个最长的报文段时或者等到接收缓存有一半的空间时,再发送确认信息。
最后
以上就是畅快铅笔为你收集整理的TCP可靠传输-流量控制的全部内容,希望文章能够帮你解决TCP可靠传输-流量控制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复