📜  滑动窗口协议 |设置 1(发送方)

📅  最后修改于: 2022-05-13 01:57:03.104000             🧑  作者: Mango

滑动窗口协议 |设置 1(发送方)

先决条件:停止并等待 ARQ

Stop and Wait ARQ 提供错误和流量控制,但可能会导致严重的性能问题,因为发送方总是等待确认,即使它有下一个数据包准备发送。考虑一个你有高带宽连接并且传播延迟也很高的情况(你通过高速连接连接到其他国家的一些服务器),由于停止和等待的限制,你不能使用这个全速.

滑动窗口协议通过一次发送多个具有更大序列号的数据包来处理此效率问题。这个想法与架构中的流水线相同。

几个术语:

传输延迟 (Tt) – 将数据包从主机传输到传出链路的时间。如果 B 是链路的带宽,D 是要传输的数据大小

Tt = D/B  

传播延迟 (Tp) – 主机传输到传出链路的第一个比特到达目的地所用的时间。它取决于距离 d 和波传播速度 s(取决于介质的特性)。

Tp = d/s  

效率——它被定义为一个数据包的总有用时间与总循环时间的比率。对于停止和等待协议,

Total cycle time = Tt(data) + Tp(data) + 
                    Tt(acknowledgement) + Tp(acknowledgement)
              =  Tt(data) + Tp(data) + Tp(acknowledgement)
         =   Tt + 2*Tp

由于确认的大小非常小,因此可以忽略它们的传输延迟。

Efficiency = Useful Time / Total Cycle Time 
           = Tt/(Tt + 2*Tp) (For Stop and Wait)
           = 1/(1+2a)  [ Using a = Tp/Tt ]

有效带宽 (EB) 或吞吐量– 每秒发送的位数。

EB = Data Size(D) / Total Cycle time(Tt + 2*Tp)
Multiplying and dividing by Bandwidth (B),
       =  (1/(1+2a)) * B   [ Using a = Tp/Tt ]
       =  Efficiency * Bandwidth

链路容量——如果一个通道是全双工的,那么比特可以在两个方向上传输并且没有任何冲突。一个通道/链路最多可以容纳的比特数是它的容量。

Capacity = Bandwidth(B) * Propagation(Tp)
        
 For Full Duplex channels, 
 Capacity = 2*Bandwidth(B) * Propagation(Tp)

流水线的概念

在停止和等待协议中,只有 1 个数据包被传输到链路上,然后发送方等待接收方的确认。此设置中的问题是效率非常低,因为在将第一个数据包放入链路后,我们没有用更多数据包填充通道。在 Tt + 2*Tp 单位的总循环时间内,我们现在将计算发送方在获得确认之前可以在链路上传输的最大数据包数。

In Tt units ----> 1 packet is Transmitted.
 In 1 units  ----> 1/Tt packet can be Transmitted.
 In  Tt + 2*Tp units ----->  (Tt + 2*Tp)/Tt 
                             packets can be Transmitted
                ------>  1 + 2a  [Using a = Tp/Tt]

总周期时间内可传输的最大数据包数 = 1+2*a

现在让我借助一个例子来解释一下。

考虑 Tt = 1ms,Tp = 1.5ms。

在下图中,发送方发送了数据包 0 后,会立即发送数据包 1、2、3。对于 0 的确认将在 2*1.5 = 3ms 后到达。在停止和等待中,时间 1 + 2*1.5 = 4ms,我们只传输一个数据包。在这里,我们保留一个已传输但尚未确认的数据包窗口

在我们收到数据包 0 的 Ack 后,窗口滑动并且可以为下一个数据包分配序列号 0。我们重复使用已确认的序列号,以便可以将报头大小保持最小,如下图所示。

发送者窗口的最小位数(对 GATE 非常重要)

正如我们在上面看到的,

Maximum window size = 1 + 2*a    where a = Tp/Tt

 Minimum sequence numbers required = 1 + 2*a. 

当前窗口中的所有数据包都将被赋予一个序列号。表示发送者窗口所需的位数 = ceil(log2(1+2*a))。

但有时协议头中的位数是预定义的。标头中序列号字段的大小也将决定我们在总周期时间内可以发送的最大数据包数。如果 N 是标头中序列号字段的大小(以比特为单位),那么我们可以有 2 N个序列号。

窗口大小 ws = min(1+2*a, 2 N )

如果要计算表示序列号/发送者窗口所需的最小位数,它将是ceil(log2(ws))

在本文中,我们仅讨论了发送窗口。对于接收窗口,有两种协议,即Go Back NSelective Repeat ,它们用于实际实现流水线。我们将在第 2 组中讨论接收窗口。