一、TCP的可靠传输
- 序号
TCP在传输时会把数据看成一个有序的字节流,给每一个字节都编上序号。
- 确认
在接收端接收到发送端发送过来的数据后,会期望接受到下一个编号的数据。如,在B接受到A传输过来的数据0、1、2后,会把发送给A的确认报文首部的确认字段设为3。若接下来A发送的数据3、4在传输过程中丢失,只成功发送了5、6,那么B到A的确认报文段将确认号字段置为3。
- 重传
有两种情况会导致TCP对报文段进行重传:超时和冗余ACK。
①超时:TCP每发送一个报文段,都会进行一次计时,在规定时间前没有收到确认,就要重传这一报文。
②冗余ACK:
能触发超时重传的周期往往比较长,所以常常用更有效的冗余ACK方法来检测丢包的情况。如A发送了序号为1、2、3、4、5的报文段,但是2丢失,所以3、4、5报文段对B来说就成了失序报文段。TCP规定每当比期望序号大的失序报文到达时,发送一个冗余ACK。 所以当B收到3、4、5 报文段时,会给A发送3个对2号报文段的冗余ACK,表示自己期望接收到2号报文段。TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为这个报文段发生了丢失。 这时A可以立即对2号报文执行重传,这种技术也叫快速重传 。
二、TCP流量控制
TCP提供的流量控制服务是为了消除发送方使接收方缓存区溢出的可能性,也就是匹配发送方的发送速率与接收方的接受速率。
发送方有称为拥塞窗口的cwnd,接收方有称为接收窗口的rwnd,接收方会根据自己接受缓存的大小,动态调整发送方的发送窗口大小。发送窗口的实际大小取rwnd和cwnd中的最小值。
传输层和数据链路层都有流量控制,区别在于传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间的相邻节点的流量控制。另外,数据链路层的滑动窗口大小不能动态改变,传输层可以动态变化。
三、TCP拥塞控制
拥塞控制是为了让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有主机、路由器等因素,是发送端自发的监测网络的拥塞情况来调整发送窗口的大小 ;流量控制往往是指点对点的控制,目的是抑制发送端的发送速率,以便接收端来得及接收,是通过接收端的反馈来调整发送端发送窗口的大小 。拥塞控制和流量控制同时控制着发送窗口的大小。
- 慢开始和拥塞避免
- 当cwnd<ssthresh时,使用慢开始算法。即cwnd初始为1,在接下来的传输中指数型增长
- 当cwnd>ssthresh时,使用拥塞避免算法。即将cwnd的递增速率改为每次增加1,当出现超时时,就把慢开始门限ssthresh设置为之前的一半,并把cwnd置1且重新执行慢开始算法。
- 快重传和快恢复
①快重传:上一节说过,当发送方连续收到三个重复的ACK报文时,直接重传对方尚未接收到的报文段,而不必等待那个报文段设置的重传计时器超时。
②快恢复:当发送端收到连续三个冗余ACK时,把ssthresh设为之前的一半后,不执行慢开始,而是直接使cwnd从ssthresh处以每次递增1的速率增加。
实际上,慢开始、拥塞避免算法、快重传和快恢复几种算法是同时应用在拥塞控制机制之中的,当发送方检测到超时的时候,采用慢开始和拥塞避免算法,当发送方接收到冗余ACK时,就采用快重传和快恢复。
来源:oschina
链接:https://my.oschina.net/u/2286010/blog/3207317