目录
概述
本篇为黑龙江大学计算机科学与技术专业《计算机网络》课程实验讲义(2024年版)。
- 实验目的
本实验课程是《网络及其计算》课程的实验教学部分。开设本实验可以使学生能够将课堂知识与实践相结合,让学生进一步理解计算机网络的基本原理和具体的通信机制,熟悉基本的计算机网络的组网技术,了解主要的网络应用,掌握初步的网络应用编程技术,为学生进一步深入学习网络应用、网络设计、网络应用开发打下一个坚实的基础,同时也能使学生在实践中体会、深化了解课堂中学习的知识。
- 实验课程要求
(1)通过实验掌握网络通信程序的编写,做到在实际的通信程学基础上模拟实际生活中的通信过程。
(2)通过实验掌握现有的网络设备如网桥、以太网交换机、路由器等的工作原理。
(3)掌握现有Internet的路由机制,模拟实现路由算法
(4)掌握现有系统的实用的网络命令
本课程的先行课程有:高级语言程序设计、数据结构、操作系统。
- 实验项目
-
基于套接字的网络通信程序
-
停止等待协议算法实现
-
网桥原理模拟
-
网络协议分析
-
常用网络命令
实验项目一 基于套接字的网络通信程序
一.实验目的
通过本实验使得学生掌握Windows通信程序的编写,通信原理,实际编写通信程序,本试验是后续实验的基础。要求学生做到在一台计算机上实现两个程序的通信,以及在两台计算机上实现两个应用程序的通信,对于学生所使用的程序开发环境不限。
二.实验环境
(1)运行windows 2007/xp操作系统的PC一台.
(2)每台PC机安装有visual C++、java编程环境或其他开发环境.
三.实验内容及步骤
(A)熟悉并掌握Winsock的原理,常用的套接字函数如下:
(1)创建套接字——socket()
功能:使用前创建一个新的套接字
格式:
SOCKET PASCAL FAR socket(int af,int type,int procotol);
参数:
af: 通信发生的区域
type: 要建立的套接字类型
procotol: 使用的特定协议
(2)指定本地地址——bind()
功能:将套接字地址与所创建的套接字号联系起来。
格式:
int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);
参数:
s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:没有错误,bind()返回0,否则SOCKET_ERROR
地址结构说明:
struct sockaddr_in
{
short sin_family;//AF_INET
u_short sin_port;//16位端口号,网络字节顺序
struct in_addr sin_addr;//32位IP地址,网络字节顺序
char sin_zero[8];//保留
}
(3)建立套接字连接——connect()
和accept()
功能:共同完成连接工作
格式:
int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);
SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);
参数:同上
(4)监听连接——listen()
功能:用于面向连接服务器,表明它愿意接收连接。
格式:
int PASCAL FAR listen(SOCKET s, int backlog);
(5)数据传输——send()
与recv()
功能:数据的发送与接收
格式:
int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);
int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);
参数:
buf:指向存有传输数据的缓冲区的指针。
(6)多路复用——select()
功能:用来检测一个或多个套接字状态。
格式:
int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout);
参数:
readfds:指向要做读检测的指针
writefds:指向要做写检测的指针
exceptfds:指向要检测是否出错的指针
timeout:最大等待时间
(7)关闭套接字——closesocket()
功能:关闭套接字s
格式:
BOOL PASCAL FAR closesocket(SOCKET s);
(B)面向连接和无连接的套接字的系统调用时序图
©.应用程序流程图
四.实验需要完成的功能
利用编程语言,基于TCP或者UDP编写一个简单的Client/Server 网络应用程序。要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户。或者可以进一步改进程序,采用多线程的服务器,加入自己的想法,使之更加具有实用价值。
撰写实验报告。
实验项目二 停止等待协议算法实现
一.实验目的
在实现了两个程序通信的前提下,模拟实现停止等待ARQ协议。
要求模拟实现:
正常数据帧的通信过程
错误帧的通信过程
数据帧的丢失的通信过程
二.实验环境
(1)运行windows 2007/xp操作系统的PC一台.
(2)每台PC机安装有编程环境.
三.实验内容与步骤
按照如下算法进行实现:
-
发方程序:
(1) 从主机取一个数据帧,送交发送缓存。 (2) V(S)←0。 (3) N(S)←V(S)。 (4) 将发送缓存中的数据帧发送出去。 (5) 设置超时计时器。 (6) 等待。 (7) 收到确认帧 ACKn, 若 n = 1 – V(s),则:从主机取一个新的数据帧,放入发送缓存;V(S)←[1 - V(S)],转到 (3)。 否则,丢弃这个确认帧,转到(6)。 (8) 若超时计时器时间到,则转到(4)。
-
收方:
(1) V(R)←0。 (2) 等待。 (3) 收到一个数据帧; 若 CRC校验无误: 若 N(S) = V(R),则执行(4); 否则丢弃此数据帧,然后转到(6)。 否则丢弃此数据帧,然后转到(2)。 (4) 将收到的数据帧中的数据部分送交上层软件 (5) V(R)←[1 - V(R)]。 (6) n←V(R); 发送确认帧 ACKn,转到(2)。
四.实验需要完成的功能
在实验一的基础上,模拟实现停止等待协议,完成下面功能:
(1)正常数据帧的通信过程
(2)错误帧的通信过程
(3)数据帧的及确认帧的丢失的通信过程
撰写实验报告。
实验三 网桥原理模拟
一、实验目的
本实验对应教材的数据链路层协议。
1、在实验一的基础上实现网桥原理的模拟,更新站表的过程;
2、站表逆向学习;
3、帧转发处理过程。
二、实验环境
(1)运行windows 2007/xp操作系统的PC一台.
(2)每台PC机安装有编程环境.
三、实验内容与步骤
(1)网桥收到一帧后先进行自学习。查找转发表中与收到帧的源地址有无相匹配的项目。如没有,就在转发表中增加一个项目(源地址、进入的接口和时间)。如有,则把原有的项目进行更新。
(2)转发帧。查找转发表中与收到帧的目的地址有无相匹配的项目。
如没有,则通过所有其他接口(但进入网桥的接口除外)进行转发。
如有,则按转发表中给出的接口进行转发。
(3)若转发表中给出的接口就是该帧进入网桥的接口,则应丢弃这个帧(因为这时不需要经过网桥进行转发)。
(4)可选择生成树算法,避免网络存在回路,即在任何两个网站之间只有一条路径。
(5)返回。
四、实验需要完成的功能
1、在实验一的基础上实现网桥模拟;
2、采用Timer机制来实现定时处理;
3、显示不同机制下网桥站表的变化过程;
4、撰写实验报告。
实验四 网络协议分析
一、实验目的
本实验对应教材的数据链路层、网络层、传输层协议。
网络协议工具可以获得局域网内各节点计算机的大量基本信息,利用Sniffer、WinPcap、Wireshark等工具,过滤、捕获流经本地的信息,可以加以分析和显示,编辑、发送各种类型的信包,同时捕获、分析对发送信包的响应信包,从而观察发送信包后对方的相应响应。为未来应用开发测试过程的问题定位,做准备工作。了解HTTP协议通信过程,理解HTTP报文的命令。
二、实验环境
-
运行windows 2007/xp操作系统的PC一台。
-
每台PC机安装有编程环境。
三、实验内容与步骤
(一)简单http协议实现
-
实现一个简单的HTTP服务器程序能通过GET命令将网页发送到客户端;
-
实现多线程的服务器端;
-
能实现其他的HTTP命令。
根据以上HTTP请求报文结构,编写如下HTTP服务器程序:
通过自己编写客户端程序,或者使用本地浏览器访问服务器,如下:
模仿HTTP服务器的程序Phttpd源代码如下:
import java.io.* ;
import java.net.* ;
import java.util.* ;
// Phttpd类
class Phttpd{
public static void main(String args[]){
ServerSocket servsock = null;
Socket sock;
OutputStream out;
BufferedReader in;
FileInputStream infile = null;
byte[] buff = new byte[1024];
boolean cont = true;
int i;
try{
servsock = new ServerSocket(800,300);
while(true){
sock = servsock.accept();
System.out.println("连接请求" + (sock.getInetAddress()).getHostName());
try{
infile = new FileInputStream(args[0]) ;
}
catch(FileNotFoundException e){
System.err.println("没有找到文件");
System.exit(1);
}
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
out = sock.getOutputStream() ;
//跳过2个换行符
for(i = 0; i < 2;++i)
in.readLine() ;
cont = true ;
while(cont){
try{
int n = infile.read(buff);
out.write(buff,0,n);
} catch(Exception e){
cont = false;
}
}
sock.close();
infile.close();
}
} catch(IOException e){
System.exit(1);
}
}
}
(二)分析HTTP和TCP协议的分析
利用Sniffer、WinPcap、Wireshark等工具,过滤、捕获流经本地的信息,可以加以分析和显示,编辑、发送各种类型的信包,同时捕获、分析对发送信包的响应信包,从而观察发送信包后对方的相应响应。
四.实验需要完成的功能并回答相关问题
1、利用编程语言,基于HTTP报文协议实现WEB通信,理解HTTP报文格式及实现通信过程。要求实现客户/服务器之间读取WEB的页面,或者可以进一步改进程序,加入自己的想法,使之更加具有实用价值。
2、对截获的数据包进行分析(需要在实验报告中附上截图作为作答一句):
1)分析HTTP协议工作原理:
(1)浏览器和服务器所运行的 HTTP版本号是多少?
(2)浏览器支持的语言类型在哪里可以查看?当前截获的数据包的浏览器所支持的语言类型是什么?
(3)浏览器支持的压缩方式在哪里可以查看?当前截获的数据包的浏览器所支持的压缩方式是什么?
(4)通过什么信息可以判断服务器是否成功返回客户端所需要的信息?
(5)在响应报文中,服务器返回对象的最后修改时间是多少?返回浏览器的内容共多少字节?
2)TCP会话过程数据包的分析:
(1)从捕获的数据包中找出三次握手建立连接的数据包。
(2)从找到的三次握手数据包中观察,客户端协商的MSS为多少?客户端的接收窗口为多少?
(3)服务器协商的MSS为多少?服务器端的接收窗口为多少?
(4)说明在三次握手过程中数据包的序号、确认号、SYN标志位、ACK标志位的变化。
(5)当客户端发送了HTTP请求报文以后,客户端收到服务器的ACK为多少?
(6)在捕获的数据包中找到上次握手释放链接的数据包。
实验项目五 常用网络命令
一.实验目的
通过本试验掌握网络上的实用命令的实用,主要包括:ARP,IPCONFIG,net,ping,命令等。
具体要求如下:
(1)掌握实用命令的格式
(2)掌握各个实用命令的参数
(3)在计算机上具体测试每个命令
二.实验环境
(1)运行windows 2007/xp操作系统的PC一台。
(2)每台PC机具有一块网卡,通过双绞线与局域网网相连。
(3)局域网能连接Internet。
三.实验步骤
在MS-DOS方式下依次运行下列命令, ping ,ipconfig, nslookup, arp ,tracert,并通过help查看每个命令的含义及其参数.
(1)Ping命令的使用技巧
Ping是个使用频率极高的实用程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报。根据返回的信息,我们就可以推断TCP/IP参数是否设置得正确以及运行是否正常。
(2)通过Ping检测网络故障的典型次序
下面就给出一个典型的检测次序及对应的可能故障:
ping 127.0.0.1:这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。如果没有做到这一点,就表示TCP/IP的安装或运行存在某些最基本的问题。
ping 本机IP:这个命令被送到我们计算机所配置的IP地址,我们的计算机始终都应该对该Ping命令作出应答,如果没有,则表示本地配置或安装存在问题。出现此问题时,局域网用户请断开网络电缆,然后重新发送该命令。如果网线断开后本命令正确,则表示另一台计算机可能配置了相同的IP地址。
ping 局域网内其他IP:这个命令应该离开我们的计算机,经过网卡及网络电缆到达其他计算机,再返回。收到回送应答表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子网掩码(进行子网分割时,将IP地址的网络部分与主机部分分开的代码)不正确或网卡配置错误或电缆系统有问题。
ping 网关IP:这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够作出应答。
ping 远程IP:如果收到4个应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet(但不排除ISP的DNS会有问题)。
ping localhost:localhost是个作系统的网络保留名,它是127.0.0.1的别名,每太计算机都应该能够将该名字转换成该地址。如果没有做到这一带内,则表示主机文件(/Windows/host)中存在问题。
ping www.xxx.com(如www.yesky.com 天极网):对这个域名执行Ping www.xxx.com 地址,通常是通过DNS 服务器 如果这里出现故障,则表示DNS服务器的IP地址配置不正确或DNS服务器有故障(对于拨号上网用户,某些ISP已经不需要设置DNS服务器了)。
如果上面所列出的所有Ping命令
都能正常运行,那么我们对自己的计算机进行本地和远程通信的功能基本上就可以放心了。但是,这些命令的成功并不表示我们所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到。
(2). Netstat
Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
如果我们的计算机有时候接受到的数据报会导致出错数据删除或故障,我们不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么我们就应该使用Netstat查一查为什么会出现这些情况了。
netstat –a:本选项显示一个所有的有效连接信息列表,包括已建立的连接(ESTABLISHED),也包括监听连接请求(LISTENING)的那些连接。
netstat –n:显示所有已建立的有效连接。
(3). IPConfig命令
IPConfig实用程序和它的等价图形用户界面----Windows 95/98中的WinIPCfg可用于显示当前的TCP/IP配置的设置值。这些信息一般用来检验人工配置的TCP/IP设置是否正确。但是,如果我们的计算机和所在的局域网使用了动态主机配置协议(DHCP),这个程序所显示的信息也许更加实用。
Ipconfig:当使用IPConfig时不带任何参数选项,那么它为每个已经配置了的接口显示IP地址、子网掩码和缺省网关值。
ipconfig /all:当使用all选项时,IPConfig能为DNS和WINS服务器显示它已配置且所要使用的附加信息(如IP地址等),并且显示内置于本地网卡中的物理地址(MAC)。如果IP地址是从DHCP服务器租用的,IPConfig将显示DHCP服务器的IP地址和租用地址预计失效的日期。
(4).ARP(地址转换协议)
ARP是一个重要的TCP/IP协议,并且用于确定对应IP地址的网卡物理地址。实用arp命令,我们能够查看本地计算机或另一台计算机的ARP高速缓存中的当前内容。此外,使用arp命令
,也可以用人工方式输入静态的网卡物理/IP地址对,我们可能会使用这种方式为缺省网关和本地服务器等常用主机进行这项作,有助于减少网络上的信息量。
ARP常用命令选项:
arp -a或arp –g:用于查看高速缓存中的所有项目。-a和-g参数的结果是一样的,多年来-g一直是UNIX平台上用来显示ARP高速缓存中所有项目的选项,而Windows用的是arp -a(-a可被视为all,即全部的意思),但它也可以接受比较传统的-g选项。
arp -a IP:如果我们有多个网卡,那么使用arp -a加上接口的IP地址,就可以只显示与该接口相关的ARP缓存项目。
arp -s IP 物理地址:我们可以向ARP高速缓存中人工输入一个静态项目。该项目在计算机引导过程中将保持有效状态,或者在出现错误时,人工配置的物理地址将自动更新该项目。
(5).Tracert
如果有网络连通性问题,可以使用 tracert 命令
来检查到达的目标 IP 地址的路径并记录结果。tracert 命令显示用于将数据包从计算机传递到目标位置的一组 IP 路由器,以及每个跃点所需的时间。
tracert IP address [-d] 该命令返回到达 IP 地址所经过的路由器列表。通过使用 -d 选项,将更快地显示路由器路径,因为 tracert 不会尝试解析路径中路由器的名称。
四.实验分析,回答下列问题
(1)在MS-DOS方式下运行下列ipconfig命令,查看本机TCP/IP协议配置等相关信息,并分析结果.
(2)在获取本机IP地址之后,在MS-DOS方式下运行下列Ping命令,填写实验运行结果(附截图)。
(a)ping本机IP地址
(b)ping 本机IP地址 –t
(c)ping 默认网关 –n 6
(d)ping 本局域网内任意一台主机
(3)用nslookup命令从域名地址当中解析出IP地址,从IP地址当中解析出域名地址。填写下表:
域名地址 | IP地址 |
202.203.208.100 | |
202.203.208.32 | |
www.163.com | |
www.google.com |
(4)利用路由跟踪命令tracert,跟踪到达某个网站(如www.163.com)的路由信息。
(5)用netstat命令,显示以太网接口的统计信息,并显示所有已建立好的有效连接。
(6)用arp命令查看arp地址映射表,填加一条静态地址映射,并显示结果和操作过程。