1、停止等待协议

       TCP 连接是全双工的连接,也就是说在通信的时候,双方既是发送方,也是接收方。下面为了简化问题,只考虑一方发送,一方接受的情况。其中,A作为发送方,B作为接收方。


1.1 无差错的情况
       A发送分组M1,发送完就暂停发送,等待B的确认。B收到M1就向A发送确认。A在收到了对M1的确认后,就再发送下一个分组M2。如下图所示:

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_02


1.2 出现差错
       如果A发送的过程中出现差错,B在接收M1时检测出了差错,就丢弃M1,其他什么都不做(也不会通知A收到有差错的分组)。又或者A传送的过程中分组丢失了,以上这两种情况下,B不会发送任何信息。
       既然说它是可靠传输协议,那自然有它可靠的方法,如果发生以上的情况,A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,所以它会重传刚刚的发送过的分组,也就是所谓的超时重传。

       超时重传的原理也很简单:发送方发送完一个分组后,就会设置一个超时计时器,如果超时计时器到期之前没有收到接收方发来的确认信息,则会重发刚发送过的分组;如果收到确认信息,则撤销该超时计时器。

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_04


这里应该注意的是:
(1)既然发送方发送的分组可能丢失或者有差错,可能需要重传,那么它必须暂时保留已发送的分组副本,只有收到确认后,才清除这个副本。
(2)分组和确认分组信息都应该有各自的编号,用来标示每一个分组和确认信息。(这样才知道需要发送哪个分组,收到了哪个分组的确认信息)
(3)超时计时器设置的时间应该略长于分组传送往返时间
1.3 确认丢失和确认延迟
       没有正常进行通信,除了发送方出现问题外,接收方同时也可能存在问题。例如,如果A发送了M1分组,到达B,B发送了M1确认信息,但由于网络原因,该确认信息丢失。那么这个时候,A在超时重传时间内,没有收到B的确认信息,而且它并不知道是自己的分组有差错、丢失,还是B发生的确认丢失了。因此,A会在超时重传过后,重传M1分组。
接收方B会采取这两个行动:
(1)B会丢弃M1分组,不向上层交付。(B之前已经收到过M1分组了)
(2)向A发送确认(因为A重发了,肯定重传时间内没有收到确认信息)

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_06


       还有可能是另一种情况,就是B发送了确认,没有丢失,但是延迟了。也就是说,B发送的确认在A超时计时器过期后才到达。
       这种情况下,A收到确认信息后会丢弃,然后重传刚才的分组,B收到后,丢弃重复的分组,并重传确认信息。

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_08


2、信道利用率
       这种停止等待协议的优点是简单,但缺点是信道利用率太低,传输效率不高。
       从下图可以看出,假设A发送分组需要的时间为TD,B发送确认分组时间为TA,往返时间为RTT,那么完整的发送一个分组,需要耗费的时间为:TD+RTT+TA。过了这个时间后,第二个分组才开始发送。

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_10


为了提高传输效率,发送方可以不使用低效率的停止等待协议,而采用流水线传输。流水线传输就是发送方可以连续发送多个分组,不必每发完一个分组就停下来等待对方确认。

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_12


3、连续ARQ协议

TCP/IP(三) —— 可靠传输工作原理_tcp/ip_13

       滑动窗口协议比较复杂,这个留在后面总结。
       从上面的图来看,图(a)是发送方维持的发送窗口,它的意义是:位于发送窗口内的5个分组都可以连续发送出去,而不需要等待对方的确认,这样就提高了信道利用率。
       连续ARQ协议规定,发送方没法送一个确认,就把发送窗口向前滑动一个分组的位置。例如上面的图(b),当发送方收到第一个分组的确认,就把发送窗口向前移动一个分组的位置。如果已经发送了前5个分组,则现在可以发送窗口内的第6个分组。
       接收方一般都是采用累积确认的方式。也就是说接收方不必对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认。如果收到了这个分组确认信息,则表示到这个分组为止的所有分组都已经正确接收到了。
       累积确认的优点就不用多说了,缺点是,不能正确的反映收到的分组,比如发送方发送了前5个分组,而中间的第3个分组丢失了,这时候接收方只能对前2个发出确认。而不知道后面3个分组的下落,因此只能把后面的3个分组都重传一次,这种机制叫Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。