协议4:滑窗协议(全双工协议)简介
两个窗口
- 发送窗口:已经发送但还未被确认的帧的序号
- 接收窗口:期望接收的帧的序号
默认窗口为1,序列号长度为3位的发送过程:
文字描述:
接收方收到帧后,首先核对是否为预期帧号(frame_expected),如果是的,则接收并frame_expected+1,移动接收窗口
发送端收到应答帧,核对响应帧号(next_frame_to_send),核对无误后,从网络层取新的帧,并执行next_frame_to_send+1,移动发送窗口,如核对帧号不正确,则不移动窗口
void protocol4(void) //因为是双工协议,不再有发方收方的界限
{
seq_nr next_frame_to_send;
seq_nr frame_expected;
frame r, s;
packet buffer;
event_type event;
next_frame_to_send = 0; //第一帧要传0号帧
frame_expected = 0; //接收方期望接受的是对方的0号帧
from_network_layer(&buffer);
s.info = buffer;
s.seq = next_frame_to_send;
s.ack = 1-frame_expected;
to_physical_layer(&s);
start_timer(s.seq);
Seq = 0
Ack = 1
while(true)
{
wait_for_event(&event);
if(event==frame_arrival)
{
from_physical_layer(&r);
if(r.seq==frame_expected) //是不是期望的帧
{
to_network_layer(&r.info);
inc(frame_expected); //移动接收窗口
}
if(r.ack==next_frame_to_send) //是不是确认了
{
stop_timer(r.ack);
from_network_layer(&buffer);
inc(next_frame_to_send); //移动发送窗口
}
}
s.info = buffer;
s.seq = next_frame_to_send;
s.ack = 1-frame_expected; //捎带确认
to_physical_layer(&s);
start_timer(s.seq);
}
}
每个待发送帧被赋予一个序列号seq,seq的取值范围是0~2^n-1(n位字段,图片中n=1)
建立缓冲区:
发送窗口:缓存已发送、待确认的帧
- 顺序接收来自网络层的分组,成帧,赋予序列号
- 最多保存W个已经发送、等待确认的帧
- 窗口达到最大值W时强制关闭网络层
接收窗口:缓存期待接收的帧(序号)
- 对进入窗口的帧顺序提交网络层,产生确认
- 落在窗口外的帧被丢弃
发送窗口滑动机制
窗口设置
- 滑动窗口最大值:max_seq = 1
- 通信双方初始值:seq = 0, ack = 1(准备发送seq号帧,收到了ack号帧(捎带确认))
窗口滑动机制
- A首先发送数据帧(seq=0, ack=1, A0)
- B收到A0,在发送数据帧"B0"时发送捎带确认帧(seq=0, ack=0, B0)
- 收到对A0的确认,滑动窗口,继续发送帧(seq=1, ack=0, A1)……一来一往
特点
- 序列号seq和确认值ack"01交替"
- 滑动窗口长度w=1,收到确认才移动窗口
- 保证按顺序将接收到的正确帧只一次上交网络层
可能会出现的异常情况
因为机制原因仍然可以正常工作,只不过有很多重复帧浪费了带宽
信道利用率
已知:
- 信道传输速率是:b bps
- 每帧的大小是:k bits
- 来回时间是:R sec
则信道的利用率为:k/(k+bR)
例子:
- 信道容量 b = 50 kbps
- 传输延迟 R = 500 ms(双程)
- 数据帧的长度 k = 1000 bit
- 设接收方收到数据帧后马上回送确认短帧,没有延时
求解:
- 在源端发送数据帧过程需要的时间 Tf = k/b = 20ms
- 从发送完毕到确认帧返回需要的时间(双程延迟) R = 500ms
- 从开始发送到确认返回总共需要的时间 Tf+R = 520ms
- 线路的利用率 Tf/(Tf +R) = 20/520 = 3.85%(信道利用率不足4%)
提高信道利用率的方法:
增加滑动窗口最大长度W
理想情况下,使例题信道利用率达到100%,则滑动窗口最大长度为:W = 26
如何寻找一个合适的w值
- 信道上的容量:一帧从发送方传输到接收期间可容纳的帧数量
- 带宽-延迟积:BD
- 窗口值:w = 2*BD+1
- 上述的例子:BD = 50kbps*0.250 = 12.5kb;W = 2*12.5kb+1 = 26kb = 26帧
- 但实际上w≤2*BD+1