TCP可靠传输
TCP提供的可靠数据传输服务保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样。TCP使用了校验、序号、确认和重传等机制来达到这一目的。(TCP的校验机制与UDP校验一样,这里不再赘述。)
序号
TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。
确认
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。
重传
有两种事件会导致TCP对报文段进行重传:超时和冗杂ACK。
-
超时
TCP没发送一个报文段,就对这个报文段设置一次计时器,计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。
-
冗余ACK(冗余确认)
超市触发重传存在的一个问题是超时周期往往太长。所幸的是,发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况。TCP规定,每当比期望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期待字节的序号。
例如:
发送方已发送1,2,3,4,5报文段 接收方收到1,返回给1的确认(确认号为2的第一个字节) 接收方收到3,仍返回给1的确认(确认号为2的第一个字节) 接收方收到4,仍返回给1的确认(确认号为2的第一个字节) 接收方收到5,仍返回给1的确认(确认号为2的第一个字节) 发送方收到3个对于报文段1的冗余ACK——认为2报 文段丢失,重传2号报文段(快速重传)
TCP流量控制
TCP提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。
TCP提供一种基于滑动窗口协议的流量控制机制。在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd,即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文段的速率。同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。
发送窗口的上限值应rwnd和cwnd中较小的一个,即:发送窗口的上限值=min[rwnd,cwnd]。
TCP拥塞控制
拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。
拥塞控制与流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及的所有主机、所有的路由器,以及与降低网络传输性能有关的所有因素;相反,流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端) ,它所要做的是抑制发送端发送数据的速率,以便使接收段来得及接收。
相似之处:都通过控制发送方发送数据的速率来达到控制效果。
拥塞控制的四种算法:慢开始、拥塞避免、快重传和快恢复。
慢开始和拥塞避免
-
慢开始算法
在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS。每收到一个新报文段的确认后,将cwnd+1,即增加一个MSS。用这样的方法逐步增加发送方的cwnd,可使分组注入网络的速率更加合理。
使用慢开始算法后,每经过一个传输轮次(即往返RTT),cwnd就会加倍,即cwnd的值随传输轮次指数规律增加。这样,慢开始一直把cwnd增大到一个规定的慢开始门限ssthresh(阈值) ,然后改用拥塞避免算法。
-
拥塞避免算法
拥塞避免算法是让拥塞窗口cwnd缓慢增大。具体做法是:没经过一个往返时延RTT就把发送方的拥塞窗口cwnd+1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长(即加法增大),这比慢开始算法的拥塞窗口增长速率要缓慢很多。
根据cwnd的大小执行不同的算法,可归纳如下:
- 当cwnd < ssthresh 时,使用慢开始算法
- 当cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法(通常做法)。
- 当cwnd = ssthresh 时, 既可以使用慢开始算法,夜视仪使用拥塞避免算法(通常做法)。
-
网络拥塞的处理
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未暗示收到确认),就要把慢开始门限sstresh设置为出现拥塞时的发送方cwnd值的一半( 但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发送拥塞的路由器有足够时间把队列中积压的分组处理完。
快重传和快恢复
快重传和快恢复是对慢开始和拥塞避免算法的改进。
-
快重传
在TCP可靠传输机制中,快重传技术使用了冗余ACK来检测丢包的发生。同样,冗余ACK也用于网络拥塞的检测。快重传并非取消重传计时器,而是在某些情况下更早地重传丢失的报文段。
当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
-
快恢复
当发送发连续收到三个冗余ACK(即重复确认)时,执行“乘法减小”算法,把慢开始门限sstresh设置为此时发送方cwnd的一半。这是为了预防网络发生拥塞。但发送方现在认为网络很可能没有发生(严重)拥塞,。因此与慢开始不同之处就是它把cwnd值设置为慢开始门限sstresh改变后的数值。然后开始执行拥塞避免算法(“加法增大”),是拥塞窗口缓慢的线性增大。
由于跳过了拥塞窗口cwnd从1开始的慢开始过程,所以被称为快恢复。
至此,UDP和TCP传输协议已经记录完啦~有不足之处请多多指教呀