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