基于数据链路层原理实现的滑动窗口协议

目 录

目 录 2
实验一:数据链路层滑动窗口协议的设计与实现 4
1.实验类别 4
2.实验内容和实验目的 4
3.实验学时 4
4.实验组人数 4
5.实验设备环境 4
6.教学要点与学习难点 4
7.实验步骤 5
7.1熟悉编程环境 5
7.2协议设计和程序总体设计 5
7.3编码和调试 5
7.4软件测试和性能评价 5
7.5实验报告及程序验收 5
8.编程环境 6
8.1程序的总体结构 6
8.2Windows 环境下编译及运行方法 7
8.3Linux 环境下编译及运行方法 8
8.4日志 8
8.5协议运行环境的初始化 9
8.6与网络层模块的接口函数 9
8.7事件驱动函数及程序流程 10
8.8与物理层模块的接口函数 11
8.9CRC 校验和的产生与验证 12
8.10定时器管理 12
8.11协议工作过程的跟踪和调试 13
8.12命令行选项 13
8.13错误信息 15
8.14样例程序文件 datalink.c 15
9.正确性测试及性能测试 16
10.研究与探索的问题 16
10.1CRC 校验能力 16
10.2CRC 校验和的计算方法 16
10.3程序设计方面的问题 17
10.4软件测试方面的问题 17
10.5对等协议实体之间的流量控制 17
10.6与标准协议的对比 17
11.实验报告要求 18
11.1实验内容和实验环境描述 18
11.2软件设计 18
11.3实验结果分析 18
11.4研究和探索的问题 18
11.5实验总结和心得体会 18
11.6源程序清单 19
附录一 源程序书写格式 20

1.实验类别
程序设计型

2.实验内容和实验目的
利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。信道模型为 8000bps 全双工卫星信道,信道传播时延 270 毫秒,信道误码率为 10-5,信道提供字节流传输服务,网络层分组长度固定为 256 字节。
通过该实验,进一步巩固和深刻理解数据链路层误码检测的 CRC 校验技术,以及滑动窗口的工作机理。滑动窗口机制的两个主要目标:(1) 实现有噪音信道环境下的无差错传输; (2)充分利用传输信道的带宽。在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及 ACK 搭载定时器的时限。这些参数的设计,需要充分理解滑动窗口协议的工作原理并利用所学的理论知识,经过认真的推算,计算出最优取值,并通过程序的运行进行验证。
通过该实验提高同学的编程能力和实践动手能力,体验协议软件在设计上各种问题和调试难度,设计在运行期可跟踪分析协议工作过程的协议软件,巩固和深刻理解理论知识并利用这些知识对系统进行优化,对实际系统中的协议分层和协议软件的设计与实现有基本的认识。

3.实验学时
9 学时。

4.实验组人数
1~3 人,共同完成协议的设计和理论分析,程序编码与调试,功能测试,协议工作参数的优化,研讨提出的相关问题,撰写实验报告。

5.实验设备环境
Windows 环境 PC 机,Microsoft Visual Studio 2013+集成化开发环境。

6.教学要点与学习难点
课堂教学和教材中给出了滑动窗口协议的基本原理,并给出了多个示意性程序,尤其是“回退 N 步
(Go-Back-N)”协议和“选择重传”协议。这些示意性伪代码程序主要用于描述协议的基本工作过程并阐述滑动窗口的基本原理,为了突出主题还省略了许多处理细节,不能实际运行。一个网络协议的具体实现程序可能会作为一个操作系统支撑下的独立进程,或者,作为操作系统内核中的中断服务程序或驱动程序。协议的具体实现会受到协议软件所处的操作系统支撑环境或者内核编程模式的限制。本次实验所提供的编程环境用 Windows 中的一个进程仿真链路层的一个站点,程序的设计受限于编程环境所提供的功能以及实验题目所设定的具体问题和目标。因此,不可能完全照搬课堂教学中的示意性程序进行简单的原理验证,必须认真考虑具体问题和具体软件设计环境,但这些示意性程序有重要的参考作用。

实验题目给出了物理层信道模型和分组层数据的大小,链路层协议的设计有很大的自由度。由组内同学共同讨论完成,包括帧控制字段的设计,滑动窗口的过程控制。从易到难,可选的协议类型为“不搭载 ACK 的 Go-Back-N 协议”,“使用搭载 ACK 技术的 Go-Back-N 协议”,“选择重传协议”,要求必须是全双工通信协议。组内同学根据自身条件和不同协议类型的难度系数选做其中一种或多种。
教材中的示意性程序未对滑动窗口尺寸和重传定时器时限的详细设计进行充分说明。在实验过程中需要利用基本原理,明确协议工作参数取值的变化对协议工作正确性和信道利用率的利弊影响,根据具体信道情况和协议软件的实现方案,为协议参数设置最优值,以追求高线路利用率。指导教师提供一个可执行样例程序,将所实现的协议软件所达到的性能与样例程序比较,分析自己所实现软件的优势或缺陷。从理论上推导出线路利用率的极限,依此作为基本依据衡量所实现软件的性能优劣。找出所设计软件达到的线路利用率与理想性能之间的差距,并给出改进算法或者未能达到理想性能的原因。
整个程序的编程工作量不大,但是考虑到对滑动窗口协议的工作原理的理解可能不够深入和细致, 考虑到协议软件调试的困难程度,以及完成实验的同学对 C 语言的运用和操控能力,软件调试中遇到问题后解决问题的能力,以及代码中逻辑的复杂程度,对完成整个实验应给予足够重视。

/*  
    CRC polynomium: 
        x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + 
        x^8 + x^7 + x^5  + x^4 + x^2 + x + 1
*/

static const unsigned int crc_table[256] = {
    
    
    0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
    0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
    0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
    0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
    0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
    0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
    0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
    0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
    0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
    0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
    0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
    0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
    0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
    0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
    0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
    0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
    0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
    0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
    0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
    0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
    0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
    0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
    0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
    0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
    0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
    0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
    0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
    0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
    0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
    0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
    0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
    0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
    0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
    0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
    0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
    0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
    0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
    0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
    0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
    0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
    0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
    0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
    0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
    0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
    0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
    0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
    0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
    0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
    0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
    0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
    0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
    0x2d02ef8dL
};

#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
#define DO2(buf)  DO1(buf); DO1(buf);
#define DO4(buf)  DO2(buf); DO2(buf);
#define DO8(buf)  DO4(buf); DO4(buf);

unsigned int crc32(unsigned char *buf, int len)
{
    
    
    unsigned int crc = 0xffffffffL;

    while (len >= 8) {
    
    
        DO8(buf);
        len -= 8;
    }

    if (len) {
    
    
        do {
    
    
            DO1(buf);
        } while (--len);
    }

    return crc;
}

#if 0

#include <stdio.h>
#include <stdlib.h>

void test_crc32(void)
{
    
    
    unsigned int i, j, n;
    unsigned char buf[1024];
    
    for (j = 0; ; j++) {
    
    

        n = 1 + rand() % 1020;

        for (i = 0; i < n; i++) 
            buf[i] = rand();

        *(unsigned int *)(buf + n) = crc32(buf, n);
       
        if (crc32(buf, n + 4) != 0)
            printf("CRC ERROR\n");

        if (j % 65536 == 0) {
    
    
            printf("Test %d\r", j);
            fflush(stdout);
        }
    }
}

#endif

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/newlw/article/details/129744122