实验1 网络协议分析与仿真

更新时间:2024-05-05 00:32:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机网络协议仿真实验

协议分析实验

在此部分,设计了14个网络协议分析实验,基本涵盖了前面网络原理中介绍的各种协议。学生使用附带的网络协议仿真教学系统完成这些实验,可以对网络协议有更深入的理解。这些实验可以根据教学具体情况选做。

实验一 以太网帧的构成

【实验目的】

掌握以太网帧的构成模式,能够识别不同的MAC地址并理解MAC地址的作用,了解网络故障分析仪的基本使用方法。

【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、了解协议仿真编辑器的五个组成部分及其功能 2、了解网络协议分析仪的各组成部分及其功能

3、学会使用协议仿真编辑器编辑以太网帧,包括单帧和多帧的编辑 4、学会观察并分析地址本中的MAC地址 5、学会分析以太网帧的MAC首部 6、理解MAC地址的作用

7、理解MAC首部中的LLC-PDU长度/类型字段 【实验原理】 (1) 以太网首部 以太网目的地址 以太网源地址 帧类型 6 6 2 帧类型字段:表示后面数据类型。例如0x0806表示ARP请求或应答。 (2) 太网帧的构成 46----1500字节 以太网首部 14

IP首部 20-60

协议(例TCP)首部 根据协议而定(TCP20-60)

应用数据

以太网尾部 4

(3) 其他原理请参考教材:

计算机网络协议仿真实验

第一章:计算机网络的基本概念 第二章:局域网技术

【实验步骤】 一 仿真机端

练习一:运行ipconfig命令

1、启动网络协议仿真编辑器,选择“工具”菜单栏中的IPCONFIG项,观察 ipconfig /all 命令下的运行结果,获得本机的主机名及以太网地址 2、在地址本中找到本机的信息

练习二:单帧编辑并发送

1、打开协议仿真编辑器,在界面初始状态下,程序会自动新建一个单帧。可以利用协议仿真编辑器打开时默认的以太网帧进行编辑。此时在协议仿真编辑器的各部分会显示出该新帧的信息:

(a)多帧编辑器中显示:新帧的序号(为1)、概要信息 (b)协议树中显示以太网MAC层协议

(c)单帧编辑器中显示新帧各字段的默认值

(d)十六进制对照表中显示新帧对应的十六进制信息 2、编辑以太网帧;

在单帧编辑器中编辑该帧,具体步骤为: (a)填写“目的MAC地址”字段; 方法一:手工填写。

方法二:选择地址本某主机的MAC地址,复制并粘贴到目的MAC地址栏中,替换掉默认值。

(b)填写源MAC地址字段,方法同上; 注意:仿真机可以仿真本机发送的MAC帧,也可以仿真另一台机器发送MAC帧,所以,源MAC地址字段可以填写本机MAC地址,也可以填写其他机器的MAC地址。

(c)填写“类型或长度”字段;

方法一:双击该字段,更改默认设置,填写上一层协议类型值(十六进制表示);

方法二:单击“类型或长度”字段,右端会出现一个下拉键头,点击该键头,出现下拉菜单,其中列出可选的上层协议类型,单击其中一个进行选择,该协议对应的十六进制值会自动填写;

3、单帧编辑器与十六进制对照表是联动的,观察十六进制对照表中该帧的信息; 4、选中单帧编辑器中的某一字段,该字段对应的十六进制值会相应地改变颜色; 5、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“按范围发送”或“自定义发送”,正确填写发送的范围后,选择“发送”按钮,发送该帧;

6、在监控机一端捕获新发送的帧并分析(捕获数据的方法参考本实验后半部分:监控机端的实验步骤);

7、重新回到步骤(2)类型和长度字段分别填写以下十六进制值:

计算机网络协议仿真实验

(a) 0800 :对应的上层协议是什么? (b) 0806 :对应的上层协议是什么? (c) 0100 :对应的上层协议是什么? 该值的具体含义是什么?

在监控机端捕获该帧,捕获到帧的长度是多少?分析原因。

练习三:编辑并发送帧序列

1、按照单帧编辑的步骤编辑多个帧; 2、对每一帧可以重新设置发送的时间间隔和发送的重复次数,如不设置,则采用默认值; 方法为:点击某一帧左边的“+”,即可展开为两行,在第一行内填写此帧与其上一帧的发送时间间隔(单位:ms 默认值:1000),展开项的第二行为设置此帧的重复发送次数(默认值为1)。

3、编辑好以后,发送帧序列;

点击菜单栏或工具栏中的“发送”按钮,选择弹出菜单上的“按范围发送”并编辑起始帧序号和结束帧序号

如果选择“自定义发送”则在“发送序号”面板中选择要发送的单帧序号,并根据需要修改发送时间和发送次数。编辑完成后点击“发送”按钮,即完成帧的发送。

4、观察主界面底部“状态”栏中的各数据信息; 5、在监控机一端捕获数据并分析。

练习四:编辑并发送mac广播帧

请同学们考虑mac广播帧的目的mac地址应该如何填写。 二 监控机端

练习一:捕获数据并分析。

切换数据采集器的按钮,将监控机通过主控设备接在局域网中。 1、启动协议详细解析功能,获得若干以太网帧。 对其中的5-10个帧的以太网首部进行观察和分析;

分析的内容为:源MAC地址 目的MAC地址 上层协议类型。 2、以MAC地址为过滤条件捕获若干以太网帧。

如:捕获源MAC地址为:00-09-74-A5-6F-4C(选择地址本中的一个MAC地址)的帧 对每一帧的以太网首部进行观察分析; 分析的内容为: 源MAC地址; 目的MAC地址; 上层协议类型。

3、以本机MAC地址为过滤条件捕获相应的以太网帧(多个); 对其中目的MAC地址为本机MAC地址的以太网帧进行观察分析:

计算机网络协议仿真实验

(a) 这些帧的源MAC地址都是什么?

(b) 对照地址本观察这些MAC地址对应的IP地址有何特点? (c) 说明:为什么能收到来自这些源MAC地址的帧?

(d) 将捕获到的以太网帧保存到文件中,文件名为:实验一.zdt。 练习二:学习监控机端其他的协议分析功能。 1、点击主机状况,观察分析结果信息。 2、点击会话状况,观察分析结果信息。 3、点击协议统计,观察分析结果信息。 4、点击性能状况,观察分析结果信息。 5、察看地址本。

【思考问题】

结合实验过程中的实验结果,回答下列问题:

