异想天开

What's the true meaning of light, Could you tell me why

TCP流量控制和拥塞控制

日期:2015-06-01 22:50:16
  
最后更新日期:2015-06-29 10:23:07
谢希仁《计算机网络》 p203-p212

1.流量控制
为什么需要流量控制,因为位于网络的两台主机的数据处理速度可能不一致,如果发送方发送数据过快,接收方就有可能来不及接收,造成数据丢失。流量控制就是告诉发送方发送速率不要过快,让接收方来得及接收和处理。

1.1利用滑动窗口实现流量控制
TCP报文的窗口字段明确指出了现在准许对方发送的数据量,表示此刻接收方还有多少接收缓存空间。窗口值是经常变化的。
练习:
写个服务端程序,服务端一直不执行read操作,客户端不断向服务端发送数据,利用tcpdump观察TCP窗口值的变化


图中接收端进行了三次流量控制,最后减到rwnd=0,不能再发送数据了。

若接收端B发送了零窗口报文段不久后,B的接收缓冲又有了一些存储空间,于是B发送了一个rwnd=400的报文,若这个报文丢失了,而A一直等待B的窗口值非零报文段?
解决办法:
TCP设置一个计时器,发送端每隔一段时间,发送携带1字节的数据的零窗口探测报文段。若接收到的答复段的窗口值为非0,则继续发送数据;若答复段的窗口值为0,则持续探测,又启动计时器。
TCP规定零窗口探测报文即使接收缓冲为0也必须接收

1.2
应用程序把数据传送到TCP发送缓冲后,剩下的发送任务就是由TCP来控制了,利用不同的机制来控制TCP报文段的发送时机。
可以有:
a.缓冲数据积累到一定大小发送,可以是最大报文段长度MSS
b.TCP支持推送push操作,即发送方应用程序指定立即发送
c.设置计时器期限,当期限到了,不论是否超过MSS,都立即发送

TCP实现中广泛使用的Nagle算法。
Nagle算法是用他的发明人John Nagle名字命名的。
该算法要求一个TCP连接最多只能有一个未经确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。
该算法的优越在于它是自适应的,若确认到达越快,数据也就发的越快。而在低速的广域网上,则能有效减少分组。
例子:假设应用程序逐个字节传送到TCP发送缓冲,那么发送方可以先发送第一个字节,然后缓冲后面的字节,等收到确认后,再把缓冲的数据用一个包发送出去,然后再缓冲,收到确认后,再发送,一直这样下去
好处:
节约了带宽,若逐个字节的发送,TCP报头和IP报头消耗不少


同样若接收端每腾出一个字节的缓冲,就告知发送端一下,也会使网络利用效率下降。解决办法就是接收端等稍微多喘口气,再告知发送端

2.TCP拥塞控制
涉及策略,慢开始(slow),拥塞避免(congestion avoidance),快重传(fast retransmit)和快恢复(fast recovery)。拥塞窗口(congestion window)。
流量控制的目的就是为了避免网络拥塞?
若网络中的主机,都非常自私,一开始就按最大块头发送数据,那么可以想象很容易阻塞网络,造成人人都用不了。

开始发送方的拥塞窗口设置为1,收到答复后,则拥塞窗口翻倍。这里的“慢”即初始值很慢。当达到阈值后,则线性增大,俗称加法增大,若发生了拥塞,即答复确认包丢失了,则拥塞窗口阈值乘法减小当前拥塞窗口大小的1/2,拥塞窗口又开始从1慢启动。

快重传
当接收方收到失序的报文段时,立即发出重复确认,而不是等自己发送数据时,捎带确认。
当发送方,接收到3个重复的确认后,立即重发,而不等重传计时器超时。
快恢复
采用快恢复算法,慢开始只有在TCP连接建立时和网络出现超时时才使用。

最后:
发送方控制拥塞窗口的原则是:只有网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只有网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
发送方的窗口值 = Min(rwnd,cwnd)