计算机网络基础课程设计方案.docx
《计算机网络基础课程设计方案.docx》由会员分享,可在线阅读,更多相关《计算机网络基础课程设计方案.docx(21页珍藏版)》请在冰豆网上搜索。
计算机网络基础课程设计方案
信息技术学院
计算机网络基础
课程设计方案
目录
课程设计说明1
课程设计选题2
1.CRC算法模拟2
2.零比特填充模拟2
3.曼彻斯特编码模拟2
4.截断二进制指数退避算法3
5.透明网桥自学习与转发帧算法模拟3
6.IP分片模拟4
7.IP首部检验和算法模拟4
8.IPv4数据报封装模拟5
9.使用子网时IP分组转发模拟6
10.距离向量算法模拟7
11.UDP检验和算法模拟7
12.利用滑动窗口实现流量控制模拟8
13.慢开始、拥塞避免算法模拟9
课程设计示例11
1.字节填充法解决透明传输模拟11
课程设计选题
1.CRC算法模拟
【分值】20分
【页码】P68-69
【描述】
待传送的一组数据M以二进制字符存储在input_m.txt文件中,生成多项式P以二进制字符存储input_p.txt文件中。
编写CRC算法,计算冗余码R并输出到output_r文件中。
【提示】
a、模2加减可以采用按位异或运算的方法计算。
【举例】
input_m.txt
101001
input_p.txt
1101
output_r.txt
001
2.零比特填充模拟
【分值】10分
【页码】P74
【描述】
待传送的原始数据以二进制字符存储在input.txt文件中,内含若干5个连续1的子串、6个连续1的子串。
编写零比特填充算法,并将结果保存至output_f.txt文件;并且编写算法还原数据,结果保存至output_d.txt文件。
【提示】
a、原始数据只要包含5个连续1的子串、6个连续1的子串即可,内容任意。
【举例】
input.txt
010*********
output_f.txt
010*********
output_d.txt
010*********
3.曼彻斯特编码模拟
【分值】10分
【页码】P80
【描述】
待传送的原始数据以二进制字符存储在input.txt文件中。
编写曼彻斯特编码模拟算法,将编码的结果保证至output_e.txt;并且编写从电压高低到二进制数据的解码算法,结果保存至output_d.txt。
【提示】
a、用字符“HL”代表电压“前高后低”,表示码元1;用字符“LH”代表电压“前低后高”,表示码元0。
【举例】
input.txt
1000100111
output_e.txt
LHHLHLHLLHHLHLLHLHLH
output_d.txt
1000100111
4.截断二进制指数退避算法
【分值】10分
【页码】P82
【描述】
重传次数存储在input.txt文件中。
编写截断二进制指数退避算法,计算得到的重传推迟时间存入output.txt文件。
【提示】
a、以太网争用期为51.2μs,最多重传次数为16——这些可预定义为常量。
b、若重传已经超过16次,则将重传推迟时间设置为-1μs,表示应丢弃该帧。
【举例】
input.txt
1
output.txt
0(说明:
或51.2,随机选择;此括号内信息不是输出内容)
5.透明网桥自学习与转发帧算法模拟
【分值】20分
【页码】P94-96
【描述】
网络拓扑由input_top.txt文件给出,数据帧发送事件由input_event.txt文件给出。
网桥初始转发表为空。
试编写透明网桥自学习与转发帧算法,将网桥处理完每一发送事件后的网桥帧转发策略和当前转发表输出到output.txt文件。
【提示】
a、为简单起见,可以仅考虑单个两端口的网桥。
b、input_top.txt文件的每行包括“主机”、“连接的网桥端口号”等拓扑信息,主机用字母(除字母“Z”)编号,网络端口用数字编号。
c、input_event.txt文件的每行给出“源主机”、“目的主机”等信息,其中用目的主机为“Z”表示广播帧。
d、网桥帧转发策略的可能结果有“丢弃”、“向端口x转发“、”泛洪“。
e、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input_top.txt:
A1
B1
C2
D2
input_event.txt:
AD
BA
CZ
BC
output.txt:
事件1:
AtoD;网桥帧转发策略:
泛洪;转发表:
A1
事件2:
BtoA;网桥帧转发策略:
丢弃;转发表:
A1
B1
事件3:
CtoZ;网桥帧转发策略:
泛洪;转发表:
A1
B1
C2
事件4:
BtoC;网桥帧转发策略:
向端口2转发;转发表:
A1
B1
C2
6.IP分片模拟
【分值】10分
【页码】P123-124
【描述】
IP数据包原始长度、分片最大长度存储在input.txt文件中。
编写一算法计算分片结果,将每一分片的总长度、MF、DF、片偏移存入output.txt。
【提示】
a、设该IP首部无选项,IP固定首部长度为20字节。
b、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input.txt(注:
两字段分别是IP数据包原始长度、分片最大长度)
38201420
output.txt:
(注:
每行信息分别是分片总长度、MF、DF、片偏移)
1420100
142010175
102000350
7.IP首部检验和算法模拟
【分值】10分
【页码】P125
【描述】
20个字节的某IP首部以十六进制字符存储在input.txt文件中——每行8个字符(即4个字节),其中首部检验和字段为0。
编写IP首部检验和算法,检验和计算结果以4个十六进制字符形式存入output.txt。
【提示】
a、首部检验和的计算涉及每个字(16位)间的反码算术运算求和——计算规则见课本P125的脚注。
b、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input.txt:
45000086
4C374000
7F060000
C0A842D4
C0A863CB
output.txt:
874A
8.IPv4数据报封装模拟
【分值】20分
【页码】P122-125
【描述】
input.txt文件的第一行以点分十进制给出了某IP数据报的源IP地址、第二行以点分十进制给出了目的IP地址,第三行给出了待封装的TCP数据报长度。
整个TCP数据报的数据用字母“A”代替(ASCII为0x41)。
定义IP数据报固定首部数据结构,并编写封装算法,结果以每行8个的十六进制字符(即4个字节)存入output.txt文件。
【提示】
a、IP数据报首部的“区分服务字段填0、标识字段可随意设置、生存时间可随意设置(比如127),不考虑可选字段。
b、可以不考虑IP分片的问题,但应实现首部检验和的计算。
c、点分十进制地址到二进制地址的转换可以使用WinsockAPI(名词解释参见
unsignedlonginet_addr(constchar*cp)
入口参数cp:
点分十进制形式的IP地址
返回值:
网络字节顺序的IP地址,是无符号的长整数
d、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input.txt:
192.168.66.181
192.168.99.203
60
output.txt:
45000050
03704000
7F06D066
C0A842B5
C0A863CB
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
41414141
9.使用子网时IP分组转发模拟
【分值】20分
【页码】P133-135
【描述】
input_r.txt文件给出了某路由器的路由表,文件由若干行组成,每行给出了目的网络地址、子网掩码、下一跳地址等信息(地址均以点分十进制表示);input_d.txt文件给出了该路由器收到的一系列IP数据报点分十进制表示的目的IP地址。
编写使用子网时IP分组转发算法,将每一个IP数据报的处理结果输出到output.txt文件。
【提示】
a、点分十进制地址到二进制地址的转换可以使用WinsockAPI中的inet_addr函数。
b、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input_r.txt:
(注:
每行包括目的网络地址、子网掩码、下一跳地址等信息;最后一行给出了默认路由)
128.30.33.0255.255.255.128Interface0
128.30.33.128255.255.255.128Interface1
128.30.36.0255.255.255.0Router2
0.0.0.00.0.0.0Router3
input_d.txt:
128.30.33.13
128.30.33.130
128.30.36.2
128.50.39.3
output.txt:
(注:
每行包括目的IP地址、处理结果)
128.30.33.13Interface0
128.30.33.130Interface1
128.30.36.2Router2
128.50.39.3Router3
10.距离向量算法模拟
【分值】20分
【页码】P148-149
【描述】
input_r.txt文件给出了某路由器Rx的当前路由表信息,文件由若干行组成,第一行为路由器名,后续每行给出了目的网络(以网络名称表示)、距离、下一跳路由器等信息;input_n.txt文件给出了路由器Rx刚接收到的来自相邻路由器Ry的RIP路由更新信息,文件由若干行组成,第一行为路由器名,后续每行给出了目的网络、距离、下一跳路由器等信息。
编写距离向量更新算法,将路由器Rx更新后的路由表写入output.txt。
【提示】
a、可参照课本P149例4-5,以网络名称表示目的网络、以路由器名称或“直接交付”给出下一跳路由器信息。
b、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input_r.txt:
R6
Net23R4
Net34R5
input_n.txt:
R4
Net13R1
Net24R2
Net31直接交付
output.txt:
R6
Net14R4
Net25R4
Net32R4
11.UDP检验和算法模拟
【分值】10分
【页码】P185-187
【描述】
input.txt文件的第一、二行分别以点分十进制给出某即将传输的UDP数据报的源IP地址和目的IP地址,后续每行8个十六进制字符(即4个字节)给出整个UDP数据报的数据(其中检验和字段为0,最后一行可能少于4个字节)。
编写UDP检验和算法,检验和计算结果以4个十六进制字符形式存入output.txt。
【提示】
a、点分十进制地址到二进制地址的转换可以使用WinsockAPI中的inet_addr函数。
b、UDP的检验和计算包括伪首部、UDP首部和UDP数据部分,其中数据部分字节数为奇数时需在末尾填入一个全零字节参与计算。
c、一行中的多个字段自行决定分隔符,比如空格或制表符等。
【举例】
input.txt:
153.19.8.104
171.3.14.11
043F000D
000F0000
54455354
494E47
output.txt:
6912
12.利用滑动窗口实现流量控制模拟
【分值】20分
【页码】P203-204
【描述】
input.txt文件的第一行给出主机A发送给主机B的TCP报文段的大小(单位:
字节),第二行给出了主机A发送的起始序号seq,第三行给出了主机B设置的初始接收窗口rwnd的大小(单位:
字节),后续若干行描述了报文段传输事件——每行的第一个字段是方向(“A->B”或“B->A”),若方向为“A->B”则该行后续字段包括标志(“新发”或“重发”)、结果(“成功”或“丢失”),若方向为“A->B”则该行后续字段为新的接收窗口rwnd。
编写利用滑动窗口实现流量控制模拟算法,将处理结果写入output.txt——每行为一次传输事件的信息,包括方向、序号(若方向为“A->B”则为发送序号seq,若方向为“B->A”则为确认序号ack)、A主机实际还可发送的字节数(即减去已发字节数)、A主机实际还可发送的序号范围(若前一字段为0则不写此项)。
【提示】
a、设置两全局变量分别记录发送序号seq和确认序号ack,在处理每一事件时及时更新seq、ack的值。
b、确认序号ack是期望收到对方下一个报文段的第一个数据字节的序号。
c、设置一数组记录传输丢失的报文段序号,以便重传。
d、若一行有多个字段,自行决定分隔符,比如空格或制表符等。
【举例】
input.txt:
100
1
400
A->B新发成功
A->B新发成功
A->B新发丢失
B->A300
A->B新发成功
A->B新发成功
A->B重发成功
B->A100
A->B新发成功
B->A0
output.txt:
A->Bseq=1300101-400
A->Bseq=101200201-400
A->Bseq=201100301-400
B->Aack=201200301-500
A->Bseq=301100401-500
A->Bseq=4010
A->Bseq=2010
B->Aack=501100501-600
A->Bseq=5010
B->Aack=6010
13.慢开始、拥塞避免算法模拟
【分值】20分
【页码】P208-210
【描述】
input_s.txt文件给出了慢开始门限ssthresh状态变量的初始值;input_c.txt文件给出了若干个出现网络拥塞的传输轮次(取值在1-30之间)。
编写慢开始、拥塞避免模拟算法,计算并输出前30个传输轮次的拥塞窗口cwnd等信息,结果存入output.txt——每行包含轮次、cwnd、ssthresh、现用算法等信息。
【提示】
a、此模拟中的窗口单位不使用字节而使用报文段的个数。
b、拥塞窗口cwnd的初值为1,即第1传输轮次允许传输一个报文段,传输成功后cwnd即按照指数规律增长为2。
c、若一行有多个字段,自行决定分隔符,比如空格或制表符等。
【举例】
input_s.txt
16
input_c.txt
1223
output.txt:
1216慢开始
2416慢开始
3816慢开始
41616拥塞避免
51716拥塞避免
61816拥塞避免
71916拥塞避免
82016拥塞避免
92116拥塞避免
102216拥塞避免
112316拥塞避免
122416拥塞避免
13112慢开始
14212慢开始
15412慢开始
16812慢开始
171212拥塞避免
181312拥塞避免
191412拥塞避免
201512拥塞避免
211612拥塞避免
221712拥塞避免
231812拥塞避免
2419慢开始
2529慢开始
2649慢开始
2789慢开始
2899拥塞避免
29109拥塞避免
30119拥塞避免
课程设计示例
14.字节填充法解决透明传输模拟
【分值】10分
【页码】P67
【描述】
待传送的原始数据以十六进制字符存储在input.txt文件中,内含SOH(0x01)、EOT(0x04)、ESC(0x1B)等字符。
编写字节填充算法,并将结果保存至output_f.txt文件;并且编写算法还原数据,结果保存至output_d.txt文件。
【提示】
a、原始数据只要包含3种特殊字符即可,内容任意。
b、存储原始数据的input.txt文件中只可能出现十六进制字符,且长度为偶数。
【举例】
input.txt
AC00013C5604201B76
output_f.txt
AC001B013C561B04201B1B76
output_d.txt
AC00013C5604201B76
【程序清单】
01#include"stdio.h"
02
03typedefintstatus;
04#defineTRUE1
05#defineFALSE0
06
07#defineMAX_BUF_LEN1500
08
09#defineSOH0x01
10#defineEOT0x04
11#defineESC0x1B
12
13typedefstructStuffingString
14{
15unsignedcharbuf[MAX_BUF_LEN];
16unsignedintlen;
17}*PStuffingString;
18
19statusbyte_stuffing(PStuffingStringpsin,PStuffingStringpsf)
20{
21unsignedinti=0;
22psf->len=0;
23while(ilen)
24{
25if(psin->buf[i]==SOH||psin->buf[i]==EOT||psin->buf[i]==ESC)
26psf->buf[psf->len++]=ESC;
27psf->buf[psf->len++]=psin->buf[i++];
28}
29returnTRUE;
30}
31
32statusbyte_unstuffing(PStuffingStringpsf,PStuffingStringpsd)
33{
34unsignedinti=0;
35psd->len=0;
36while(ilen)
37{
38if(psf->buf[i]==ESC)
39{
40i++;
41if(psf->buf[i]!
=SOH&&psf->buf[i]!
=EOT&&psf->buf[i]!
=ESC)
42returnFALSE;
43}
44psd->buf[psd->len++]=psf->buf[i++];
45}
46returnTRUE;
47}
48
49statusinput(charf[],PStuffingStringpsin)
50{
51FILE*fp;
52psin->len=0;
53if((fp=fopen(f,"r"))==NULL)
54returnFALSE;
55while(fscanf(fp,"%2X",&psin->buf[psin->len++])!
=EOF);
56psin->len--;
57if(fclose(fp))
58returnFALSE;
59returnTRUE;
60}
61
62statusoutput(charf[],PStuffingStringpsout)
63{
64FILE*fp;
65unsignedinti=0;
66if((fp=fopen(f,"w"))==NULL)
67returnFALSE;
68while(ilen)
69{
70if(psout->buf[i]<0x10)
71fprintf(fp,"0");
72fprintf(fp,"%0X",psout->buf[i++]);
73}
74if(fclose(fp))
75returnFALSE;
76returnTRUE;
77}
78
79voidmain()
80{
81StuffingStringsin,sf,sd;
82if(input("c:
\input.txt",&sin)==TRUE)
83{
84if(byte_stuffing(&sin,&sf)==TRUE)
85{
86output("c:
\output_f.txt",&sf);
87if(byte_unstuffing(&sf,&sd)==TRUE)
88{
89output("c:
\output_d.txt",&sd);
90printf("byte-stuffing/unstuffingsuccessful!
\n");
91}
92}
93}
94}