计算机网络基础课程设计方案Word格式.docx
《计算机网络基础课程设计方案Word格式.docx》由会员分享,可在线阅读,更多相关《计算机网络基础课程设计方案Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
并且编写算法还原数据,结果保存至output_d.txt文件。
a、原始数据只要包含5个连续1的子串、6个连续1的子串即可,内容任意。
input.txt
010*********
output_f.txt
output_d.txt
3.曼彻斯特编码模拟
【页码】P80
待传送的原始数据以二进制字符存储在input.txt文件中。
编写曼彻斯特编码模拟算法,将编码的结果保证至output_e.txt;
并且编写从电压高低到二进制数据的解码算法,结果保存至output_d.txt。
a、用字符“HL”代表电压“前高后低”,表示码元1;
用字符“LH”代表电压“前低后高”,表示码元0。
1000100111
output_e.txt
LHHLHLHLLHHLHLLHLHLH
4.截断二进制指数退避算法
【页码】P82
重传次数存储在input.txt文件中。
编写截断二进制指数退避算法,计算得到的重传推迟时间存入output.txt文件。
a、以太网争用期为51.2μs,最多重传次数为16——这些可预定义为常量。
b、若重传已经超过16次,则将重传推迟时间设置为-1μs,表示应丢弃该帧。
1
output.txt
0(说明:
或51.2,随机选择;
此括号内信息不是输出内容)
5.透明网桥自学习与转发帧算法模拟
【页码】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;
网桥帧转发策略:
泛洪;
转发表:
事件2:
BtoA;
丢弃;
事件3:
CtoZ;
事件4:
BtoC;
向端口2转发;
6.IP分片模拟
【页码】P123-124
IP数据包原始长度、分片最大长度存储在input.txt文件中。
编写一算法计算分片结果,将每一分片的总长度、MF、DF、片偏移存入output.txt。
a、设该IP首部无选项,IP固定首部长度为20字节。
b、一行中的多个字段自行决定分隔符,比如空格或制表符等。
input.txt(注:
两字段分别是IP数据包原始长度、分片最大长度)
38201420
(注:
每行信息分别是分片总长度、MF、DF、片偏移)
1420100
142010175
102000350
7.IP首部检验和算法模拟
【页码】P125
20个字节的某IP首部以十六进制字符存储在input.txt文件中——每行8个字符(即4个字节),其中首部检验和字段为0。
编写IP首部检验和算法,检验和计算结果以4个十六进制字符形式存入output.txt。
a、首部检验和的计算涉及每个字(16位)间的反码算术运算求和——计算规则见课本P125的脚注。
input.txt:
45000086
4C374000
7F060000
C0A842D4
C0A863CB
874A
8.IPv4数据报封装模拟
【页码】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、一行中的多个字段自行决定分隔符,比如空格或制表符等。
192.168.66.181
192.168.99.203
60
45000050
03704000
7F06D066
C0A842B5
41414141
41414141
9.使用子网时IP分组转发模拟
【页码】P133-135
input_r.txt文件给出了某路由器的路由表,文件由若干行组成,每行给出了目的网络地址、子网掩码、下一跳地址等信息(地址均以点分十进制表示);
input_d.txt文件给出了该路由器收到的一系列IP数据报点分十进制表示的目的IP地址。
编写使用子网时IP分组转发算法,将每一个IP数据报的处理结果输出到output.txt文件。
a、点分十进制地址到二进制地址的转换可以使用WinsockAPI中的inet_addr函数。
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
每行包括目的IP地址、处理结果)
128.30.33.13Interface0
128.30.33.130Interface1
128.30.36.2Router2
128.50.39.3Router3
10.距离向量算法模拟
【页码】P148-149
input_r.txt文件给出了某路由器Rx的当前路由表信息,文件由若干行组成,第一行为路由器名,后续每行给出了目的网络(以网络名称表示)、距离、下一跳路由器等信息;
input_n.txt文件给出了路由器Rx刚接收到的来自相邻路由器Ry的RIP路由更新信息,文件由若干行组成,第一行为路由器名,后续每行给出了目的网络、距离、下一跳路由器等信息。
编写距离向量更新算法,将路由器Rx更新后的路由表写入output.txt。
a、可参照课本P149例4-5,以网络名称表示目的网络、以路由器名称或“直接交付”给出下一跳路由器信息。
R6
Net23R4
Net34R5
input_n.txt:
R4
Net13R1
Net24R2
Net31直接交付
Net14R4
Net25R4
Net32R4
11.UDP检验和算法模拟
【页码】P185-187
input.txt文件的第一、二行分别以点分十进制给出某即将传输的UDP数据报的源IP地址和目的IP地址,后续每行8个十六进制字符(即4个字节)给出整个UDP数据报的数据(其中检验和字段为0,最后一行可能少于4个字节)。
编写UDP检验和算法,检验和计算结果以4个十六进制字符形式存入output.txt。
b、UDP的检验和计算包括伪首部、UDP首部和UDP数据部分,其中数据部分字节数为奇数时需在末尾填入一个全零字节参与计算。
c、一行中的多个字段自行决定分隔符,比如空格或制表符等。
153.19.8.104
171.3.14.11
043F000D
000F0000
54455354
494E47
6912
12.利用滑动窗口实现流量控制模拟
【页码】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、若一行有多个字段,自行决定分隔符,比如空格或制表符等。
100
1
400
A->
B新发成功
B新发丢失
B->
A300
B重发成功
A100
A0
Bseq=1300101-400
Bseq=101200201-400
Bseq=201100301-400
Aack=201200301-500
Bseq=301100401-500
Bseq=4010
Bseq=2010
Aack=501100501-600
Bseq=5010
Aack=6010
13.慢开始、拥塞避免算法模拟
【页码】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
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.字节填充法解决透明传输模拟
【页码】P67
待传送的原始数据以十六进制字符存储在input.txt文件中,内含SOH(0x01)、EOT(0x04)、ESC(0x1B)等字符。
编写字节填充算法,并将结果保存至output_f.txt文件;
a、原始数据只要包含3种特殊字符即可,内容任意。
b、存储原始数据的input.txt文件中只可能出现十六进制字符,且长度为偶数。
AC00013C5604201B76
AC001B013C561B04201B1B76
【程序清单】
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(i<
psin->
len)
24{
25if(psin->
buf[i]==SOH||psin->
buf[i]==EOT||psin->
buf[i]==ESC)
26psf->
buf[psf->
len++]=ESC;
27psf->
len++]=psin->
buf[i++];
28}
29returnTRUE;
30}
31
32statusbyte_unstuffing(PStuffingStringpsf,PStuffingStringpsd)
33{
34unsignedinti=0;
35psd->
36while(i<
psf->
37{
38if(psf->
39{
40i++;
41if(psf->
buf[i]!
=SOH&
&
psf->
=EOT&
=ESC)
42returnFALSE;
43}
44psd->
buf[psd->
len++]=psf->
45}
46returnTRUE;
47}
48
49statusinput(charf[],PStuffingStringpsin)
50{
51FILE*fp;
52psin->
53if((fp=fopen(f,"
r"
))==NULL)
54returnFALSE;
55while(fscanf(fp,"
%2X"
&
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"
67returnFALSE;
68while(i<
psout->
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("
\output_f.txt"
sf);
87if(byte_unstuffing(&
sf,&
sd)==TRUE)
88{
89output("
\output_d.txt"
sd);
90printf("
byte-stuffing/unstuffingsuccessful!
\n"
91}
92}
93}
94}