1、在网络的分层体系结构中,MAC层的作用是什么?

2、帧在传送过程中每经过一个网络节点,MAC地址是否要发生变化?为什么?

【实验结论】

实验二 IP地址分类与数据包的组成

【实验目的】

理解IP层的作用以及IP地址的分类方式,掌握IP数据包的组成,理解子网掩码的作用 【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、学会根据IP地址的分类方式区分各类IP地址 2、掌握IP数据报的格式、长度以及各字段的功能

3、学会利用子网掩码确定IP地址的网络号、子网号和主机号 4、学会分析给定数据包的IP首部信息 5、学会手工计算IP校验和的方法

【实验原理】

(1) IP地址的分类:

计算机网络协议仿真实验

A类 0 B类 10 C类 110 D类 1110 E类 11110

(2) 各类IP地址的范围

类型 A B C D E

(3) IP数据报格式:

范围 0.0.0.0 到 127.255.255.255 128.0.0.0 到 191.255.255.255 192.0.0.0 到 223.255.255.255 224.0.0.0 到 239.255.255.255 240.0.0.0 到 247.255.255.255 27位 保留 28位 多播组号 21位 网络号 8位 主机号 14位 网络号 16位 主机号 7位 网络号 24位 主机号 1 4位 版本号 16位标识 8位生存时间(TTL) 4位首部长度 TOS 16 17 8位服务类型 16位总长度(字节数) 32 3位标志 13位片偏移 8位协议标识 32位源IP地址 32位目的IP地址 IP选项 数据 16位首部校验和 客户

计算机网络协议仿真实验

图3-3-1 IP数据报格式及首部中的各字段

(4) 其他原理请参考教材: 第三章 IP网络协议及技术

【实验步骤】

练习一:运行ipconfig命令 1、启动网络协议仿真编辑器,选择“工具”菜单栏中的“IPCONFIG”项,观察ipcofig /all命令下运行的结果,获得本机的IP地址及子网掩码:

2、分析本主机属于哪一类IP地址,网络号和子网号分别是什么。

3、利用本机的IP地址及子网掩码,找到地址本中与本机属于同一子网的主机。

练习二:运行netstat命令

Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

1、在DOS命令行方式下运行:netstat –r 显示本机路由表。记录本机的缺省网关的IP地址。

2、在DOS环境下运行netstat–s,观察IP协议部分,查看本机已经接收和发送的IP报文个数。

练习三:运行Ping命令

A:在地址本中选择与本主机在同一子网中的另一主机的IP地址(假设为:X.X.X.X); 1、在DOS命令行方式下运行:ping X.X.X.X 2、在监控机端捕获数据,观察记录每一帧的MAC层的源、目的MAC地址和IP层的源、目的IP地址。

3、对照地址本中的记录,分析捕获数据的MAC地址与IP地址的对应关系。 B:这个实验要求不同网段的两个小组密切配合。在地址本中选择与本主机属于不同子网的另一主机的IP地址(假设为:Y.Y.Y.Y);

1、在不同网段的两台主机的DOS命令行方式下运行arp –d分别清除ARP高速缓存中的内容。然后运行ping 命令:ping Y.Y.Y.Y

2、在监控机端捕获数据,观察记录每一帧的MAC层的源、目的MAC地址和IP层的源、目的IP地址。

3、对照地址本中的记录,分析捕获数据的MAC地址与IP地址是否具有对应关系。 C:比较A、B两个实验的实验结果,分析二者有何不同,为什么?

练习四:编辑并发送IP数据包 1、打开协议仿真编辑器。

2、填写该帧的“源MAC地址”和“目的MAC地址”字段;

注意:当目的主机与本机不在同一子网中时,目的MAC地址字段该如何填写,才能保

计算机网络协议仿真实验

证帧能够到达目的地?

3、填写该帧的以太网协议首部:“类型或长度”字段值为:0800(即IP协议的类型值)或者选择下拉菜单中的IP协议, 此时:

(a) 协议树上将显示上层协议类型为“IPV4”,点击左端的“+”将该层协议展开,会看到IP协议的各个字段;

(b) 点击协议树上的“IP”协议或者点击单帧编辑器右下方的“下一步”,在单帧编辑器中会出现IP层各个字段及其默认值; 4、写IP协议头信息: (a) 源IP地址;

注意:仿真机可以仿真本机发送的IP数据包,也可以仿真另一台机器发送IP数据包,所以,源IP地址字段可以填写本机IP地址,也可以填写其他机器的IP地址。

(b) 目的IP地址:从地址本中选择一主机的IP地址并填写; (c) 填写“版本号”(正常值:4);

(d) 首部长度(无可选项的情况下为5,即20个字节); (e) 服务类型;

(f) 总长度字段(该值为IP首部长度加上数据部分的长度); (g) 标识字段; (h) 标志字段; (i) 生存时间;

(j) 协议字段,即上层协议类型(6为TCP,17为UDP,1为ICMP);

(k) 首部检查和,当上述各字段值均填写完毕,可以通过两种方法计算首部检查和的值:

方法一:手工计算。

首先把“首部校验和”字段置为0;然后,对IP协议头中的每个16比特进行反码求和(整个首部看成是由若干个16比特的字组成),然后取反,结果即为该字段的值。

方法二:利用协议仿真编辑器计算,其步骤如下:

①首先把该字段置为0;

②在十六进制对照表中找到IP协议头对应的部分(通过点击IP协议的第一个字段和最后一个有效字段来确定范围),并把该部分选中;

③点击鼠标右键,选择弹出菜单中的“计算校验和”; ④将得到的值填入单帧编辑器中首部检查和字段。

5、要发送多个IP数据包,可重复上述步骤,并可在多帧编辑器中设置每一帧的发送次数和发送每帧的时间间隔;

6、工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送帧序列; 7、控机一端截获数据包并分析。

练习五:观查分析IP会话状况。 1、在监控机端选择“会话状况”,察看其中的IP会话状况统计结果。 2、捕获大量IP数据包,分析其中的IP会话状况。

计算机网络协议仿真实验

步骤为:

(a) 切换数据采集器上的按钮,将监控机连接到主控设备上。

(b) 以IP协议为过滤条件,显示捕获的IP数据包,分析其中的IP会话状况。 (c) 将捕获的IP数据包保存到文件:实验二.zdt。 【思考问题】

结合实验过程中的实验结果,回答下列问题

1、实验所用仿真机的IP地址是什么?子网掩码是什么?该机器属于哪类IP地址?网络号和子网号、主机名分别是什么?

