目录
停止等待协议与连续ARQ协议
TCP传输使用的是停止等待协议,即向发送端发送数据包后,接受端收到并发送确认请求,发送端收到确认请求后再发送下一个数据包。如果发送后,发送端会等待一段时间,时长为一个数据包往返需要的时间,如果因为发送失败没有收到请求,发送端就会重传数据包。
因为接受端发送确认请求选择的路径有时可能比较远,会出现确认迟到的情况。如果没有收到请求是因为确认迟到,那么发送端再次收到确认请求后不会做任何事。
TCP发数据包的时候,如果单纯使用停止等待协议,发一个确认一个再发一个,那么信道利用率就会很低,所以需要使用连续ARQ协议。利用连续ARQ协议发送的时候,同时发送滑动窗口内的多个数据包,也就是流水线传输。一旦收到数据包的确认后,窗口就会向前移动。接受端采取的是累积确认的方式,只对到达的最后一个数据包发送确认,比如是3最后到达,就不会发1、2的确认,那么滑动窗口收到3的确认后,就向前滑动3个窗口。如果发送分组的中途有数据包,那么就Go-back-N。比如1-5都发送了出去,3中途丢失了,那么接受端只会发2的确认,那么3、4、5都得重发,也就是丢了第N个包,就回退N重发。
TCP的两端都各有两个窗口,一个是发送窗口,一个是接受窗口,总共四个窗口。通过字节的序号控制传输,而不是基于报文端。往返时间RTT不是固定不变的,而是根据特定算法算出来的。
流量控制
TCP协议通过接受窗口来控制发送窗口的大小,比如出现了数据包丢失情况,接受端就会在发确认的数据包里调整窗口大小,从而实现流量控制。如果接受端处理不过来,就会把窗口大小设为0,即零窗口通知,发送端接受确认后,停止发送数据。TCP为每一个连接设置了持续计时器,收到零窗口通知后,就会启动计时器,如果到时间还没有收到确认,就发送一个只有一个字节的零窗口探测报文段,如果收到确认后,窗口大小还是0,就会重置计时器,重复上诉过程,直到收到窗口大小不为0的确认。
拥塞控制
TCP协议在发送端设置了一个拥塞窗口cwnd(congestion window)来实现拥塞控制。发送端的发送窗口大小由拥塞窗口和接受端的接受窗口的最小值决定,如果出现拥塞情况,拥塞窗口就会变小。
慢开始算法
在一开始发送报文段时,每经历一个传输轮次,报文段的大小就会加倍。达到慢开始门限使用拥塞避免算法让报文段缓慢增长,每经历一个传输轮次,报文段的大小加1。当出现拥塞时,门限减半,同时报文段的大小从1开始增长,重复以上过程。
快重传和快恢复算法
慢开始算法的效率比较低,可以利用快重传和快恢复算法提升效率。如果接受端发现报文段的序号有缺失,那么就立即重复发送上一个序号报文段的确认,发送端一旦连续收到三个重复确认,不会等待立即重传报文段,这就是快重传算法。一开始执行慢开始算法,在拥塞的时候就执行快重传算法,然后执行快恢复算法,把慢开始门限减半后,报文段的大小从门限而不是1开始,再重复慢开始算法。