本次实验内容较多,大致用时为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二维数组,栈爆炸了属于是。这个类型一定要注意。