2、分析地址本中所有的IP地址,说明实验环境中所有机器(除服务器外)的子网划分情况。

3、IP数据包在从源主机出发到达目的主机的过程中,IP首部中的IP源地址和目的地址字段是否发生变化?

4、打开浏览器IE,访问国外某站点,如在地址栏中写入:http://www.microsoft.com(美国的微软主页地址,IP地址为216.65.41.184),并回车。在监控机一端截获这一过程仿真机发送的数据包,然后进行分析:

(a) 所发送数据包的目的IP地址是否为216.65.41.184? (b) 如果不是,是什么?分析产生这种情况原因。

【实验结论】

实验三 IP地址转换协议:ARP

【实验目的】

1、理解IP地址与MAC地址的对应关系 2、掌握ARP协议的作用和格式 【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、理解IP地址与MAC地址的对应关系 2、掌握ARP协议的作用 3、掌握ARP协议的工作原理 【实验原理】

1、ARP请求或应答的分组格式

计算机网络协议仿真实验

硬件类型 硬件长度 协议长度 协议类型 操作 发送方IP地址(八位组0-1) 目标首部(八位组0-1) 发送方首部(八位组0-3) 发送方首部(八位组4-5) 发送方IP地址(八位组2-3) 目标首部(八位组2-5) 目标IP地址(八位组0-3)

字段说明:

硬件类型字段:表示硬件地址类型,例如:1表示以太网。

协议类型字段:表示要映射的协议类型,例如 0x0800表示IP地址,0x0806表示ARP请求或应答。

操作字段:共有四种操作类型,1表示ARP请求,2表示ARP应答,3表示RARP请求,4表示RARP应答

2、其他原理请参考教材:

第三章 IP网络协议及技术

【实验步骤】

注意:在没有强调在‘监控机’一端操作时,以下操作均是在仿真机上进行的

练习一:仿真发送ARP请求报文

1、在命令提示符下运行arp –d命令,清空ARP高速缓存 2、编辑并发送ARP请求帧

(1) 打开协议仿真编辑器。

(2) 填写该帧的“源MAC地址”和“目的MAC地址”字段;

(a) 源 MAC地址可以为本机的MAC地址,也可以仿真其他主机发送ARP请求报文,此时填写的MAC地址为另一台主机的MAC地址,MAC地址可根据主机名在地址本中获得;

(b) 目的MAC地址:这里要注意分析对于ARP请求来说,目的MAC地址应该是什么?

(3) 填写“类型或长度”字段值为:0806(即: ARP协议类型值)或者选择细下拉菜单中的“ARP”协议, 此时:

(a) 协议树上将显示上层协议类型为“APR”,点击左端的“+”将该层协议展开,会看到ARP协议的各个字段

(b) 单击协议树上的“ARP”协议或者点击单帧编辑器右下方的“下一步”,在单帧编辑器中会出现ARP层各个字段及其默认值 (4) 填写ARP协议头信息:

(a) 硬件类型:(以太网地址)

计算机网络协议仿真实验

(b) 协议类型:(要映射的协议地址类型为IP地址类型) (c) 硬件地址长度: (d) 协议地址长度:

(e) 操作字段(APR请求为1,ARP应答为2,RARP请求为3,RARP应答为4) (f) 发送方MAC地址:

(g) 发送方IP地址:为所选择源主机的IP地址; (h) 目的MAC地址:

(i) 目的IP地址:为所选择源目的主机的IP地址。 (5) 点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送ARP帧;

(6) 在监控机一端捕获该报文及ARP响应报文并分析。

3、在命令提示符下运行arp –a命令,检查ARP高速缓存中的内容。

练习二:运行Ping命令(同一子网内两台机器间的ARP) 1、在命令提示符下运行arp –d命令,清空ARP高速缓存 2、在命令提示符下运行arp –a命令,检查ARP高速缓存

3、从地址本中选择与本机属于同一子网的一主机的IP地址(X.X.X.X)作为Ping命令的参数,然后在命令提示符下运行:

Ping X.X.X.X

在监控机一端捕获数据报文并分析:

(a) 其中是否有ARP请求及应答报文? (b) 分析各ARP报文:

源、目的mac地址都是什么? 源、目的IP地址都是什么? (c) 为什么产生这样的报文?

4、在命令提示符下运行arp –a命令,检查ARP高速缓存中的内容是否发生变化,分析原因。

练习三:运行Ping命令(经网关连接的不同子网上的两台机器间的ARP) 1、在命令提示符下运行arp –d命令,清空ARP高速缓存 2、在命令提示符下运行arp –a命令,检查ARP高速缓存

3、从地址本中选择与本机属于不同子网的一主机的IP地址(Y.Y.Y.Y), 然后在命令提示符下运行: Ping Y.Y.Y.Y

在监控机一端捕获数据报文并分析:

(a) 其中是否有ARP请求及应答报文? (b) 分析各ARP报文:

源、目的以太网地址都是什么? 源、目的IP地址都是什么?

计算机网络协议仿真实验

(c) 为什么产生这样的报文?

4、在命令提示符下运行arp –a命令,检查ARP高速缓存中的内容是否发生变化,分析原因。

5、比较练习二和练习三两实验中得到的ARP报文,有何不同? 分析产生二者区别的原因是什么?

【思考问题】

结合实验过程中的实验结果,回答下列问题

1、观察实验过程中捕获网络上的多个ARP请求帧,观察这些帧的以太网目的地址是否相同,分析其原因。

2、观察实验过程中捕获网络上的多个ARP应答帧,观察这些帧的以太网目的地址是否相同,分析其原因。

【实验结论】

实验四 IP控制管理协议:ICMP

【实验目的】

1、了解ICMP的格式和响应方式及作用 2、了解常见的网络故障 【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、理解和掌握ICMP协议的基本作用 2、知道ICMP报文的格式

3、理解ICMP协议与IP协议的封装关系

4、学会根据各种响应信息进行出错分析的方法 5、学会使用ping命令 【实验原理】 请参考教材:

第三章 IP网络协议及技术 包括:

ICMP协议;报文格式;报文类型;时间戳请求和应答报文格式;不可达报文格式;ICMP回显请求和应答报文格式等

计算机网络协议仿真实验

【实验步骤】

练习一:仿真发送各种ICMP报文

1、从地址本中选择一台主机,向该主机仿真发送ICMP回显请求报文。 (a) 打开协议仿真编辑器。

(b) 填写该帧的以太网协议首部:

