互联网的网络层服务通常不可靠,通过IP传输的数据可能出现差错、丢失、乱序或重复。TCP(传输控制协议)在这种基础上提供了一种可靠的数据传输服务,确保数据无差错、无丢失、按序和无重复地传输。本文将详细介绍TCP的可靠传输机制,帮助基础小白们理解其工作原理。
1. 数据编号与确认
TCP是面向字节的,它把应用层交下来的长报文划分为较短的报文段,每个字节对应一个序号。在建立连接时,双方的TCP会各自确定初始序号。TCP使用累积确认,即确认所有按序接收到的数据。接收方返回的确认号表示已按序收到的数据的最高序号加1。例如,如果已经收到了1~700号、801~1000号和1201~1500号的数据,而701~800号及1001~1200号的数据还没有收到,那么确认号应为701。
累积确认的优势在于简化了确认机制,但也有缺点,比如当某个报文段丢失时,接收方只能重复发送前一个报文段的确认号,而不能明确指出哪个报文段丢失了。为了更好地处理这种情况,TCP引入了选择确认(Selective Acknowledgment, SACK)。
2. 超时重传
TCP在发送报文段时会存放一个副本在重传队列中。若在规定时间内没有收到确认,则重传此报文段的副本。TCP的确认只是表明接收方的TCP已按序正确接收到报文段,而不保证数据已交付应用进程。TCP采用了一种延迟确认机制,接收方在正确接收到数据时可能会等待一小段时间(一般不超过0.5s)再发送确认信息,以提高传输效率。
通过延迟确认,接收方可以在一个确认报文段中包含多个收到的数据报文段的确认信息,从而减少确认报文段的数量,提高通道利用率。这种机制在高流量的网络环境中尤为重要。
3. 滑动窗口协议
为了提高传输效率,TCP采用滑动窗口协议。与GBN协议不同的是,TCP发送窗口大小的单位是字节,而不是分组数。发送方已发送而未被确认的字节数不能超过发送窗口的大小。
滑动窗口协议允许发送方在等待确认的同时继续发送多个数据报文段,从而充分利用网络带宽。窗口的大小可以根据网络状况动态调整,以实现流量控制和拥塞控制。
图5-9展示了TCP中的窗口概念:
- 初始状态:发送窗口大小为400字节,未发送任何字节,可以发送序号为1~400的字节。
- 部分确认:已发送400字节的数据,但只收到对前200字节数据的确认信息,现在还可以发送200字节(401~600)。
- 全部确认:收到对前400字节数据的确认信息,最多可再发送400字节的数据(401~800)。
4. 超时重传时间的选择
TCP采用自适应算法来确定超时重传时间。该算法记录报文段发出的时间和收到相应确认报文段的时间。由于互联网环境下端到端的时延在不断变化,TCP使用指数加权移动平均算法对RTT(往返时间)进行加权平均,从而计算出一个平滑的RTT。
# 计算平滑RTT的公式
新的RTTs = (1 - a) × (旧的RTTs) + a × (新的RTT样本)
RFC2988建议使用以下公式计算RTO(超时重传时间):
RTO = RTTs + 4 × RTTD
Karn算法则进一步优化了RTT的计算,避免了由于重传导致的RTT计算误差,但也引入了新的问题,需要通过增加RTO来解决。
5. 快速重传
快速重传机制用于补充超时重传。当发送方收到多个重复的确认信息时,就知道可能出现了报文段丢失。快速重传算法规定,发送方只要一连收到三个重复的确认信息,就立即重传丢失的报文段,而不必继续等待为该报文段设置的超时计时器超时。
例如,发送方发送了M1~M3共五个报文段,假定网络拥塞使M2丢失了。接收方收到M1后,发出对M1的确认,但由于M2丢失,接收方后来收到M3、M4和M5后,仍旧发出对M1的重复确认。发送方收到三个重复的确认信息后,就立即重传丢失的报文段M2。
6. 选择确认
选择确认(Selective ACK, SACK)是TCP的一个可选功能。当接收方接收到失序的字节块时,可以通过选择确认通知发送方所有正确接收了但失序的字节块,从而使发送方只重传那些接收方还没有收到的字节块。这类似于选择重传(SR)协议。
例如,字节1~1000收到了,字节1001~1500还没有收到,但字节1501~2000和字节2501~4000已经收到了,中间的字节2001~2500也没有收到。选择确认可以告知发送方这些信息,以避免不必要的重传。
总结
TCP的可靠传输机制通过数据编号与确认、超时重传、滑动窗口协议、快速重传和选择确认等多种机制,确保了数据在互联网中无差错、无丢失、按序和无重复地传输。希望通过本文的介绍,基础小白们能够更好地理解和应用TCP的可靠传输机制。
图文来源:《计算机网络教程》第六版微课版