停止等待协议:
放送方发送一个数据包,要收到接收方对该包的确认后,才发送下一个数据包。
缺点:慢,信道利用率低。
ARQ  Automatic Repeat reQuest
接收方采用累加确认的方式,接收方不必对每一个分组进行缺,只需要对按序到
达的最后一个分组发送确认。
缺点:当发送方发送了5个分组,中间第3个丢失,那么接收方只对前两个分组进
行确认。发送方只好把后面的3个分组都重传一次。这叫做Go-back-N(回退N)
选择确认 selective ack
接收方对接收到的数据字节流中,若有中间字节块的缺失,只需要重新传输缺失
的就可以了,对已经接收到的字节块无需重传。
需要在TCP首部的选项中设置 ”允许SACK” 的选项。
TCP流量控制:
让发送方的发送速率不要太快,要让接收方来得及接收。端到端的问题。
机制:滑动窗口
S--------------->R
当接收方R 的窗口为0时候,S就不能再发送数据了。当R的窗口不为0时候R会发
送一个数据给S来表明当前的窗口大小,但是为了防止S收不到R又有窗口的通
告,S启动一个持续计时器(persistent timer),只要TCP连接的一方接收到对方
的零窗口通告,就启动持续计时器。若持续计时器设置的时间到期,那么发送一
个零窗口的探测报文段。

Nagle算法:
此算法在TCP的实现中广泛使用。
若发送应用进程把要发送的数据逐个字节地发送到TCP的发送缓存,则发送方就
把第一个数据字节先发出去,把后面到达的数据缓存起来。当发送接收到对第一
个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,
同时继续对随后到达的数据进行缓存。只有收到对前一个报文段的确认后才继续
发送下一个报文段。Nagle算法还规定,当到达的数据已经达到发送窗口的一半或
已经达到报文段的最大长度时,就立即发送一个报文。

糊涂窗口综合症:
接收方缓存已经满了,并且一次只从缓存读取一个字节,所以通告给发送方的窗
口只有一个字节,那么接收方一次只发送一个字节的数据,但是发送效率低,因
为一个字节数据要40个字节协议头部。如果每次发送一个字节的话效率很低,解
决方法是:让接收方等待一段时间,再通告自己的窗口大小给接收方。

 
 
TCP拥塞控制:
是整个网络的问题(全局性的)。

①慢开始和拥塞避免:
    发送方维持一个叫做拥塞窗口CWND(congestion window)的状态变量。发送
方的拥塞窗口等于自己发送窗口。
慢开始:
发送方一开始设置CWND=1,发送一个包,接收到该包确认后,发送方设置
CWND=2,发送之后,接收到该包的确认,发送方设置CWND=4 ……以此类推,成倍增长。
千万注意:窗口大小并不时一次性发送数据的大小,发送方可以根据CWND进行
连续几次的发数据,这连续发送的数据大小不应该超过CWND。

   为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢启动开始门限 
ssthresh 。
当cwnd等于ssthresh 的时候,cwnd并不在是成倍的增长了,而是逐渐加1

TCP 流量控制和拥塞控制中的重要机制
当网络拥塞时候(就是发送方没有按时接收到确认),那么就把慢开始门限值设
置成当前的CWND的一半,接着将cwnd设置为1,执行慢开始算法。

②快重传和快恢复:
快重传要求接收方收到一个失序报文段后立即发送重复确认(目的是让发送方尽早
知道数据段没到达),而不要等到自己发送确认数据时候后捎带。
发送方发送5个报文,第3个缺失,收到第四个报文时候立即发送对第2个的重复确
认,接收到第4个、第五个报文时候也发送对第2个的重复确认。只要发送方一连
收到3个重复确认就应该重发接收发未收到的报文,而不必等到第3个报文的重传
计时器过期才重发。
因此,使用快重传可以提高整个网络的吞吐量。

TCP 流量控制和拥塞控制中的重要机制
 
 

快恢复与快重传配合使用:
当发送方连续接收到3个重复确认,就执行“乘法减小”算法,把慢开始门限值
ssthresh设置为当前CWND的一半,同时,将此时的CWND=新的ssthresh值,接
下去并不执行慢开始算法。
因为收到3个重复报文并不时意味着网络出现问题,可能仅仅就是那个包缺失了,
所以ssthresh减半后,cwnd在ssthresh的基础上逐渐加1。

TCP 流量控制和拥塞控制中的重要机制