①“源MAC地址”和“目的MAC地址”字段:注意:当选择的目的主机与本机不在同一子网的情况,目的MAC地址该怎样填写

②注意填写“类型或长度”字段值为:0800(即IP协议的类型值) (c) 填写IP协议头信息:

注意协议字段,即上层协议类型应为1(ICMP协议的类型为1),可手工填写也可选择下拉菜单中的“ICMP”协议; 2、填写ICMP协议头信息: (a) 类型字段值为:8; (b) 代码字段值为:0;

(c) 标识符:任选16位二进制数(如0x1234); (d) 序列号:任选16位二进制数(如0x5677); (e) 数据字段:任选;

(f) 校验和:首先把该字段置为0,接下来计算ICMP首部的校验和。ICMP协议校验和字段覆盖整个ICMP报文,包括数据部分。 3、击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送ICMP报文; 4、在监控机一端截获相应的请求报文及应答报文并分析,注意当源MAC与源IP属于另一台主机的时候,响应报文的情况。

5、从地址本中选择一台主机,向该主机仿真发送ICMP时间戳请求报文。

(a) 步骤同上。注意对于ICMP时间戳请求报文,类型字段值为13,代码字段值为0。 (b) 在监控机一端截获相应的请求报文及应答报文并分析。 6、编辑IP数据包并主动引入一些错误:

(a) 向目标主机发送一个只有IP头的IP数据包;

(b) 向目标主机发送一个数据包,版本号字段填入7; (c) 向目标主机发送一个数据包,协议类型字段填入120; (d) 向目标主机发送一个数据包,填写不正确的IP报头长度; 向另一台主机发送上述数据包; 在监控机一端捕获响应报文并分析。

练习二:运行ping命令 选择菜单栏中的“工具”,运行下拉菜单中的ping命令

1、从地址本中选择与本机属于同一子网的一主机的主机名或IP地址,作为ping命令的参数;

2、从地址本中选择与本机属于不同子网的一主机的主机名或IP地址,作为ping命令的参数;

计算机网络协议仿真实验

对于上述两种情况,在仿真机和监控机端分别进行观察和分析: 在仿真机端观察:

(a) 是否收到响应包?

(b) 如果收到,观察响应包的个数,并对每个响应包的各信息字段进行分析。 (c) 比较两种次实验中TTL字段值是否相同,为什么? 监控机一端捕获数据并分析: (a) 是否捕获到响应包?

(b) 如果捕获到,观察并分析每个响应包的ICMP协议头部分。

(c) 比较两次实验中监控机一端捕获到的响应包的个数是否相同,为什么? 3、同时打开多个DOS命令提示符窗口,在每个窗口中运行一个ping程序 在监控机一端捕获数据,分析各程序如何识别属于自己的返回信息?

练习三:运行netstat命令

在Dos环境下运行netstat–s,观察ICMP协议部分,查看本机已经接收和发送的ICMP报文类型及报文个数。

练习四:运行tracert命令

在命令提示符下运行类似以下的命令: tracert oa.jlu.edu.cn tracert yahoo.com.cn 观察运行结果并分析。

【思考问题】

结合实验过程中的实验结果,回答下列问题:

1、根据练习一的实验结果说明:

实验室环境所使用操作系统默认的TTL最大值是多少?

2、运行ping 127.0.0.1,再运行ping 本机名(或本机IP地址)。在监控机端是否捕获到相应的ICMP回显请求报文?为什么?

【实验结论】

实验五 UDP数据报的传送

【实验目的】

1、理解UDP协议的工作原理及工作过程 2、了解基本的端口分配

计算机网络协议仿真实验

3、理解DNS的工作原理 【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、理解UDP协议的通信过程 2、学会手工计算UDP校验和 3、理解DNS的作用及原理

4、初步学会应用C语言与WinSock2进行网络程序设计 【实验原理】

请参考教材第三章 IP网络协议及技术。主要包括

UDP的封装,UDP首部格式,以及UDP校验和的计算方法。

尽管UDP校验和的基本计算方法与IP首部校验和的计算方法类似(16bit字的二进制反码和),但是它们之间存在不同的地方。

首先,UDP数据报长度可以为奇数字节,但是校验和的算法是把若干个16bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了校验和的计算(也就是说,可能增加的填充字节不被传送)。

其次,UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算校验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地(例如,IP有没有接受地址不是本主机的数据报,以及IP有没有把应传给另一高层的数据报传送给UDP)。

UDP数据报中的伪首部格式如图:

0 15 16 32位源IP地址 32位目的IP地址 0

UDP伪16位UDP长度 16位目的端口号 16UDP检查和 UDP伪8位协议16位源端口号 16位UDP长度 数据 数据 填充字节计算机网络协议仿真实验

【实验步骤】

练习一:编辑并发送UDP数据包 1、打开协议仿真编辑器。

2、填写该帧的以太网协议首部:

(a) 源MAC地址”和“目的MAC地址”字段,注意:当选择的目的主机与本机不在同一子网的情况,目的MAC地址该怎样填写

(b) “类型或长度”字段值应为:0800(即IP协议的类型值) 3、填写IP协议头信息:

注意协议字段,即上层协议类型应为17(UDP协议的类型为17); 4、填写UDP协议信息: (a) 16位源端口号:自选 (b) 16位目的端口号:自选 (c) 数据字段:可有可无

(d) 16位UDP长度:UDP报头长度与UDP数据长度之和

(e) 校验和:覆盖UDP首部(含伪首部)和数据两部分。请先根据参考原理的内容进行手工计算,然后利用协议仿真编辑器来计算(方法二),比较二者的结果,检验手工计算结果的正确性。

方法一:手工计算。

按照参考原理(3)中介绍的内容,计算好UDP伪首部和首部中的各项值,然后按16bit进行反码求和(方法同计算IP校验和),将结果填入相应字段。

方法二:利用协议仿真编辑器来计算。步骤为:

①将UDP长度填写到16位UDP校验和字段中作为伪首部中UDP长度字段值; ②选中IP首部中的32位源IP地址和32位目的IP地址作为UDP伪首部中的32位源IP地址和32位目的IP地址;

③选中IP首部中8位的协议字段作为UDP伪首部中的8位的协议字段; ④在8位的协议字段之前选择一个8位的0作为UDP伪首部中的8位0; ⑤再选中UDP首部的及数据各字段; ⑥点击鼠标右键,选择“计算校验和”;

⑦将得到的校验和值填写到16位UDP校验和字段。

