计算机网络(十):传输层之TCP(中)
一、TCP的差错控制
TCP的差错控制机制注意点:
- TCP协议的设计思想是让应用进程将数据作为一个字节流来发送,无需考虑发送数据字节长度,由TCP负责将字节流分段打包。
- 依靠TCP连接传送字节流,并且是按序的、无差错、不丢失、不重复。
- TCP提供差错控制功能,保证正确接收字节流。
TCP的差错控制是通过差错检测、确认和重传方法实现的。
二、TCP的滑动窗口
- 滑动窗口的基本概念
TCP协议使用以字节为单位的滑动窗口协议来控制字节流的发送、接收、确认和重传过程。
滑动窗口注意点:
2个缓存、2个窗口(控制字节流传输过程)
发送方缓存:用于存储准备发送的数据。
发送窗口:窗口值不为0,可以发送报文段。
接收方缓存:将正确的字节流写入缓存,等待接收读取。
接收窗口:窗口值 = 接收缓存可以继续接收的字节流。
字节流分段,按段(序号)传输,捎带确认(确认号)
通过滑动窗口跟踪、记录发送状态,实现差错控制 - 传输的字节流状态分类
如图为传输的字节流状态分类。
- 发送窗口与可用窗口
发送方能够利用TCP连接发送字节流的大小取决于发送窗口的大小。如图为发送窗口和可用窗口的概念图。
可用窗口:其长度等于第3类字节数,表示发送方随时可以发送的字节数。
TCP通过滑动窗口来跟踪和记录发送字节的状态,实现面向字节流传输的功能。发送窗口是实现滑动窗口机制的关键。发送窗口表示发送方已经发送但没有被确认,以及可以随时发送的字节数;可用窗口表示发送方可以随时发送的字节数。 - 滑动窗口机制运行过程
如果没有任何问题的出现,发送方立即发送可用窗口的6字节,那么第3类字节数就变成第2类字节,等待接收方确认。发送可用窗口字节数之后的字节分类和窗口变化如下图所示。
经过一段时间之后,接收方向发送方发送1个报文,确认序号为20~25的字节,如果保持发送窗口依然为15字节,那么将窗口向左滑动,如图为处理确认并滑动发送窗口示意图。
- TCP滑动窗口协议的特点
TCP使用发送和接收缓存区,以及滑动窗口机制控制TCP连接上的字节流传输。
TCP滑动窗口是面向字节的,它可以起到差错控制和流量控制的作用。
接收方可以在任何时候发送确认,窗口大小可以由接收方根据需要增大或减小。
发送窗口值不能超过接收窗口值,发送方可以根据自身的需要来决定。
三、选择重发策略
在互联网中,报文段丢失是不可避免的。如图为接收的字节流序号不连续的例子。如果5个报文段在传输过程中丢失了2个,就会造成接收的字节流序号不连续的现象。
对接收的字节流序号不连续的处理方法有两种:回退方式与选择重发方式。
- 回退方式
如果采用回退方式处理接收的字节流序号不连续,需要在丢失第2个报文段时,不管之后的报文段是否已经正确接收,从第2个报文段的第1个字节序号151开始,重发所有的4个报文段。显然,这种方法是非常低效的。
- 选择重发方式
采取选择重发方式SACK方式,当接收方收到与前面接收的字节流序号不连续的字节时,如果这些字节的序号都在接收窗口之内,则首先接收这些字节,然后将丢失的字节流序号通知发送方,发送方只需要重发丢失的报文段,而无需重发已经接收的报文段。
四、重传定时器
- 重传定时器的作用
重传定时器用来处理报文确认与等待重传的时间。当发送方TCP发送一个报文时,首先将它的一个报文的副本放到重传队列,同时启动一个重传定时器。在重传定时器倒计时到0之前收到确认,表示该报文传输成功;如果在重传定时器倒计时到0时没有接收到确认,表示该报文传输失败,发送方准备重传该报文。如图为重传定时器工作过程示意图。
- 计算重传时间方法
TCP协议不会采用简单的静态方法来设定重传定时器的数值,必然要选择使用一个动态的自适应重传方法。对于每个TCP连接都要维持一个RTT变量,它是当前到达目的结点的最佳估计往返延迟值,自适应重传定时是基于往返时间(RTT)。
计算重传时间的公式:
Timeout = β * RTT
其中,β为一个大于1的常量加权因子,RTT为估算的往返时间。RTT计算公式为:
RTT = α * 旧的RTT + (1 - α) * 最新RTT测量值
其中,“旧的RTT”是上一个往返时间估算值,“最新RTT测量值”是实际测出的前一个报文的往返时间。
更多后续知识,查看笔记:计算机网络(十一):传输层之TCP(下)
参考资料:《计算机网络与下一代互联网》