滑动窗口协议
本次实验内容较多,大致用时为9h,本次使用:14h。(本人比较菜)
初次理解
对于数据链路层,是物理层和网络层之间进行通信的一个层级。
物理层提供可靠的字节流服务,而对于网络层,要提供数据包服务。
所以在数据链路层要实现:**点到点传输帧(完整信息块,reliable,efficient)
(一)首先进行样例的加载与查看
显然这是最简单的全双工停等协议,没有启动ack定时器,不考虑ack失败。
(二)尝试简单的GoBackN Protocol(不搭载ack)
什么叫不搭载ACK?简而言之,就是一个在收到包之后单独回复ACK帧,一个把ACK放在传输的帧中。
第一类和第二类是互斥的,只能选择一种,ACK要么搭载在Frame中,要么单独按一帧发送。这里的协议是后者,虽然比较耗带宽,但优点是简单,ack回复及时。
首先在进行样例代码的搬运时,刚写一些就出现:C6262:(栈使用超过16Kb)
这是怎么回事呢?老师的代码里面是没有 这个毛病的。
原来我有下面离谱的代码:
typedef unsigned char Packet[PKT_LEN];
typedef struct FRAME {
Kind kind; /* 1:FRAME_DATA - 2:FRAME_ACK - 3:FRAME_NAK */ Seq_nr ack; /* send ack_number for received */ Seq_nr seq; /* frame_to_send */ Packet data[PKT_LEN]; /* in protocol.h: "#define PKT_LEN 256" */
unsigned int padding;
} Frame;
在申请Frame缓冲区时,直接PKT_LEN二维数组,栈爆炸了属于是。这个类型一定要注意。