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

2019-05-27 20:43

计算机网络协议仿真实验

(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()的调用格式如下:


实验1 网络协议分析与仿真(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于中西方绘画差异

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: