可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
TCP 实现可靠传输的机制
TCP首部的序号字段用来保证数据能有序提交给应用层,TCP 把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。
如上图:TCP 缓存区中共有 10B,序号从 1 开始标号,第一个报文段包含第 1-3 个字节,该 TCP 报文段的序号为 1,第二个报文段的序号是 4。
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。在下图中,如果接收方己收到第一个报文段,此时B希望收到的下一个报文段的数据是从第4个字节开始的,那么B发送给A的报文中的确认号字段应为4。发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。
TCP 默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节。例如,在上图中,接收方收到了A发送的包含 字节 1 − 3 1-3 1−3 及 字节 7 − 8 7-8 7−8的报文段。由于某种原因,B还未收到 字节4~6 的报文段,此时接收方 仍在等待字节4(和其后面的字节),因此接收方到发送方的下一个报文段将确认号字段置为4。
有两种事件会导致TCP对报文段进行重传:超时和冗余ACK。
TCP 每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。
由于TCP的下层是一个互联网环境,IP 数据报所选择的路由变化很大,因而传输层的往返时延的方差也很大。为了计算超时计时器的重传时间,TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间(Round-TripTime,RTT)。TCP 保留了 RTT 的一个加权平均往返时间RTTs,它会随新测RTT样本值的变化而变化。显然,超时计时器设置的超时重传时间(Retransmission Time-Out,RTO)应略大于 RTTs ,但也不能大太多,否则当报文段丢失时,TCP不能很快重传,导致数据传输时延大。
超时触发重传存在的一个问题是超时周期往往太长。
每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
快速重传
TCP 提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)
TCP 提供一种基于滑动窗口协议的流量控制机制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd (接收方设置确认报文段的窗口字段来将 rwnd通知给发送方) ,发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制。另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的则可以动态变化。
出现拥塞的条件:
对资源需求的总和 > 可用资源
网络中有许多资源同时呈现供应不足 → \rightarrow → 网络性能变坏 → \rightarrow → 网络吞吐量将随输入负荷增大而下降
拥塞控制: 防止过多的数据注入到网络中。 全局性
拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端),它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
即它们都通过控制发送方发送数据的速率来达到控制效果。
接收窗口: 接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量。
拥塞窗口: 发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。
发送窗口 = Min { 接收窗口rwnd,拥塞窗口cwnd }
(1)慢开始算法
(2)拥塞避免算法
拥塞避免算法的思路是让 拥塞窗口cwnd 缓慢增大,具体做法是:每经过一个往返时延RTT就把发送方的 拥塞窗口 cwnd 加1.而不是加倍,使 拥塞窗口cwnd 按线性规律缓慢增长(即加法增大)这比慢开始算法的拥塞窗口增长速率要缓慢得多。
根据cwnd的大小执行不同的算法,可归纳如下: