1. 停止等待协议 & 连续ARQ协议
(1)停止等待协议
就是每发送完一个分组就停止发送,等待对方的确认;在收到对方确认后,再发送下一个分组。
其优点是简单,缺点是信道利用率低。
(2)连续ARQ协议
发送方维护着一个发送窗口,位于发送窗口中的数据都可以连续地发送出去,而无需等待对方的确认;发送方每收到一个确认,就把发送窗口向前滑动一个分组单位。
接收方一般采取累积确认方式,也就是说接收方不必对收到的分组逐个发送确认,而是在收到几个分组之后,对按序到达的最后一个分组发送确认(表明这个分组及之前的所有分组都已正确收到了)。
其优点是信道利用率高、容易实现;缺点是无法向发送方反映接收方已正确收到的所有分组的信息。例如:如果发送方发送了5个分组,但第3个分组丢失了,此时接收方只能对前两个分组发出确认,发送方就只能把后面3个分组重新发送一次。
2. 滑动窗口
发送方维护着发送窗口,接收方维护着接收窗口。滑动窗口是以字节为单位的,即窗口中保存的是字节序号。
(1)发送窗口
发送窗口中的序号表示允许被发送的字节数据对应的序号。发送窗口可用3个指针来描述:
- ( . . . , P 1 ) (..., P_1) (...,P1):已发送,且已收到确认的部分;
- [ P 1 , P 2 ) [P_1, P_2) [P1,P2):已发送,但尚未收到确认的部分;
- [ P 2 , P 3 ) [P_2, P_3) [P2,P3):可以发送,但尚未发送的部分;
- [ P 1 , P 3 ) [P_1, P_3) [P1,P3):整个发送窗口。
凡是已发送但未收到确认的数据都需要暂存下来,以便超时重传。
(2)接收窗口
接收窗口中保存的是允许被接收的字节数据对应的序号。
此处,接收窗口的范围是 [31, 50],且数据是乱序到达的(已收到32、33,但未收到31对应的数据;未按序到达的数据会先被缓存下来)。
当接收方收到序号为 31 的数据后,它可以将区间 [31, 33] 中的数据交付给上层应用,然后删除这些数据,接着把接收窗口向前移动 3 个序号(变为 [34, 53]),同时向发送方发送确认(确认号为 34),之后发送方也可以相应地向前移动发送窗口。
3. 流量控制
就是让发送方的发送速率不要太快,以使接收方来得及接收。
利用滑动窗口机制可以很方便地实现流量控制:发送方发送窗口的大小不能超过接收方接收窗口的大小。
4. 拥塞控制
网络拥塞指的是:对网络资源的需求超过了网络可用资源(如,某链路的流量超过了其容量)。
拥塞控制就是要防止过多的数据注入到网络中,以使网络链路不致过载。
拥塞控制也是基于窗口机制的:发送方维护着一个名为拥塞窗口(cwnd)的状态变量,并让自己的发送窗口等于拥塞窗口(只考虑拥塞控制的话)。
TCP 的拥塞控制算法分为4部分:慢启动、拥塞避免、快重传和快恢复。
(1)慢启动
初始时,拥塞窗口被设为 1MSS(最大报文段大小),在收到一个对新的报文段的确认后,拥塞窗口便增大 1MSS。此过程中,cwnd 的值呈指数级增长(1、2、4、…)。
当 cwnd 大于慢启动阈值 ssthresh 时,即进入拥塞避免阶段。
(2)拥塞避免
每经过一个往返时间(RTT),就把发送方的拥塞窗口增大 1MSS。此过程中,cwnd 的值呈线性增长(ssthresh、ssthresh+1、…)。
如果在此过程中出现超时,则将 ssthresh 设为 cwnd/2,并将 cwnd 设为 1,然后进入慢启动阶段。
如果收到 3 个冗余的确认,则发送方会执行快重传,并进入快恢复阶段。
(3)快重传
快重传算法要求接收方必须立即发送确认。
如上图所示,发送方依次发送了 M1~M7 报文段,但 M3 报文段丢失了。
接收方会在收到 M4、M5、M6 报文段时重复确认 M2 报文段,使得发送方收到了 3 个对 M2 报文段的冗余确认(共4个确认,其中3个是冗余的)。
此时,发送方便知道了接收方没有收到 M3 报文段,因而立即进行重传,如此便不会出现超时。
(4)快恢复
收到 3 个冗余确认后,发送方知道现在只是丢失了个别报文段而已,故而不会转入慢启动阶段,而是执行快恢复算法:将 ssthresh 设为 cwnd/2,同时将 cwnd 设为 ssthresh,并进入拥塞避免阶段。
流量控制 & 拥塞控制
综合考虑流量控制机制和拥塞控制机制,有如下关系:
发 送 方 的 发 送 窗 口 = m i n { 接 收 方 的 接 收 窗 口 , 发 送 方 的 拥 塞 窗 口 } 发送方的发送窗口 = min\{接收方的接收窗口,发送方的拥塞窗口\} 发送方的发送窗口=min{接收方的接收窗口,发送方的拥塞窗口}。