停止等待协议的算法

来源:互联网 发布:知行理工初始密码 编辑:程序博客网 时间:2024/06/05 14:32

发送结点:

  1. 从主机取一个数据帧,送交发送缓存。
  2. V(S)←0。
  3. N(S)←V(S)。
  4. 将发送缓存中的数据帧发送出去。
  5. 设置超时计时器。
  6. 等待。 { 等待以下(7)和(8)这两个事件中最先出现的一个 }
  7. 若收到确认帧 ACKn:

    • 若 n = 1 – V(s),则
      从主机取一个新的数据帧,放入发送缓存;
      V(S)←[1 - V(S)],转到 (3)。
    • 否则,丢弃这个确认帧,转到(6)。
  8. 若超时计时器时间到,则转到(4)。

注:

  • V(S):发送状态变量
  • N(S):发送序号
  • ACKn:确认帧

说明:按照习惯的表示法,ACKn 表示“第 n – 1 号帧已经收到,现在期望接收第 n 号帧”。

  • ACK1 表示“0 号帧已收到,现在期望接收的下一帧是 1 号帧”;
  • ACK0 表示“1 号帧已收到,现在期望接收的下一帧是 0 号帧”。

接收结点:

  1. V(R)←0。
  2. 等待。
  3. 直到收到一个数据帧:
    • 若 N(S) = V(R),则执行(4);
    • 否则丢弃此数据帧,然后转到(6)。
  4. 将收到的数据帧中的数据部分送交上层软件
    (也就是数据链路层模型中的主机)。
  5. V(R)←[1 - V(R)]。
  6. n←V(R);
    发送确认帧 ACKn,转到(2)。

注:

  • V(R):接收状态变量
  • N(S):发送序号
  • ACKn:确认帧

伪代码:

/** 停止等待协议算法*/// 发送结点void SendNode(void) {    DataType dataTemp;// 发送缓存    bool stateSend = 0;// 发送状态变量    bool numSend = stateSend;// 发送序号    bool ACK = 0;// 确认帧    int timeOut = 1000;// 超时重传时间    int count = 0;    dataTemp = GetDataFrame();// 取一个数据帧,送交发送缓存    Transmit(dataTemp);// 将发送缓存中的数据帧发送出去    while (1) {        if (count != timeOut) {            if (ACK == (1 - stateSend)) {                dataTemp = GetDataFrame();// 取一个新的数据帧,放入发送缓存                stateSend = 1 -  stateSend;                numSend = stateSend;                Transmit(dataTemp);// 发送新的数据帧                count  = 0;            }        }        else {            Transmit(dataTemp);// 重发数据帧            count = 0;        }        count ++;    }}// 接收结点void  ReceiveNode(void) {    bool stateReceive= 0;// 接收状态变量    bool flagReceiveDataFrame = 0;// 接收数据帧标志(接收到数据帧时,置1)    bool ACK = 0;// 确认帧    while (1) {        if (flagReceiveDataFrame) {            if(stateReceive == numSend) {                submitToApp();// 送交上层软件                stateReceive = 1 - stateReceive;                ACK = stateReceive;                Transmit(ACK);// 发送确认帧                flagReceiveDataFrame = 0;// 接收标志清空,继续等待            }            else {                ACK = stateReceive;                Transmit(ACK);                flagReceiveDataFrame = 0;            }        }    }}
0 0
原创粉丝点击