下面是一个计算UDP校验和的一个例子:

一个不含数据部分的UDP数据报的十六进制对照表如下: 00 01 02 03 04 05 06 07 08 09 0A 0B 08 00 45 00 00 4F 94 48 40 00 80 11 E4 9D C0 A8 00 20 C0 A8 00 52 00 00 00 00 00 08 00 08 其中黑体部分为用来计算校验和的UDP伪首部和UDP首部,其中: 00 11(十进制的17):为UDP伪首部中8位的0和8位的协议字段; C0 A8 00 20:为UDP伪首部中32位源IP地址; C0 A8 00 52:为UDP伪首部中32位目的IP地址;

计算机网络协议仿真实验

(c) 根据捕获数据,计算在该TCP会话过程中本地以太网上用户有效数据的实际吞吐量是多少?

练习三:编辑并发送TCP数据包。 说明:

(1) 在本实验中由于TCP连接有超时时间的限制,故仿真机端和监控机端的两位同学要默契配合,某些步骤(如计算TCP校验和)要求熟练、迅速。

(2) 为了实现TCP三次握手过程的仿真,发送第一个连接请求帧之前,查看ARP高速缓存中是否有要与之通信的主机信息,如果没有,请运行ping命令,来获取信息。然后在“本地连接”属性处,取消仿真机端的TCP/IP 协议。

1、要求帧序列中包括TCP连接建立、数据传输以及断开连接的全过程。在编辑的过程中注意体会TCP首部中的序列号和标志位的作用。

2、编辑TCP数据包。首先选择主控设备上的一个进程作服务器进程,并向该服务器进程发送一个建立连接请求报文,其步骤如下:

(a) 打开协议仿真编辑器。

(b) 填写该帧的以太网协议首部:

①“源MAC地址”和“目的MAC地址”字段.

注意如选择的目的主机与本机不在同一子网时,目的MAC地址该怎样填写; ②“类型或长度”字段值应为:0800,或选择下拉菜单中的IP协议; ③本实验要求源MAC地址为本机MAC地址。 (c) 填写IP协议头信息,注意:

①协议字段,即上层协议类型应为TCP,协议类型值为6; ②总长度字段的值的填写;

③本实验要求源IP地址为本机IP地址。 (d) 填写TCP协议信息:

①16位源端口号:自定

②16位目的端口号:如80(HTTP协议)、110(SMTP协议)等。 ③32位序号:自己选择一个ISN(并记录下来,以备后面使用),并填写。 ④32位确认序号:无意义。

⑤首部长度:5(当无可选项时)。 ⑥标志位:SYN必为1,其他为0。 ⑦窗口大小:自定。 ⑧紧急指针: ⑨选项

(e) 校验和:覆盖TCP首部(包含伪首部)和TCP数据两部分,计算方法同UDP协议首部中的校验和计算方法。

以下是利用协议仿真编辑器计算校验和的一个例子:

一个不含数据部分的TCP数据包的十六进制对照表如下:

计算机网络协议仿真实验

00 01 02 03 04 05 06 07 08 09 0A 0B 08 00 45 00 00 4F 94 48 40 00 80 06 E4 9D C0 A8 00 20 C0 A8 00 52 00 15 00 14 73 C9 91 BD 94 64 0F E7 00 14 44 6C 72 7A 00 00 其中黑体部分为用来计算校验和的TCP伪首部和TCP首部,其中: 00 06:为TCP伪首部中8位的0和8位的协议字段; C0 A8 00 20:为TCP伪首部中32位源IP地址; C0 A8 00 52:为TCP伪首部中32位目的IP地址; 最后面的20字节为TCP首部; 伪首部中16位TCP首部长度,暂时存放在16位TCP校验和字段中,在本例中该值为00 14(相应字段填写的是十进制数值:20);

对上述选中部分计算校验和并填回TCP校验和字段中。

3、在发送该TCP连接请求帧之前,先运行一次:ping 主控设备。 4、暂停仿真机端的TCP/IP协议。 5、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送TCP报文; 6、在监控机一端截获相应的应答报文并分析。

7、要求监控机一端的同学及时准确地捕获应答报文并迅速从中获得应答报文的32位ISN,并告之仿真机一端的同学;根据应答报文提供的序号,对服务器的报文进行确认,以完成TCP连接的建立。

编辑该帧的步骤与上面基本相同,但要注意:

(a) 注意:仿真机一端的同学在完成上一步请求报文的发送后,应立即开始本步骤中除了32位应答序号及校验和以外的字段的填写; (b) 32位的序号应为上述自选的ISN加1(为什么?);

(c) 32位的确认序号应为应答报文中服务器端的ISN加1; (d) 标志位中:ACK标志应置为1,其他标志应为0。 (e) 注意在该步骤中计算校验和要熟练、迅速; 8、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送TCP应答报文,以完成TCP连接的建立;

9、发送数据报文:发送数据内容根据具体的上层协议确定。 10、断开TCP连接

(a) 编辑该帧的步骤与上面基本相同,但要注意在标志位中:FIN标志应置为1,其他标志应为0。

(b) 点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送TCP释放连接请求报文。

(c) 在监控机一端截获相应的请求及应答报文并分析。 注意:实验结束后启动仿真机端的TCP/IP协议。

练习四:多TELNET客户端同时运行。

1、在仿真机端同时打开两个或更多DOS命令提示符窗口,在这些窗口上同时运行:

计算机网络协议仿真实验

telnet 服务器IP地址

2、在监控机一端捕获数据,分析仿真机发送和接收的TCP数据包。说明哪些包是属于同一TCP连接上的,你是根据什么进行区分的?

练习五:察看TCP、UDP会话状况。 1、在监控机端选择“会话状况”,察看其中的TCP、UDP会话状况统计结果。 2、捕获大量数据包,分析其中有多少TCP会话。

(a) 切换TAP上的按钮,将监控机连接到交换机镜像口的HUB上。

(b) 启动监控机端本地连接上的TCP/IP协议,即可捕获流经局域网上的所有帧。 (c) 以UDP协议为过滤条件,显示捕获的UDP数据包,分析其中有多少UDP会话。 (d) 以TCP协议为过滤条件,显示捕获的TCP数据包,分析

其中有多少TCP会话?

在捕获期间,存在多少TCP连接? 有多少TCP连接失败?

有多少TCP连接正常中断?

在结束捕共获时,有多少TCP连接是活跃的? (e) 将捕获的TCP数据包保存到文件:实验六.zdt。 (f) 观察协议统计信息。

