一、TCP流量控制
如果发送方发送速率过快,接收方可能来不及接收,会造成数据的丢失,降低吞吐率。
流量控制就是控制发送方的发送速率,使接收方来得及接收。
1. 滑动窗口实现流量控制
滑动窗口机制可以方便地实现TCP连接上的流量控制。接收方回送确认时,将给出自己的接收窗口,发送方根据对方的接收窗口确定自己的发送窗口,就可以实现流量控制。
在这个过程中,试想一种情况:B向A发送零窗口报文后,A等待B发送非零窗口通知;但B发送非零窗口通知时,该报文偶发丢失了。此时,A一直等待B发送非零窗口通知,而B等待A发送新的报文段;A与B循环等待,形成了死锁。
为避免死锁的出现,TCP连接设有一个持续计时器。当TCP的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器到达设置的时间,就给接收方发送一个零窗口探测报文段(仅1字节)。接收方收到该报文段后,回送当前的接收窗口值。若rwnd仍为0,则持续计时器重新计时;否则,发送方就可以开始发送数据。
2. 传输效率问题
对于TCP,有三种不同的机制来控制TCP报文段的发送时机:
- TCP维持一个等于最大报文段长度MSS的变量,当缓存中存放数据到达MSS字节时,组装成一个TCP报文段发送;
- 由发送方进程指明要求发送报文段,即PUSH操作;
- 发送方的一个计时器期限到了,就把当前缓存数据装入报文段发送。
尽管有这三种机制,但报文段的发送时机控制仍然是一个复杂的问题。主要遇到的问题是:
● 发送方糊涂窗口综合症
在某些进程(如Telnet服务)中,发送方可能每接收一个字节,就会开始发送报文段。这样,一个字节的数据加上TCP报文段和IP数据报的首部,就需要发送41字节的IP数据报。在这个数据报中,有效数据仅有一个字节,传输效率极低。
为解决此问题,TCP实现广泛采用了Nagle算法,其内容为:
- 当进程需要逐字节发送数据时,首先将第一个数据字节发送出去,后续的字节都缓存起来;
- 每当收到前一个报文段的确认时,把缓存中的数据组装成一个报文段发送;
- 若缓存中数据达到发送窗口大小的一半或者报文段最大长度时,立即发送一个报文段。
Negla算法可以在数据到达较快而网速较慢时,明显减少使用的网络带宽,并有效提高吞吐量。
● 接收方糊涂窗口综合症
TCP接收方的缓存已满,而应用进程每次只从缓存中读取一个字节,然后向发送方发送确认,且窗口值为1;接着发送方再发送41字节长的数据报(有效数据1字节)。这样进行下去,网络传输的效率极低,并且会导致网络性能恶化。
为解决此问题,可以让接收方等待一段时间,使其在已有足够空间容纳一个MSS报文段或已有一半的空闲缓存时,再发送确认报文,通知接收窗口的大小。
Negla算法和接收等待配合使用,可以有效提高TCP的传输效率。
二、TCP拥塞控制
1. 拥塞的产生
计算机网路中,链路的带宽、结点的缓存和处理机等,都是网络资源。
在某个时间段,若对网络中某一资源的需求超过了该资源所能提高的可用部分,网络性能就会恶化。这种现象就是拥塞。
拥塞出现的条件: 对资源的需求 > 可用资源