数据链路层协议解析:停止等待协议与帧传输

需积分: 8 2 下载量 109 浏览量 更新于2024-07-10 收藏 618KB PPT 举报
"在接收结点的描述涉及的是数据链路层中的一种错误检测与纠正协议,即自动重传请求(ARQ)机制。这里主要讨论的是停止等待协议的接收端处理流程,以及数据链路层的基本概念和功能。标签提到了'链路ARQ',暗示了该主题与链路上的错误检测和纠正有关。" 在计算机网络中,数据链路层是OSI模型中的第二层,负责在节点间建立物理和逻辑连接,确保数据帧的可靠传输。它通过提供错误检测、流量控制和帧定界等功能来实现这一目标。数据链路层可以分为两个子层:逻辑链路控制(LLC)和媒体访问控制(MAC)。在本摘要中,我们重点关注的是数据的接收过程和停止等待协议。 停止等待协议是一种简单的错误控制协议,适用于带宽有限或可靠性较低的链路。其基本思想是发送方发送一个数据帧后,必须等待接收方的确认才能发送下一个帧。在接收端,当接收到一个数据帧时,会进行以下操作: 1. V(R)被初始化为0,表示接收序列号。 2. 接收方进入等待状态。 3. 如果接收到的数据帧的序列号N(S)等于当前的V(R),说明帧正确到达,执行下一步;否则,丢弃该帧,因为它可能是重复或乱序的帧。 4. 将接收到的数据帧中的有效载荷传递给上层(即主机的数据链路层)。 5. 更新V(R),将其设置为[V(R) - 1],准备接收下一个帧的确认。 6. 设置n为V(R)的值,并发送一个序列号为n的确认帧ACKn,然后返回等待状态。 标签“链路ARQ”表明这种协议是基于链路级别的错误控制,即在数据链路层中实施的ARQ机制。停止等待协议虽然简单,但效率较低,因为每次发送都需要等待确认,不适合高带宽和低延迟的环境。 此外,摘要中还提及了其他数据链路层协议,如连续ARQ协议,它允许发送方在收到确认之前连续发送多个帧,从而提高效率。滑动窗口的概念在此类协议中至关重要,它定义了发送方可以发送多少未确认帧的上限。信道利用率和最佳帧长是优化链路性能的关键因素,它们影响着协议的效率和整体网络性能。 面向比特的链路层协议,如高级数据链路控制(HDLC),定义了一种标准的帧结构和控制信息,用于同步和错误检测。而点对点协议(PPP)常用于连接两台设备,如路由器或主机,提供了一种在物理层之上封装多种网络层协议的方式。 数据链路层是网络通信的基础,它的各种协议和技术确保了数据的准确传输,同时处理链路级别的错误检测和纠正。停止等待协议是其中一种基础的错误控制机制,对于理解数据链路层的工作原理至关重要。

#ifndef FUNC_H_INCLUDED #define FUNC_H_INCLUDED #define MaxLNum 110 #define MaxCNum 110 #define MaxSize 10100 #define inf 10000 extern int arcs[MaxSize][MaxSize]; extern int s_nodes[MaxSize]; extern int g_nodes[MaxSize]; extern int dist[MaxSize]; extern int visited[MaxSize]; extern int pre[MaxSize]; extern int s_path[MaxSize][MaxSize]; extern int goal[MaxSize][2]; extern int s_vital[MaxSize][2]; //定义机器人(结构体)。 struct Robot{ int Pos[2]; //当前位置 char CTYPE; //当前的字符类型 struct ArEle{ char CType; int flag; }Around[8]; //周围结点的字符类型及其标记(从North开始,沿顺时针排列) }; typedef struct QNode* Queue; typedef struct Robot* PtrRt; typedef struct Node* PtrToNode; struct Node{ //队列中的结点 PtrRt Rt; PtrToNode Next; }; struct QNode { PtrToNode Front, Rear; // 队列的头、尾指针 }; Queue CreateQueue(); Queue AddQ( Queue Q, PtrRt Rt ); int IsEmpty( Queue Q ); PtrRt DeleteQ( Queue Q ); int** around(int pos[2]); int Judge(char c); void Record(PtrRt Rt,Queue Q,char expor[][MaxCNum]); PtrRt CreateRt(int x,int y,char store[][MaxCNum],int Llen,int Clen); void save_path(PtrRt Rt_1,PtrRt Rt_2,int Clen); PtrRt move(PtrRt Rt,int pos[2],char store[][MaxCNum],int Llen,int Clen); void BFS(PtrRt Rt,Queue Q,char store[][MaxCNum],char expor[][MaxCNum],int Llen,int Clen); void print_path(int path[],int u, int v,int Clen); void dijkstra(int begin,int nodes[],int Llen,int Clen); void Nicolas(char store[][MaxCNum],char expor[][MaxCNum],int Llen,int Clen); #endif // FUNC_H_INCLUDED解释代码

2023-05-30 上传