TCP协议作为⼀一个可靠的⾯面向流的传输协议,其可靠性和流量量控制由滑动窗⼝口协议保证,⽽而拥塞控制则由控制窗⼝口结合⼀一系列列的控制算法实现。⼀一、滑动窗⼝口协议关于这部分⾃自⼰己不不晓得怎么叙述才好,因为理理解的部分更更多,下⾯面就⽤用⾃自⼰己的理理解来介绍下TCP的精髓:滑动窗⼝口协议。所谓滑动窗⼝口协议,⾃自⼰己理理解有两点:1. “窗⼝口”对应的是⼀一段可以被发送者发送的字节序列列,其连续的范围称之为“窗⼝口”;2. “滑动”则是指这段“允许发送的范围”是可以随着发送的过程⽽而变化的,⽅方式就是按顺序“滑动”。在引⼊入⼀一个例例⼦子来说这个协议之前,我觉得很有必要先了了解以下前提: -1. TCP协议的两端分别为发送者A和接收者B,由于是全双⼯工协议,因此A和B应该分别维护着⼀一个独⽴立的发送缓冲区和接收缓冲区,由于对等性(A发B收和B发A收),我们以A发送B接收的情况作为例例⼦子; -2. 发送窗⼝口是发送缓存中的⼀一部分,是可以被TCP协议发送的那部分,其实应⽤用层需要发送的所有数据都被放进了了发送者的发送缓冲区; -3. 发送窗⼝口中相关的有四个概念:已发送并收到确认的数据(不不再发送窗⼝口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗⼝口之中)、允许发送但尚未发送的数据以及发送窗⼝口外发送缓冲区内暂时不不允许发送的数据; -4. 每次成功发送数据之后,发送窗⼝口就会在发送缓冲区中按顺序移动,将新的数据包含到窗⼝口中准备发送;TCP建⽴立连接的初始,B会告诉A⾃自⼰己的接收窗⼝口⼤大⼩小,⽐比如为‘20’:字节31-50为发送窗⼝口
A发送11个字节后,发送窗⼝口位置不不变,B接收到了了乱序的数据分组:
只有当A成功发送了了数据,即发送的数据得到了了B的确认之后,才会移动滑动窗⼝口离开已发送的数据;同时B则确认连续的数据分组,对于乱序的分组则先接收下来,避免⽹网络重
复传递:
⼆二、流量量控制流量量控制⽅方⾯面主要有两个要点需要掌握。⼀一是TCP利利⽤用滑动窗⼝口实现流量量控制的机制;⼆二是如何考虑流量量控制中的传输效率。
1. 流量量控制所谓流量量控制,主要是接收⽅方传递信息给发送⽅方,使其不不要发送数
据太快,是⼀一种端到端的控制。主要的⽅方式就是返回的ACK中会包含⾃自⼰己的接收窗⼝口的⼤大⼩小,并且利利⽤用⼤大⼩小来控制发送⽅方的数据发送:
这⾥里里⾯面涉及到⼀一种情况,如果B已经告诉A⾃自⼰己的缓冲区已满,于是A停⽌止发送数据;等
待⼀一段时间后,B的缓冲区出现了了富余,于是给A发送报⽂文告诉A我的rwnd⼤大⼩小为400,但是这个报⽂文不不幸丢失了了,于是就出现A等待B的通知||B等待A发送数据的死锁状态。为了了
处理理这种问题,TCP引⼊入了了持续计时器器(Persistence timer),当A收到对⽅方的零窗
⼝口通知时,就启⽤用该计时器器,时间到则发送⼀一个1字节的探测报⽂文,对⽅方会在此时回应⾃自
身的接收窗⼝口⼤大⼩小,如果结果仍未0,则重设持续计时器器,继续等待。
2. 传递效率⼀一个显⽽而易易⻅见的问题是:单个发送字节单个确认,和窗⼝口有⼀一个空
余即通知发送⽅方发送⼀一个字节,⽆无疑增加了了⽹网络中的许多不不必要的报⽂文(请想想为了了⼀一个字节数据⽽而添加的40字节头部吧!),所以我们的原则是尽可能⼀一次多发送⼏几个字节,或者窗⼝口空余较多的时候通知发送⽅方⼀一次发送多个字节。对于前者我们⼴广泛使⽤用Nagle算法,即:1. 若发送应⽤用进程要把发送的数据逐个字节地送到TCP的发送缓存,则发送⽅方就把第⼀一个数据字节先发送出去,把后⾯面的字节先缓存起来;2. 当发送⽅方收到第⼀一个字节的确认后(也得到了了⽹网络情况和对⽅方的接收窗⼝口⼤大⼩小),再把缓冲区的剩余字节组成合适⼤大⼩小的报⽂文发送出去;3. 当到达的数据已达到发送窗⼝口⼤大⼩小的⼀一半或以达到报⽂文段的最⼤大⻓长度时,就⽴立即发送⼀一个报⽂文段;对于后者我们往往的做法是让接收⽅方等待⼀一段时间,或者接收⽅方获得⾜足够的空间容纳⼀一个报⽂文段或者等到接受缓存有⼀一半空闲的时候,再通知发送⽅方发送数据。
三、拥塞控制⽹网络中的链路路容量量和交换结点中的缓存和处理理机都有着⼯工作的极限,当⽹网络的需求超过它们的⼯工作极限时,就出现了了拥塞。拥塞控制就是防⽌止过多的数据注⼊入到⽹网络中,这样可以使⽹网络中的路路由器器或链路路不不致过载。常⽤用的⽅方法就是:
1. 慢开始、拥塞控制
2. 快重传、快恢复⼀一切的基础还是慢开始,这种⽅方法的思路路是这样的: -1. 发
送⽅方维持⼀一个叫做“拥塞窗⼝口”的变量量,该变量量和接收端⼝口共同决定了了发送者的发送窗⼝口; -2. 当主机开始发送数据时,避免⼀一下⼦子将⼤大量量字节注⼊入到⽹网络,造成或者增加拥塞,选择发送⼀一个1字节的试探报⽂文; -3. 当收到第⼀一个字节的数据的确认后,就发送2个字节的报⽂文; -4. 若再次收到2个字节的确认,则发送4个字节,依次递增2的指数级; -5. 最后会达到⼀一个提前预设的“慢开始⻔门限”,⽐比如24,即⼀一次发送了了24个分组,此时遵循下⾯面的条件判定:1. cwnd < ssthresh,继续使⽤用慢开始算法;2. cwnd > ssthresh,停⽌止使⽤用慢开始算法,改⽤用拥塞避免算法;3. cwnd = ssthresh,既可以使⽤用慢开始算法,也可以使⽤用拥塞避免算法; -6. 所谓拥塞避免算法就是:每经过⼀一个往返时间RTT就把发送⽅方的拥塞窗⼝口+1,即让拥塞窗⼝口缓慢地增⼤大,按照线性规律律增⻓长; -7. 当出现⽹网络拥塞,⽐比如丢包时,将慢开始⻔门限设为原先的⼀一半,然后将cwnd设为1,执⾏行行慢开始算法(较低的起点,指数级增⻓长);
上述⽅方法的⽬目的是在拥塞发⽣生时循序减少主机发送到⽹网络中的分组数,使得发⽣生拥塞的路路由器器有⾜足够的时间把队列列中积压的分组处理理完毕。慢开始和拥塞控制算法常常作为⼀一个整体使⽤用,⽽而快重传和快恢复则是为了了减少因为拥塞导致的数据包丢失带来的重传时间,从⽽而避免传递⽆无⽤用的数据到⽹网络。快重传的机制是:
-1. 接收⽅方建⽴立这样的机制,如果⼀一个包丢失,则对后续的包继续发送针对该包的重传请求; -2. ⼀一旦发送⽅方接收到三个⼀一样的确认,就知道该包之后出现了了错误,⽴立刻重传该包; -3. 此时发送⽅方开始执⾏行行“快恢复”算法:1. 慢开始⻔门限减半;2. cwnd设为慢开始⻔门限减半后的数值;3. 执⾏行行拥塞避免算法(⾼高起点,线性增⻓长);