计算机网络实验指导书内蒙古大学.docx
- 文档编号:5344675
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:17
- 大小:33.86KB
计算机网络实验指导书内蒙古大学.docx
《计算机网络实验指导书内蒙古大学.docx》由会员分享,可在线阅读,更多相关《计算机网络实验指导书内蒙古大学.docx(17页珍藏版)》请在冰豆网上搜索。
计算机网络实验指导书内蒙古大学
计算机网络
实验指导书
内蒙古大学计算机学院
2004年8月
前言
《计算机网络》课程是计算机科学与技术专业的重要专业课程之一。
随着计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给《计算机网络》课程的教学提出了新的更高的要求。
由于本课程是一门实践性较强的技术,课堂教学应该与实践环节紧密结合。
将《计算机网络》课程建设成国家一流的课程,是近期《计算机网络》课程努力的方向。
目前,本课只能利用实验室现有的条件进行实验的设计,本实验的环境与Linux课程的相同,因此在此不再赘述。
希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。
希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《计算机网络》成为具有国家一流水平的课程。
本学期授课教师为石立新和李华,参与网络课教学环节的同事还有许智君、敖腾河等。
此外研究生刘靖、丁雪莲、陈银凤等同学也给予了热情的支持和帮助。
在此对他们表示感谢
目录
第一部分.实验要求
第二部分实验准备及简要上机指导
2.1上机基本操作
2.2书写makefile工程文件
2.3编译器
2.4注意事项
第三部分实验内容
实验1、熟练掌握socket编程
实验2、完成一个TCPClient/Server模式的通信程序
实验3、数据链路层协议的设计与实现
实验4、实现滑动窗口协议
实验5、浏览/构建一个能提供Web服务的网站
实验6、浏览并体会应用层协议HTTP、DNS、POP3等的工作原理
注:
实验五和实验六选一作
附录1、计算机网络实验辅导教师的准备工作
附录2、Linux网络编程
附录3、基本数据链路层协议(中文,英文)
附录4、滑动窗口协议(中文,英文)
第一部分.实验要求
计算机网络是现代信息社会最重要的基础设施之一。
在过去十几年里得到了迅速的发展和应用。
《计算机网络》课程实验的目的是为了使学生在课程学习的同时,通过在一个计算机网络环境中的实际操作,对现代计算机网络的基本功能有一个初步的了解;通过实现一个数据链路层协议,掌握计算机网络通信协议的基本实现技术;通过一个简单文件传送协议的设计和实现,了解计算机网络高层协议设计实现的环境和方法;通过实现一个简单的协议状态机了解、掌握协议描述和实现中这一重要技术;还提供了一些选做实验以供有余力有兴趣的同学进一步提高。
总之,通过上述实验环节,使学生加深了解和更好地掌握《计算机网络》课程教学大纲要求的内容。
在《计算机网络》的课程实验过程中,要求学生做到:
(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。
(2)仔细观察上机和上网操作时出现的各种现象,记录主要情况,作出必要说明和分析。
(3)认真书写实验报告并在规定的时间内把实验报告交给辅导教师。
实验报告包括实验目的和要求,实验情况及其分析。
对需要编程的实验,写出程序设计说明,给出源程序框图和清单。
(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。
(5)实验课程不迟到。
如有事不能出席,所缺实验一般不补。
实验的验收将分为两个部分。
第一部分是上机操作,包括检查程序运行和即时提问。
第二部分是提交书面的实验报告。
此外,针对以前教学中出现的问题,
网络实验将采用阶段检查方式,每个实验都将应当在规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩。
以避免期末集中检查方式产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成。
第二部分实验准备及简要上机指导
本部分将提供三个方面的基础知识以方便同学使用系统进行实验:
上机基本操作,介绍开机,关机,登录,修改密码等操作;网络基本操作,telnet,ftp;工程文件,书写makefile的基础知识等。
更详细的内容及深入知识同学可根据个人需要及兴趣查阅有关技术资料。
2.1上机基本操作
(1)开机:
打开机器
(2)telnet:
1)使用telnet命令登录到服务器
2)利用所分配的帐号,密码登录到系统
3)请同学们在首次登陆后立刻修改自己的密码
(3)关机:
首先退出用户自己的帐号,回到系统提示登录状态
由于操作系统Linux的文件系统管理组织方式,对于文件系统的完整性有很高的要求,非正常关机会造成文件系统不完整,至使系统下次启动故障,严重时需要重新安装系统!
因此要求同学严格按照操作规程进行。
如遇特殊情况,可以请辅导教师或系统管理员协助解决。
2.2书写makefile工程文件
很多同学在Linux环境下编程都采用过类似下面的命令:
ccmyprogram.c-omyprogram
这种方式对于简单的文件编译还能够发挥作用,当工程项目比较大、文件个数比较多时,采用这种方式非常麻烦,还容易出错;如果写成一个类似批处理的Shell脚本,虽然方便安全了一些,但是如果只是修改了其中一个文件,为了得到新的版本,就要重新编译所有源文件,会浪费大量时间和计算机资源,诸如此类还有很多问题;而实际上,Linux系统下都提供了工程维护机制,Linux操作系统所提供的make命令就可以很好地解决上述问题,VC、Delphi之类中的项目文件的作用大抵都来源于此。
make程序帮助程序员完成程序编译,执行make命令,make程序缺省去寻找makefile或Makefile文件进行工作,如果要使用其他文件则需要通过make的-f选项制定。
首先看一个makefile的简单例子以了解其功能:
#samplemakefile
targetfile:
target.ctarget.h
gcctarget.c-otargetfile
其中以#开头的行为注释,将被make程序忽略。
makefile由一系列“规则”构成,
每个规则的构成如下所示
目标:
依赖关系
动作
注意在gcc(是一种C编译器的)之前是一个Tab(制表符),不是一系列的空格。
上面的例子描述了targetfile依赖于target.c文件和target.h文件,如果这两个文件任何一个更新了,那么为得到新版本的targetfile,就要重新进行编译,具体如何得到则通过下面一行“动作”指明:
运行gcc编译target.c,得到targetfile。
再来看一个例子:
#samplemakefile
targetfile:
target01.otarget02.otarget.h
gcctarget01.otarget02.o-otargetfile
target01.o:
target01.ctarget01.h
gcc-ctarget01.c-otarget01.o
target02.o:
target02.ctarget02.h
gcc-ctarget02.c-otarget02.o
在这个例子中,最终的目的是为了得到targetfile,它依赖于target01.o,target02.o,target.h三个文件,如果这三个文件都有且时间早于targetfile(如果已经存在的话),则不需做任何事情,只是显示targetfileisuptodate之类的信息。
现在假设target01.o文件不存在,则make继续查找如何得到target01.o,根据如何得到target01.o的规则进行处理,完成后返回前一规则,最终得到targetfile,如果过程中发现任何错误,则程序员需要根据错误信息进行修改。
借助一些Shell脚本的知识,可以把makefile写得更加实用,比如:
#
#makefileforexp01writtenbysomebody2000/10/15
#
CFLAGS=-g-c
LIB=-lsocket-lnsl
CC=gcc
TARGET=targetfile
${TARGET}:
target01.otarget02.otarget.h
$(CC)$(LIB)target01.otarget02.o-o$(TARGET)
target01.o:
target01.ctarget01.h
$(CC)$(CFLAGS)target01.c-otarget01.o
target02.o:
target02.ctarget02.h
$(CC)$(CFLAGS)target02.c-otarget02.o
上面的例子中用到了一些UNIXShell知识,比如变量赋值和宏替换。
makefile的功能可以非常强大,当然编写起来也更为复杂,有兴趣的同学可以查阅有关资料。
推荐同学们在做实验时,学写学用makefile和使用make命令。
2.3编译器
实验环境中提供的C编译器为gcc,编译选项和方法与cc类似。
2.4注意事项
帐号和密码是用户在系统中的标识和使用凭证,关系到用户及系统的安全,要求同学维护好自己的帐号和密码。
由于网络课提供的是一个实验环境,系统对于同学的使用限制较为宽松,希望同学们不要进行危害系统安全和性能的活动。
如果在学习和实验中确有特殊要求,请及时与系统管理员或辅导教师联系,实验室将尽力为同学提供条件和方便。
第三部分实验内容
实验1、熟练掌握socket编程
一、实验目的
熟练掌握socket编程命令。
二、实验内容
现在,我们来看一个简单的客户机/服务器程序的实现,它用套接字接口在TCP连接上发送消息。
这个程序还用到了其他的UNIX网络功能,我们将逐个介绍。
我们的应用允许用户在一端的机器上输入并把文本发送给另一端机器的用户。
它是UNIX中talk的一个简化版本,类似于WEB聊天室的核心程序。
1.客户端
我们先从客户端开始,它用远端的机器名作为参数。
它调用UNIX程序gethostbyname把该名字转化为远端主机的IP地址。
下一步构造套接字接口所需的地址数据结构(sin)。
注意这个数据结构表明我们将一直用套接字与因特网(AF_INET)连接。
在这个例子中,我们用TCP端口号5432作为共知的服务器端口号;它恰好不是分配给其他因特网服务的端口号。
建立连接的最后一步是调用socket和connect。
一旦connect操作返回,建立起连接,客户程序将进入主循环,不断从标准输入读文本并通过套接字发送。
#include
#include
#include
#include
#include
#defineSERVER_PORT5432
#defineMAX_LINE256
int
main(intargc,char*argv[])
{
FILE*fp;
structhostent*hp;
structsockaddr_insin;
char*host;
charbuf[MAX_LINE];
ints;
intlen;
if(argc==2){
host=argv[1];
}
else{
fprintf(stderr,”usage:
simplex-talkhost\n”);
exit
(1);
}
/*将主机名翻译成对等实体的IP地址*/
hp=gethostbyname(host);
if(!
hp){
fprintf(stderr,”simplex-talk:
unknownhost:
%s\n”,host);
exit
(1);
}
/*建立地址数据结构*/
bzero((char*)&sin,sizeof(sin));
sin.sin_family=AF_INET;
bcopy(hp->h_addr,(char*)&sin.sin_addr,hp->h_length);
sin.sin_port=htons(SERVER_PORT);
/*主动打开*/
if((s=socket(PF_INET,SOCK_STREAM,0))<0){
perror(“simplex-talk:
socket”);
exit
(1);
}
if(connect(s,(structsockaddr*)&sin,sizeof(sin))<0){
perror(“simplex-talk:
connect”);
close(s);
exit
(1);
}
/*主循环:
获得并发送文本行*/
while(fgets(buf,sizeof(buf),stdin)){
buf[MAX_LINE-1]=’\0’;
len=strlen(buf)+1;
send(s,buf,len,0);
}
}
2.服务器
服务器的实现也很简单。
首先,它填上自己的端口号(SERVER_PORT)构造地址数据结构。
其次,它并不指明IP地址,从而使应用程序可以接受来自本地任一IP地址的连接。
然后,服务器执行与被动打开有关的初始步骤:
建立一个套接字,将它绑定到本地地址,然后设置允许同时连接的最大数。
最后,主循环等待远端主机试图与之连接,当远端有一台主机试图与之连接时,它就接收并输出连接上送来的字符。
#include
#include
#include
#include
#include
#defineSERVER_PORT5432
#defineMAX_PENDING5
#defineMAX_LINE256
intmain()
{
structsockaddr_insin;
charbuf[MAX_LINE];
intlen;
ints,new_s;
/*建立地址数据结构*/
bzero((char*)&sin,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=INADDR_ANY;
sin.sin_port=htons(SERVER_PORT);
/*建立被动连接*/
if((s=socket(PF_INET,SOCK_STREAM,0))<0){
perror(“simplex-talk:
socket”);
exit
(1);
}
if((bind(s,(structsockaddr*)&sin,sizeof(sin)))<0){
perror(“simplex-talk:
bind”);
exit
(1);
}
listen(s,MAX_PENDING);
/*等待连接,然后接收并输出文本*/
while
(1){
if((new_s=accept(s,(structsockaddr*)&sin,&len))<0){
perror(“simplex-talk:
accept”);
exit
(1);
}
while(len=recv(new_s,buf,sizeof(buf),0))
fputs(buf,stdout);
close(new_s);
}
}
三、参见附录2
实验2、完成UDP、TCPClient/Server模式的通信程序
一、实验目的
熟练掌握UDP、TCPClient/Server模式的通信原理。
二、实验内容
关于UDP的介绍可以参见教科书。
传输控制协议(TransportControlProtocol)是一种面向连接的,可靠的传输层协议。
面向连接是指一次正常的TCP传输需要通过在TCP客户端和TCP服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。
可靠性可以通过很多种方法来提供保证,在这里我们关心的是数据序列和确认。
TCP通过数据分段(Segment)中的序列号保证所有传输的数据可以在远端按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
要通过TCP传输数据,必须在两端主机之间建立连接。
举例说明,TCP客户端需要和TCP服务端建立连接,过程如下所示:
TCPClient
Flags
TCPServer
1SendSYN
(seq=w)
----SYN--->
SYNReceived
2SYN/ACK
Received
<---SYN/ACK----
SendSYN(seq=x),ACK(w+1)
3SendACK(x+1)
----ACK--->
ACKReceived,Connection
Established
w:
ISN(InitialSequenceNumber)oftheClient
x:
ISNoftheServer
在第一步中,客户端向服务端提出连接请求。
这时TCPSYN标志置位。
客户端告诉服务端序列号区域合法,需要检查。
客户端在TCP报头的序列号区中插入自己的ISN。
服务端收到该TCP分段后,在第二步以自己的ISN回应(SYN标志置位),同时确认收到客户端的第一个TCP分段(ACK标志置位)。
在第三步中,客户端确认收到服务端的ISN(ACK标志置位)。
到此为止建立完整的TCP连接,开始全双工模式的数据传输过程。
根据以上内容编写一个TCPClient/Server模式的通信程序。
事实上网络程序是由两个部分组成的--客户端和服务器端.它们的建立步骤服务器端
socket-->bind-->listen-->accept
客户端
socket-->connect。
三、实验步骤
实验按下述步骤进行:
(1)编写UDP、TCPClient/Server模式的通信程序;
(2)调试并运行自己编写的实现程序;
(3)了解TCPClient/Server模式的工作原理,比较二者的不同,如出现异常情况,在实验报告中写出原因分析;
(4)保留编写的实现程序在你的用户目录下,以备辅导教师检查。
四、参见附录2
实验3、数据链路层协议的设计与实现
一、实验目的
计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议。
本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好地理解基本数据链路层协议的基本工作原理,掌握计算机网络协议的基本实现技术。
二、实验内容
在一个数据链路层的模拟实现环境中,用C语言实现下面数据链路层协议。
1分析一个理想的链路层协议的实现,熟悉它的实现环境。
2对于前面实现的协议进行扩充,实现它的第一次改进,如何防止发方过快淹没收方。
3对②再假设在不可靠的的链路上进行通信。
三、模拟实现环境及其使用
数据链路层协议位于物理层之上,网络层之下。
它使用物理层提供的服务,并且向网络层的分组数据传输提供可靠的服务。
因此,实现一个数据链路层协议必须要有一个模拟实现环境。
也就是说在本实验中网络层和物理层所要执行的任务已经由该模拟环境模拟实现了,同学只需要完成数据链路层协议的设计和实现。
(1)、模拟实现环境的描述:
模拟系统由以下几部分组成:
1)协议文件使用的头文件potocol.h,定义了帧的数据结构及一个枚举类型的变量;
2)通用的头文件common.h,包含类型预定义、常量定义等;
3)代码文件sim.c和worker.c。
(其中sim.c用于控制模拟环境和协议的运行;worker.c中实现了协议文件使用的一些调用函数)
模拟系统使用的三个进程分别为:
·main:
控制整个模拟系统
·MO:
协议2和协议3的发送方(machine0)
·M1:
协议2和协议3的接收方(machine1)
文件sim.c中包含的主程序完成如下功能:
1)首先分析命令行并且将参数保存起来;
2)接着创建六个管道使得三个进程之间能够进行通信,所创建的文件描述字以如下方式命名:
MO和M1的通信;
w1、r1:
MO到M1的帧传递
w2、r2:
M1到MO的帧传递
Main和MO的通信:
W3、r3:
main通知MOgo-ahead
w4、r4:
MO通知main,MO已准备好
Main和M1通信:
w5、r5:
main通知M1-go-ahead
w6、r6:
M1通知main,M1已准备好。
3)建管道之后,主程序Main创建两个子进程MO和M1。
MO和M1将分别调用所选中的协议子程序。
所有的协议都被编译成二进制码,无需执行exec。
每个协议都执行它自己的初始化并运行,实际上它是调用一个wait_for_event()函数来完成这项工作的,这个函数在文件worker.c中。
Wait_for_event()函数设置一些计数器,接着读入从MO或M1传来的帧,此时将帧从管道中取出以防止管道阻塞。
读入的帧被保存在数组quene[]中,在需要的时候也可将其在quene[]中删除。
指针inp和outp分别指向queue[]中第一个空位置和下一个将被删除的帧。
Nframes保存queue[]中帧的数目。
输入管道一旦被读完,wait_for_event()向main发送一个4个字节的消息来说明它已准备执行一个事件,此时它等待main发给它一个go-ahead。
Main选择一个进程(M0或M1)来运行,并将当前时间通过文件描述字w3或w5传给它做为go-ahead信号。
被选中的进程根据从管道传来的值设置自己的时间,从而使两个进程保持时间上的同步。
接着进程调用pick_event()来决定返回哪个事件。
对不同的协议来说,可能发生的事件表是不同的。
pick_event()将检查哪些事件是可行的,并做出选择。
例如,如果没有运行定时器,或者被模拟的协议不存在定时器,那么超时事件是不能被返回的;如果没有帧保存于quene[]中,那以帧到达事件是不能被返回的。
一旦一个事件被返回,wait_for_event()将返回其调用者,即协议例程。
这些例程可以调用worker.c中所有的库函数,它们完成管理时钟,向管道中写帧等操作。
worker.c中的代码很简单并且有很多注释。
主程序也很简单,它选择进程并且向通信管道中写一个4个字节整数的时间值做为go-ahead信号。
被选中的进程检查是否能运行。
如果可以,那么返回代码OK;如果现在不能运行且没有未关掉的时钟,那么返回代码NOTHING;如果两个进程都返回NOTHING,那么表示发生死锁。
死锁被设定为超时间隔的三倍,可能过于保守,但能够消除错误的死锁事件。
(2)、模拟实现环境的使用
执行make命令,将模拟环境文件和实现的数据链路协议文件一起编译链接,可得到一个可执行文件sim.exe,于是模拟系统就可以以命令行的方式执行:
simprotocoleventstimeoutpkt_losspkt_cksumdebug_flags
其中sim后的六个命令行参数为程序执行时用户设定的一些参数,解释如下:
protocol表示要运行哪个协议,例如3;
events表示模拟系统要运行多长时间,推荐使用1到1000之间的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 实验 指导书 内蒙古大学