计算机网络概述 传输层 TCP可靠传输的实现

时间:2023-01-13 14:35:11

TCP可靠传输的实现

 TCP的可靠性表现在:它向应用层提供的数据是 无差错的、有序的、无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的。 

TCP采用了流量控制、拥塞控制、连续ARQ等技术来保证它的可靠性。

PS:网络层传输的数据单元为『数据报』,传输层的数据单元为『报文段』,但为了方便起见,可以统称为『分组』。

停止等待协议(ARQ协议)

TCP保证其可靠性采用的是更为复杂的滑动窗口协议,但停止等待协议是它的简化版,为了方便理解,这里先介绍停止等待协议。

ARQ(Automatic Repeat reQuest)自动重传请求。 
顾名思义,当请求失败时它会自动重传,直到请求被正确接收为止。这种机制保证了每个分组都能被正确接收。停止等待协议是一种ARQ协议。

停止等待协议的原理

无差错的情况 
A向B每发送一个分组,都要停止发送,等待B的确认应答;A只有收到了B的确认应答后才能发送下一个分组。

超时重传(分组丢失和出现差错)的情况

当分组丢失 或 出现差错 的情况下,A都会超时重传分组

发送者拥有超时计时器。每发送一个分组便会启动超时计时器,等待B的应答。若超时仍未收到应答,则A会重发刚才的分组。

分组出现差错:若B收到分组,但通过检查和字段发现分组在运输途中出现差错,它会直接丢弃该分组,并且不会有任何其他动作。A超时后便会重新发送该分组,直到B正确接收为止。 
分组丢失:若分组在途中丢失,B并没有收到分组,因此也不会有任何响应。当A超时后也会重传分组,直到正确接收该分组的应答为止。 

应答丢失 和 应答迟到 的情况

TCP会给每个字节都打上序号,用于判断该分组是否已经接收。

应答丢失:若B正确收到分组,并已经返回应答,但应答在返回途中丢失了。此时A也收不到应答,从而超时重传。紧接着B又收到了该分组。接收者根据序号来判断当前收到的分组是否已经接收,若已接收则直接丢弃,并补上一个确认应答。

应答迟到:若由于网络拥塞,A迟迟收不到B发送的应答,因此会超时重传。B收到该分组后,发现已经接收,便丢弃该分组,并向A补上确认应答。A收到应答后便继续发送下一个分组。但经过了很长时间后,那个失效的应答最终抵达了A,此时A可根据序号判断该分组已经接收,此时只需简单丢弃即可。

停止等待协议的注意点

每发送完一个分组,该分组必须被保留,直到收到确认应答为止。

必须给每个分组进行编号。以便按序接收,并判断该分组是否已被接收。

必须设置超时计时器。每发送一个分组就要启动计时器,超时就要重发分组。

计时器的超时时间要大于应答的平均返回时间,否则会出现很多不必要的重传,降低传输效率。但超时时间也不能太长。

滑动窗口协议(连续ARQ协议)

连续ARQ协议

ARQ协议发送者每次只能发送一个分组,在应答到来前必须等待。而连续ARQ协议的发送者拥有一个发送窗口,发送者可以在没有得到应答的情况下连续发送窗口中的分组。这样降低了等待时间,提高了传输效率。

累计确认 
在连续ARQ协议中,接收者也有个接收窗口,接收者并不需要每收到一个分组就返回一个应答,可以连续收到分组之后统一返回一个应答。这样能节省流量。 
TCP头部的ack字段就是用来累计确认,它表示已经确认的字节序号+1,也表示期望发送者发送的下一个分组的起始字节号。

发送窗口 

 计算机网络概述 传输层 TCP可靠传输的实现

发送窗口的大小由接收窗口的剩余大小决定。接收者会把当前接收窗口的剩余大小写入应答TCP报文段的头部,发送者收到应答后根据该值和当前网络拥塞情况(选择二者最小的值)设置发送窗口的大小。发送窗口的大小是不断变化的。 
发送窗口由三个指针构成:

p1 
p1指向发送窗口的后沿,它左边的字节表示已经发送且已收到应答。
p2 
p2指向尚未发送的第一个字节。 
p1-p2间的字节表示已经发送,但还没收到确认应答。这部分的字节仍需保留,因为可能还要超时重发。 
p2-p3间的字节表示可以发送,但还没有发送的字节。
p3 
p3指向发送窗口的前沿,它前面的字节尚未发送,且不允许发送。
发送者每收到一个应答,后沿就可以向前移动指定的字节。此时若窗口大小仍然没变,前沿也可以向前移动指定字节。 
当p2和前沿重合时,发送者必须等待确认应答。
接收窗口 

计算机网络概述 传输层 TCP可靠传输的实现

接收者收到的字节会存入接收窗口,接收者会对已经正确接收的有序字节进行累计确认,发送完确认应答后,接收窗口就可以向前移动指定字节。 
如果某些字节并未按序收到,接收者只会确认最后一个有序的字节,从而乱序的字节就会被重新发送。

超时重传时间选择

TCP采用自适应的算法, 对报文的往返时间(RTT) 进行加权平均, 得出平滑的往返时间, 并且, 对于报文重传的情况: 这一次就不采用加权平均, 而是直接将重传时间增大两倍. 直到分组不重传.

选择确认SACK

在滑动窗口中, 我们提到: 可以将不按序的数据先存放在接收临时窗口, 等连续了再交付,通过选择确认来实现让发送方知道那些序号,利用两个指针来描述出缺失序号的起始位置和终点位置, 并将在即将返回的确认分组中添加这两个指针的信息,这样下一次发送方发送的就是这个缺失序号段的内容了.

连续ARQ的注意点

同一时刻发送窗口的大小并不一定和接收窗口一样大。 

虽然发送窗口的大小是根据接收窗口的大小来设定的,但应答在网络中传输是有时间的,有可能t1时间接收窗口大小为m,但当确认应答抵达发送者时,接收窗口的大小已经发生了变化。 
此外发送窗口的大小还随网络拥塞情况影响。当网络出现拥塞时,发送窗口将被调小。

TCP标准并未规定未按序到达的字节的处理方式。但TCP一般都会缓存这些字节,等缺少的字节到达后再交给应用层处理。这比直接丢弃乱序的字节要节约带宽。

TCP标准规定接收方必须要有累计确认功能。接收方可以对多个TCP报文段同时确认,但不能拖太长时间,一般是0.5S以内。 
此外,TCP允许接收者在有数据要发送的时候捎带上确认应答。但这种情况一般较少,因为一般很少有两个方向都要发送数据的情况。