点击网络协议分析仪的“协议统计”功能,察看各协议的统计信息,在IP协议的统计信息中,TCP、UDP协议所占的百分比如何?

【思考问题】

结合实验过程中的实验结果,回答下列问题

1、如果在实验三发送建立连接请求帧之前,仿真机端不运行“PING 服务器” 命令,而又停止了仿真机端的TCP/IP协议,可能出现什么情况?通过实验来验证你的答案。

2、根据练习四说明:在仿真机端,系统是如何把接收到的数据显示到相应的窗口的。 3、分析TCP协议所使用的滑动窗口协议机制。

【实验结论】

实验七 SOCKET网络程序设计

【实验目的】

1、理解进程通信的原理及通信过程 2、掌握基本的网络编程方法 【实验学时】 4学时

【实验类型】

计算机网络协议仿真实验

综合型

【实验要求】

1、进一步掌握UDP及TCP协议的工作原理 2、掌握SOCKET编程的基本方法

3、学习应用C语言与WinSock2进行简单的无连接的网络程序设计,实现网络数据传输 4、学习应用C语言与WinSock2进行简单的面向连接的网络程序设计,实现网络数据传输

【实验原理】

1、关于使用套接字编程的一些基本概念 (a) 半相关与全相关 半相关

在网络中,用一个三元组可以在全局唯一标志一个进程: (协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。 全相关

一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:

(协议,本地地址,本地端口号,远地地址,远地端口号) 这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

(b) TCP/IP协议的地址结构为: struct sockaddr_in{ short sin_family; /*AF_INET*/

}

u_short sin_port; /*16位端口号,网络字节顺序*/ struct in_addr sin_addr; /*32位IP地址,网络字节顺序*/ char sin_zero[8]; /*保留*/

(c) 套接字类型

TCP/IP的socket提供下列三种类型套接字。 流式套接字(SOCK_STREAM)

提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。

数据报式套接字(SOCK_DGRAM)

提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。

原始式套接字(SOCK_RAW)

该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现

计算机网络协议仿真实验

有服务中配置的新设备。

(d) 基本套接字系统调用

为了更好地说明套接字编程原理,下面给出几个基本套接字系统调用说明。 (1) 创建套接字──socket()

应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:

SOCKET socket(int af, int type, int protocol);

该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type 描述要建立的套接字的类型。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket()系统调用实际上指定了相关五元组中的“协议”这一元

(2) 指定本地地址──bind()

当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:

int bind(SOCKET s, const struct sockaddr FAR * name, int namelen);

参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name 是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度。

如果没有错误发生,bind()返回0。否则返回值SOCKET_ERROR。

地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确认识。

(3) 建立套接字连接──connect()与accept()

这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端口不可操作。而accept()用于使服务器等待来自某客户进程的实际连接。

connect()的调用格式如下:

int connect(SOCKET s, const struct sockaddr FAR * name, int namelen); 参数s是欲建立连接的本地套接字描述符。参数name指出说明对方套接字地址结构的指针。对方套接字地址长度由namelen说明。

如果没有错误发生,connect()返回0。否则返回值SOCKET_ERROR。在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。

由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。因此bind()和connect()无须协议作为参数。

accept()的调用格式如下:

计算机网络协议仿真实验

SOCKET accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen); 参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。addr 指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。addrlen 为客户方套接字地址的长度(字节数)。如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。

accept()用于面向连接服务器。参数addr和addrlen存放客户方的地址信息。调用前,参数addr 指向一个初始值为空的地址结构,而addrlen 的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr 和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。

四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过connect()自动完成。若采用无连接,客户方必须使用bind()以获得一个唯一的地址。

以上讨论仅对客户/服务器模式而言,实际上套接字的使用是非常灵活的,唯一需遵循的原则是进程通信之前,必须建立完整的相关。

(4) 监听连接──listen()

此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:

int listen(SOCKET s, int backlog);

参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。

listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。

调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。

(5) 数据传输──send()与recv()

当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。

send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下: int send(SOCKET s, const char FAR *buf, int len, int flags); 参数s为已连接的本地套接字描述符。buf 指向存有发送数据的缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。

recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:

计算机网络协议仿真实验

int recv(SOCKET s, char FAR *buf, int len, int flags); 参数s 为已连接的套接字描述符。buf指向接收输入数据缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。

(6) 输入/输出多路复用──select()

select()调用用来检测一个或多个套接字的状态。对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。请求给定状态的套接字集合由一个fd_set结构指示。在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时, select()调用返回满足条件的套接字的数目,其调用格式如下:

int select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout);

参数nfds指明被检查的套接字描述符的值域,此变量一般被忽略。

参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据。参数writefds 指向要做写检测的套接字描述符集合的指针。exceptfds指向要检测是否出错的套接字描述符集合的指针。timeout指向select()函数等待的最大时间,如果设为NULL则为阻塞操作。select()返回包含在fd_set结构中已准备好的套接字描述符的总数目,或者是发生错误则返回SOCKET_ERROR。

(7) 关闭套接字──closesocket()

closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。closesocket()的调用格式如下:

BOOL closesocket(SOCKET s);

参数s待关闭的套接字描述符。如果没有错误发生,closesocket()返回0。否则返回值SOCKET_ERROR。

2、用于无连接协议(如UDP)的SOCKET系统调用流程框图:

计算机网络协议仿真实验

服务员 Socket() 客户 Socket() Bind() recvfrom() bind() 等待来自客户的数据 数据(请数据处理 sendto() 数据(回sendto() recvfrom() 3、面向连接协议(如TCP)的SOCKET系统调用流程框图:

计算机网络协议仿真实验

Socket() 服务员 Bind() Listen() 客户 Socket() accept() 等待来自客户的连接请求 建立连接 connect() 数据(请求) recv() send() 数据处理 数据(回答) send() recv()

4、其他原理请参考教材: 第四章 TCP和UDP协议

【实验步骤】

练习一:使用UDP协议的无连接客户-服务员程序设计。

根据实验原理中介绍的内容,设计一个无连接的客户-服务员系统,实现二者之间的数据传递。下面是一个简单的UDP客户-服务员程序的实例,作为参考。

说明:下述服务员程序保存在服务器端,可以直接从服务器拷贝,并稍作修改(如服务员IP地址)后在本地进行编译连接并运行。

数据采集器的红色按钮要求按出来,使监控机捕获到局域网的数据。 #include #include

#define SERV_UDP_PORT 6000 /*服务员进程端口号,视具体情况而定*/

计算机网络协议仿真实验

#define SERV_HOST_ADDR \服务员地址,视具体情况而定*/ /* 宏定义用来打印错误消息*/ #define PRINTERROR(s) \\

fprintf(stderr,\

//////////////////////////////////////////////////////////// //数据报通信的服务员端子程序 //

////////////////////////////////////////////////////////////

void DatagramServer(short nPort) {

SOCKET theSocket;

/*创建一个数据报类型的socket*/

theSocket = socket(AF_INET, // 地址族 SOCK_DGRAM, // socket类型 IPPROTO_UDP);// 协议类型:UDP

/*错误处理*/

if (theSocket == INVALID_SOCKET) {

PRINTERROR(\ return; }

/*填写服务员地址结构*/

SOCKADDR_IN saServer;

saServer.sin_family = AF_INET;

saServer.sin_addr.s_addr = INADDR_ANY; // 由WinSock指定地址 saServer.sin_port = htons(nPort); // 服务员进程端口号 /* 将服务员地址与已创建的socket绑定*/

int nRet;

nRet = bind(theSocket,

// Socket 描述符

计算机网络协议仿真实验

(LPSOCKADDR)&saServer, // 服务员地址 sizeof(struct sockaddr) //地址长度 );

/*错误处理*/

if (nRet == SOCKET_ERROR) {

PRINTERROR(\ closesocket(theSocket); return; }

/* 等待来自客户端的数据*/

SOCKADDR_IN saClient; char szBuf[1024]; int nLen;

while(1) {

/*准备接收数据*/

memset(szBuf, 0, sizeof(szBuf)); nRet = recvfrom(theSocket, szBuf, sizeof(szBuf), 0,

// 已绑定的socket // 接收缓冲区 // 缓冲区大小 // Flags

(LPSOCKADDR)&saClient, // 接收客户端地址的缓冲区 &nLen); // 地址缓冲区的长度

/*打印接收到的信息*/

printf(\

/* 发送数据给客户端*/

strcpy(szBuf, \

sendto(theSocket,

// 已绑定的socket

计算机网络协议仿真实验

szBuf, strlen(szBuf), 0, // 发送缓冲区

// 发送数据的长度 // Flags

(LPSOCKADDR)&saClient, // 目的地址 nLen); // 地址长度 }

closesocket(theSocket);

return; }

//////////////////////////////////////////////////////////// //数据报服务员端主程序 //

////////////////////////////////////////////////////////////

void main() {

WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; int nRet; short nPort;

nPort = SERV_UDP_PORT;

/* 初始化Winsock*/

nRet = WSAStartup(wVersionRequested, &wsaData); if (wsaData.wVersion != wVersionRequested) {

fprintf(stderr,\ return; }

/*调用数据服务员子程序*/ DatagramServer(nPort);

/*结束WinSock*/

计算机网络协议仿真实验

WSACleanup(); }

请学生认真阅读分析上述服务员程序,然后根据实验原理二中介绍的内容,自行编写相应的无连接的客户端程序并运行。从而实现客户和服务器间的数据传输。 。

在仿真机一端运行客户端进程,在监控机端捕获数据并进行分析。

练习二:使用TCP协议的面向连接的客户-服务员程序设计。

根据实验原理中介绍的内容,设计一个面向连接的客户-服务员系统,实现二者之间的数据传递。

下面是一个简单的TCP客户-服务员程序的服务员程序: 面向连接的服务员程序:

#include #include #include #include #include #include #include #include

#define SERV_TCP_PORT 6000 /*服务员进程端口号,视具体情况而定*/ #define SERV_HOST_ADDR \服务员IP,视具体情况而定*/ int sockfd;

/////////////////////////////////////////////////////////////// //线程用来处理客户端的请求 // //服务员主进程每与某客户端建立一个连接之后,便启动一个新的线程来处理接下// //客户端的请求,参数为服务员与该客户端的连接点:socket // //////////////////////////////////////////////////////////////

DWORD ClientThread(void *pVoid) {

int nRet;

char szBuf[1024];

memset(szBuf, 0, sizeof(szBuf));

计算机网络协议仿真实验

/*接收来自客户端的数据信息*/

nRet = recv((SOCKET )pVoid, szBuf, sizeof(szBuf), 0);

//与客户端连接的socket // 接收缓冲区 // 缓冲区长度 // Flags

/*错误处理*/

if (nRet == INVALID_SOCKET) {

printf(\ closesocket(sockfd);

closesocket((SOCKET)pVoid); return 0; }

/*显示接收到的数据*/

printf(\

/* 发送数据给客户端*/

strcpy(szBuf, \发送内容 nRet = send((SOCKET)pVoid, //与客户端连接的socket szBuf, // 数据缓冲区 strlen(szBuf), // 数据长度 0); // Flags

/*结束连接,释放socket*/

closesocket((SOCKET)pVoid);

return 0; }

////////////////////////////////////////////////////////////// //服务员主程序: // //在一个众所周知的端口上等待客户的连接请求 // //有请求到来时建立与客户端的连接,并启动一个线程处理该请求 //

//////////////////////////////////////////////////////////////

int main()

计算机网络协议仿真实验

{

int clilen; int pHandle=-1;

struct sockaddr_in serv_addr; SOCKET socketClient; DWORD ThreadAddr; HANDLE dwClientThread; SOCKADDR_IN SockAddr;

/*初始化Winsock API,即连接Winsock库*/

WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData;

if (WSAStartup(wVersionRequested, &wsaData)) {

printf(\ return -1; }

/*打开一个TCP SOCKET */

if((sockfd=socket(AF_INET, SOCK_STREAM,0))<0) printf(\

/*绑定本地地址,以便客户端连接*/

memset((char *)&serv_addr,0,sizeof(struct sockaddr_in)); serv_addr.sin_family=AF_INET;

serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(SERV_TCP_PORT);

if (bind(sockfd,(struct sockaddr *)(& serv_addr), sizeof (serv_addr) )<0)

printf(\

/*设置服务员的最大连接数为15*/ listen(sockfd,5);

/*循环等待来自客户端的连接请求*/ while(1) {

/*阻塞等待一个请求的到来*/

计算机网络协议仿真实验

clilen = sizeof(SOCKADDR_IN); socketClient = accept(sockfd,

(LPSOCKADDR)&SockAddr, &clilen);

/*出错处理*/

if (socketClient == INVALID_SOCKET) {

printf(\ break; }

/* 打印已建立的连接信息*/

printf(\ socketClient,

inet_ntoa(SockAddr.sin_addr));

/*启动一个新线程处理该请求*/

dwClientThread =CreateThread(NULL, 0,

(LPTHREAD_START_ROUTINE)&ClientThread, (void *)socketClient, 0,

&ThreadAddr);

/*错误处理*/

if(!dwClientThread)

printf(\

/*线程建立以后,主程序里不再使用线程handle,将其关闭,但线程继续运行*/ CloseHandle((HANDLE)dwClientThread); }

/*结束 windows sockets API*/ WSACleanup(); return 0; }

上述服务员程序已经在服务器端运行,请学生认真阅读,然后根据实验原理二中介绍的内容,设计面向连接的客户端程序,实现客户与服务员间的数据传输。

计算机网络协议仿真实验

在仿真机一端运行客户端进程,在监控机端捕获数据并分析。

练习三:使用TCP协议进行复杂的客户-服务员程序设计。

上述的例子程序比较简单,有一些进程中往往同时存在几条连接,这样的进程在有报文到来时,可以在它处理的任何socket上执行recv调用,但它不知道哪个socket上已有报文,哪个上没有,可以使用select()系统调用来解决这样的问题。有兴趣的同学可自行编写这样较复杂的客户-服务员程序。

【思考问题】

结合实验过程中的实验结果,回答下列问题

1、根据编程练习实验中记录的客户和服务器程序的端口号并结合程序,说明:

在客户/服务器模型当中,客户进程的端口号和服务器进程的端口号都是由程序给出说明的吗?为什么?

2、在TCP/IP网络中,当客户与服务员进程建立了一条TCP连接以后,是否属于该连接的所有包都是经过同一路径(即一条虚电路)传递的?为什么?

【实验结论】

实验八SNMP协议与网络管理

【实验目的】

1、理解SNMP协议的工作原理 2、理解SNMP协议的作用 【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、理解SNMP协议的作用 2、熟悉SNMP协议的格式 3、了解SNMP与UDP的关系

4、了解MIB以及基本的MIB变量 5、了解ASN.1的编码标准 【实验原理】

(1)SNMP的报文格式:

计算机网络协议仿真实验

字段说明: 共同体:

共同体字段是一个字符串。这是管理进程和代理进程之间的口令,是明文格式。默认值是public。

PUD类型(五种): PUD类型 0 1 2 3 4 名 称 get-request get-next-request get-response set-request trap 描 述 从代理进程提取一个或多个参数值 从代理进程提取一个或多个参数的小一个参数值 返回的一个或多个参数值。(由代理进程发出,是前三个操作的相应操作) 设置代理进程的一个或多个参数值 代理进程主动发出的报文,通知管理进程有某些事情发生

请求标识:

请求标识由管理进程设置,由代理进程在get-response中返回。客户进程(管理进程)通过它来确定服务器(代理)进程发出的响应与客户进程发出的查询是否匹配。

差错状态(六种): 差错状态 0 1 2 3 4 5

名 称 noError tooBig noSuchName badValue readOnly genErr 描 述 没有错误 代理进程无法把响应放在一个SNAP消息中发送 操作不存在的变量 set操作的值或语义有错误 管理进程试图修改一个只读变量 其他错误 计算机网络协议仿真实验

差错索引:

是一个整数偏移量,指明当有差错发生时,差错发生在哪一个参数。它是由代理进程标注的,只有在发生noSuchName、badValue、readOnly差错时才标注。

trap类型(七种): trap类型 0 1 2 3 4 5 6 名 称 coldStart warmStart linkDown linkUp 描 述 代理进程对自己初始化 代理进程对自己重新初始化 一个接口已经从工作状态改变为故障状态,报文中的第一个变量标识此接口 一个接口已经从故障状态改变为工作状态,报文中的第一个变量标识此接口 一个EGP邻站已改变为故障状态。报文中的第一个变量包含此邻站的IP地址 在这个特定的代码字段中查找trap信息 authenticationFailure 从SNMP管理进程收到无效共同体的报文 egpNeighborLoss enterpriseSpecific

(2)其他原理请参考教材: 第五章 应用协议

【实验步骤】

1、仿真机端

主控设备端的SNMP服务已经启动,本实验选择服务器端的SNMP进程作为服务进程即SNMP代理进程,并进行访问。

练习一:编辑并发送SNMP数据包

由于SNMP服务是建立在UDP协议之上的,SNMP数据封装在UDP数据包内,故对SNMP数据的编辑即是对UDP数据字段内容的编辑。

1、打开协议仿真编辑器。

2、填写该帧的以太网协议首部:

(a) 源MAC地址”和“目的MAC地址”字段

(b) “类型或长度”字段值应为:0800(即IP协议的类型值) 3、填写IP协议头信息:

注意协议字段,选择上层协议类型为UDP协议,其类型值为17; 目的地址为服务器主机的IP地址。 4、填写UDP协议信息: (a) 16位源端口号:自选

计算机网络协议仿真实验

(b) 16位目的端口号:161(SNMP代理进程的UDP端口号) (c) 16位UDP长度:UDP报头长度(8)与UDP数据长度之和。 (d) 编辑UDP数据字段(即:SNMP数据信息):

例如:02 01 00 04 06 70 75 62 6C 69 63 A0 5F 02 01 04 02 01 00 02 01 00 30 54 30 0C 06 08 2B 06 01 02 01 01 01 00 05 00

(e) 校验和:覆盖UDP首部(含伪首部)和数据两部分。计算方法参考实验五。 5、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送UDP报文; 6、在监控机一端截获该报文及响应报文并分析。

【思考问题】

结合实验过程中的实验结果,回答下列问题

1、SNMP服务为什么选择UDP协议而不是TCP协议作为下层协议? 【实验结论】

实验九 应用层协议 – 1:HTTP协议

【实验目的】

1、掌握HTTP协议的使用 2、了解HTTP协议的实现方式 【实验学时】 4学时

【实验类型】 综合型

【实验要求】

1、学习HTTP协议的格式

2、理解HTTP协议与TCP协议的关系 3、了解HTTP协议的通信过程

4、理解HTTP协议的无连接、无状态特性 【实验原理】

HTTP报文共有两种通用类型:请求报文,响应报文。

(1)请求报文:包括请求行、首部,以及有时出现的主体。如图

请求行 首部 空行

本文来源:https://www.bwwdw.com/article/pbdg.html

Top