gijmlAAA计算机网络课程设计实验报告
计算机网络课程设计实验报告

计算机网络课程设计实验报告一、实验项目:网络聊天程序二、实验要求:利用Winsock控件,采用TCP或UDP方式实现一个网络聊天程序。
具体要求如下:(1)能够实现一个聊天服务器(采用TCP方式时可同时允许15个用户连接),并在用户之间相互进行信息发送。
(2)具有聊天记录功能。
(3)制作一个客户端程序。
在课程设计报告中要求给出程序设计的思想、关键程序说明以及服务器和客户程序运行界面的屏幕截图。
三、实验程序功能:采用TCP方式实现的网络聊天程序:(1)以某一用户名注册进入聊天室,自动判断是否与现有聊天室人员重名,给出相关信息。
进入后启动线程,获得现有聊天室人员的列表信息;(2)点击[送出]按钮,向所有人发送信息。
双击列表中某人的名字,在弹出的窗口中可以写悄悄话,悄悄话内容只显示在这个人的屏幕上;(3)点击[刷新谈话区],可以清空聊天信息屏幕。
点击[刷新聊天者列表]可以重新从服务器读取聊天室人员列表信息;(4)点击[退出聊天室],向所有人发送离开信息,同时刷新聊天室人员列表;(5)服务器端程序先行运行,服务器读取来自客户端的信息流请求,并把相应处理结果返回客户端,完成与客户端的通信。
(6)点击[聊天记录],可以查看聊天室的聊天记录。
四、设计与分析:客户端聊天室客户/服务器通信图(《》表示信息流方向):五、设计思想:传输层协议有两种:TCP和UDP,TCP是可靠传输,它把信息包捆绑,在必要的时候,排序和重传这些信息包以获得可靠的数据传输。
UDP支持快速的、无连接的、不可靠的信息包传输。
在JAVA中,使用TCP传输,其套接字的封装函数分TCP/IP客户套接字和TCP/IP服务器套接字。
本程序使用TCP做,采用了JA V A中的流式Socket 的通信机制,流式Socket 通信过程如下图:客户套接字函数:Socket(String hostname,itn port)或Socket(InetAddress ipAddress,int port)服务端套接字函数:ServerSocket(int port)ServerSocket(int port,int maxQueue)ServerSocket(int port,int maxQueue,InetAddress localAddress)六、文件说明:文件清单:(1)客户端线程主类:chatappletthreepublic class chatserverthree implements Runnable{/*聊天室服务器端处理主类*///服务器构造初始化线程public chatserverthree(){}//服务器main()初始化public static void main(String args[]){}//服务器线程connect操作run方法public void run(){}//向聊天室所有人员发送普通话语信息public void broadcast(String msg){}//处理悄悄话,向特定人员发送悄悄话public void broadcast1(String msg){}//客户端线程类firstthreadclass firstthread extends Thread{}//firstthread 初始化线程public firstthread(chatserverthree server,Socket client){}//监听运行线程public void run(){while(true){line=in.readUTF();//line 读取来自客户端线路的信息//线路信息前端为PEOPLE表明有新人进入了聊天室if(line.startsWith("PEOPLE")){}//线路信息前端为QUIT表明有人离开了聊天室else if(line.startsWith("QUIT")){}//线路前端为MSG表明接收到的是普通聊天话语信息e lse if(line.startsWith("MSG")) {}//线路前端为“悄悄的对”表明接收到的是悄悄话else if(line.startsWith("悄悄地对")){}//线路前端为newlist表明得到客户端刷新列表的请求else if(line.startsWith("newlist")){}}}(2) 聊天室界面AWT面板类:Apanel:/*聊天室界面北部面板Apanel类*/class Apanel extends Panel //用于构造面板{}Bpanel:/*聊天室界面中部面板Bpanel类*/class Bpanel extends Panel{}Cpanel:/*聊天室界面南部面板Cpanel类*/class Cpanel extends Panel{}(3) 发送悄悄话弹出式窗口类:Mywindow:class Mywindow extends Frame implements ActionListener{//构造方法初始化画出弹出式窗口界面Mywindow(){}//处理按钮事件的方法public void actionPerformed(ActionEvent e){}}(4)服务器端线程类:Chatserverthree:/*聊天室主类chatappletthree类*/public class chatappletthree extends Applet implements Runnable,ActionListener,ItemListener {//Applet 启动初始化画出聊天室界面,建立与服务器连接public void init() {}//启动线程public void start(){}//终止线程public void stop() {}//关闭监听端口,断开连接public void destroy() {}//客户端启动线程public void run() {}}(4)服务器为每一个客户端启动的线程类Firstthread//客户端线程类firstthreadclass firstthread extends Thread{protected Socket client;//listen读取来自客户端的消息:name 格式为:PEOPLE+名字+[性别]String line,name;protected DataOutputStream firstout,out; //定义网络数据输出流protected chatserverthree server;protected DataInputStream in; //定义网络数据输入流//firstthread 初始化线程public firstthread(chatserverthree server,Socket client){this.server=server;this.client=client;。
计算机网络课程设计实验报告完整版(移动公司网络设计)

计算机网络训练课程设计题目移动公司网络结构设计专业班级学生姓名学号指导教师2011年 3月 1 日目录第一章课题确定…………………………………………………………… 1.1.1 概述与课题选择 (1)1.2 网络结构设计的目标和作用 (1)第二章需求分析 (1)2.1 公司大楼结构分布 (1)2.2 行政结构 (1)2.3 各部门功能需求分析 (2)2.4 信息点的设置 (2)2.5 接入INTERNET方式 (2)第三章系统总体规划和实现功能 (3)3.1 网络系统设计原则、系统建设目标 (3)第四章网络系统硬件环境设计4.1 网络拓朴结构设计 (3)4.1.1 公司中心局域网拓朴结构设计(即核心层) (4)4.1.2 各部门网络拓朴结构的设计(即汇聚层) (5)4.2 传输方式的设计 (5)4.2.1 网络拓朴结构的设计 (5)4.3 网络互联设备的选购 (6)4.3.1 交换机 (6)4.3.2 交换机的选择 (6)4.3.3 路由器 (8)第五章网络系统软件环境设计 (8)5.1 操作系统及应用软件 (8)5.1.1 网络操作系统的选购 (9)5.1.2 应用软件的选购 (9)5.1.3 网络防火墙的选购 (9)5.2 网络安全 (9)5.2.1 网络系统安全风险分析 (10)5.2.2 安全需求与安全目标 (11)5.2.3 网络安全策略 (12)5.2.4 系统安全目标 (12)5.3 网络安全方案总体设计 (12)5.3.1 安全方案设计原则 (13)结束语 (13)第一章课题确定1.1 概述与课题选择随着现代科技的发展及计算机技术与通讯技术的结合,人们已经不再满足原有的办公方式,办公自动化、网络化的需求逐日增加。
计算机网络技术营造了一个现代化的高效、快捷、安全的办公环境,也使计算机的功能得到了充分的发挥。
作为社会基础设施之一的中国移动通信公司,充分利用网络技术,为人们的生活和工作提供了许多便利,在信息化高度发展的今天,起着至关重要的作用。
计算机网络课程实验报告

计算机网络课程实验报告计算机网络课程实验报告引言:计算机网络课程实验是培养学生对计算机网络原理和技术的理解和应用能力的重要环节。
通过实验,我们可以巩固课堂所学的理论知识,掌握网络设备的配置和管理技巧,提高网络故障排查和解决问题的能力。
本文将结合实际实验过程,总结并分析我们在计算机网络课程实验中的收获和体会。
实验一:网络拓扑搭建与配置在实验一中,我们需要搭建一个简单的局域网,通过交换机连接多台计算机,并进行网络设备的基本配置。
通过实验,我们学会了如何正确连接和配置交换机、路由器和计算机,了解了网络拓扑的概念和组网原理。
同时,在实验过程中,我们也遇到了一些问题,如网络设备的IP地址冲突、网络延迟等,通过分析和解决这些问题,我们加深了对网络故障排查和解决问题的理解。
实验二:网络通信与数据传输实验二主要是通过Wireshark等工具来抓包分析网络数据传输过程。
我们学会了如何使用Wireshark捕获网络数据包,并分析数据包的结构和内容。
通过实验,我们了解了网络通信的基本原理,如TCP/IP协议栈、数据包的封装和解封装过程等。
同时,我们也发现了一些网络通信中的问题,如丢包、重传等,通过对数据包的分析和解读,我们可以更好地理解和解决这些问题。
实验三:网络安全与防护实验三主要是学习和实践网络安全相关的知识和技术。
我们了解了网络攻击的常见手段和防御方法,如防火墙、入侵检测系统等。
通过实验,我们学会了如何配置和管理防火墙,设置访问控制列表,提高网络的安全性。
同时,我们也体验了一些网络攻击的模拟实验,如DDoS攻击、ARP欺骗等,通过对攻击过程的模拟和分析,我们更深入地了解了网络安全的重要性和挑战。
实验四:网络性能测试与优化实验四主要是通过网络性能测试工具来评估和优化网络的性能。
我们学会了如何使用Ping、Traceroute等工具来测试网络的连通性和延迟,通过分析测试结果,我们可以找出网络中的瓶颈和问题,并采取相应的优化措施。
计算机网络实验报告(6篇)

计算机网络实验报告(6篇)计算机网络实验报告(通用6篇)计算机网络实验报告篇1一、实验目的1、熟悉微机的各个部件;2、掌握将各个部件组装成一台主机的方法和步骤;3、掌握每个部件的安装方法;4、了解微型计算机系统的基本配置;5、熟悉并掌握DOS操作系统的使用;6、掌握文件、目录、路径等概念;7、掌握常用虚拟机软件的安装和使用;8、熟悉并掌握虚拟机上WINDOWS操作系统的安装方法及使用;9、掌握使用启动U盘的制作和U盘安装windows操作系统的方法;10、了解WINDOWS操作系统的基本配置和优化方法。
二、实验内容1.将微机的各个部件组装成一台主机;2.调试机器,使其正常工作;3.了解计算机系统的基本配置。
4.安装及使用虚拟机软件;5.安装WINDOWS7操作系统;6.常用DOS命令的使用;7.学会制作启动U盘和使用方法;8.WINDOWS7的基本操作;9.操作系统的基本设置和优化。
三、实验步骤(参照实验指导书上的内容,结合实验过程中做的具体内容,完成此项内容的撰写)四、思考与总结(写实验的心得体会等)计算机网络实验报告篇2windows平台逻辑层数据恢复一、实验目的:通过运用软件R-Studio_5.0和winhe_对误格式化的硬盘或者其他设备进行数据恢复,通过实验了解windows平台逻辑层误格式化数据恢复原理,能够深入理解并掌握数据恢复软件的使用方法,并能熟练运用这些软件对存储设备设备进行数据恢复。
二、实验要求:运用软件R-Studio_5.0和winhe_对电脑磁盘或者自己的U盘中的删除的数据文件进行恢复,对各种文件进行多次尝试,音频文件、系统文件、文档文件等,对简单删除和格式化的磁盘文件分别恢复,并检查和验证恢复结果,分析两个软件的数据恢复功能差异与优势,进一步熟悉存储介质数据修复和恢复方法及过程,提高自身的对存储介质逻辑层恢复技能。
三、实验环境和设备:(1)Windows _P 或Windows 20__ Professional操作系统。
《计算机网络实验》实验报告

《计算机网络实验》实验报告一、实验目的计算机网络实验是计算机相关专业学习中的重要实践环节,通过实验操作,旨在深入理解计算机网络的基本原理、协议和技术,提高我们的动手能力和解决实际问题的能力。
具体目的包括:1、熟悉计算机网络的体系结构和各层协议的工作原理。
2、掌握网络设备的配置和管理方法,如交换机、路由器等。
3、学会使用网络工具进行网络性能测试和故障诊断。
4、培养团队合作精神和沟通能力,提高解决复杂问题的综合素养。
二、实验环境本次实验在学校的计算机网络实验室进行,实验室配备了以下设备和软件:1、计算机若干台,安装了 Windows 操作系统和相关网络工具软件。
2、交换机、路由器等网络设备。
3、网络线缆、跳线等连接设备。
三、实验内容及步骤实验一:以太网帧的捕获与分析1、打开网络协议分析软件 Wireshark。
2、将计算机连接到以太网中,启动捕获功能。
3、在网络中进行一些数据传输操作,如访问网站、发送文件等。
4、停止捕获,对捕获到的以太网帧进行分析,包括帧的格式、源地址、目的地址、类型字段等。
实验二:交换机的基本配置1、连接交换机和计算机,通过控制台端口进行配置。
2、设置交换机的主机名、管理密码。
3、划分 VLAN,并将端口分配到不同的 VLAN 中。
4、测试不同 VLAN 之间的通信情况。
实验三:路由器的基本配置1、连接路由器和计算机,通过控制台端口或Telnet 方式进行配置。
2、设置路由器的接口 IP 地址、子网掩码。
3、配置静态路由和动态路由协议(如 RIP 或 OSPF)。
4、测试网络的连通性。
实验四:网络性能测试1、使用 Ping 命令测试网络的延迟和丢包率。
2、利用 Tracert 命令跟踪数据包的传输路径。
3、使用网络带宽测试工具测试网络的带宽。
四、实验结果与分析实验一结果与分析通过对捕获到的以太网帧的分析,我们清楚地看到了帧的结构,包括前导码、目的地址、源地址、类型字段、数据字段和帧校验序列等。
计算机网络课程设计实验报告

计算机网络课程设计实验报告1. 引言计算机网络是现代信息技术的基石,它的设计与实现对于计算机科学与技术专业的学生来说尤为重要。
本次实验旨在通过一个计算机网络课程设计项目,帮助学生进一步深入理解计算机网络的原理与实践,提升实际操作能力。
2. 实验目标本实验的目标是设计一个简单的局域网内部共享文件的系统。
具体要求如下:1.实现一个服务器程序,能够提供文件的上传与下载功能;2.实现一个客户端程序,能够通过命令行界面与服务器进行交互;3.实现文件的断点续传功能,确保文件可以在网络断开后继续传输;4.实现基本的权限管理功能,确保只有授权用户才能够上传和下载文件。
3. 实验环境本次实验的开发环境与工具如下:•操作系统:Windows 10•开发语言:Python 3.8•开发环境:PyCharm 2020.1•版本控制:Git4. 实验过程与方法4.1 系统架构设计本实验的系统架构包括服务器程序和客户端程序两个部分。
服务器程序采用C/S模型,在指定端口上监听客户端的请求,根据客户端发送的指令进行相应的操作,如上传文件、下载文件、断点续传等。
服务器程序使用了Python的socket模块实现网络通信。
客户端程序通过命令行界面与服务器进行交互,用户可以输入不同的指令来实现上传、下载、断点续传等功能。
客户端程序使用了Python的argparse模块处理命令行参数,使用socket模块与服务器进行通信。
4.2 文件传输实现文件的传输采用TCP协议进行,对于较大的文件,可以采用分片传输的方式,确保文件能够在网络断开后继续传输。
客户端程序在向服务器请求下载文件时,会先发送文件的元信息(如文件名、大小等),服务器会根据元信息判断文件是否存在、是否需要断点续传等。
对于需要断点续传的文件,服务器会记录已传输的字节数,并将剩余部分发送给客户端。
4.3 权限管理实现服务器程序实现了基本的权限管理功能,通过在服务器端维护一个用户列表,每次上传或下载文件时,都会要求用户进行身份验证。
计算机网络实验实验报告1

计算机网络实验实验报告1一、实验目的本次计算机网络实验的主要目的是深入理解计算机网络的基本原理和技术,通过实际操作和观察,掌握网络配置、数据传输、协议分析等方面的知识和技能,提高对计算机网络的综合应用能力。
二、实验环境1、硬件环境:计算机若干台,具备以太网卡。
网络交换机、路由器等网络设备。
网线若干。
2、软件环境:Windows 操作系统。
Wireshark 网络协议分析工具。
网络配置工具(如 ipconfig 命令)。
三、实验内容与步骤1、网络拓扑结构搭建利用网线将计算机与交换机连接,构建简单的星型网络拓扑结构。
检查物理连接是否正常,确保网络设备的指示灯显示正常。
2、 IP 地址配置打开计算机的网络设置,手动配置 IP 地址、子网掩码、网关等参数。
使用 ipconfig 命令查看配置是否成功,验证网络连接的有效性。
3、网络连通性测试使用 ping 命令测试不同计算机之间的连通性。
记录测试结果,分析可能存在的连接问题并进行排查。
4、数据捕获与协议分析在一台计算机上安装并运行 Wireshark 工具。
启动捕获网络数据包,进行网络通信操作,如访问网站、发送文件等。
停止捕获后,对捕获的数据包进行分析,查看数据包的源地址、目的地址、协议类型等信息。
5、网络服务配置与测试配置一台计算机作为 Web 服务器,安装 Web 服务软件(如 IIS 或Apache)。
在其他计算机上通过浏览器访问该 Web 服务器,验证 Web 服务的可用性。
四、实验结果与分析1、网络拓扑结构搭建与 IP 地址配置成功搭建了星型网络拓扑结构,计算机与交换机之间的物理连接正常。
手动配置的 IP 地址能够正确生效,通过 ipconfig 命令显示的网络参数与设定值一致。
2、网络连通性测试在进行 ping 测试时,大部分计算机之间能够正常通信,少数出现丢包现象。
经过检查,发现是网线接触不良导致,更换网线后问题解决。
3、数据捕获与协议分析通过 Wireshark 捕获到了丰富的网络数据包,包括 TCP、UDP、HTTP 等常见协议。
计算机网络实验报告(通用7篇)

计算机网络实验报告计算机网络实验报告(通用7篇)在经济飞速发展的今天,报告使用的次数愈发增长,其在写作上有一定的技巧。
我敢肯定,大部分人都对写报告很是头疼的,以下是小编收集整理的计算机网络实验报告,希望对大家有所帮助。
计算机网络实验报告1一、需求分析建设一个以办公自动化、计算机辅助教学、现代计算机校园文化为核心,以现代网络技术为依托,技术先进、扩展性强、能覆盖全校主要楼宇的校园主干网络,将学校的各种pc机、工作站、终端设备和局域网连接起来,并与有关广域网相连,在网上宣传自己和获取Internet网上的教育资源。
形成结构合理,内外沟通的校园计算机系统,在此基础上建立满足教学、研究和管理工作需要的软硬件环境,开发各类信息库和应用系统,为学校各类人员提供充分的网络信息服务。
系统总体设计将本着总体规划、分步实施的原则,充分体现系统的技术先进性、高度的安全可靠性,同时具有良好的开放性、可扩展性、冗余性。
本着为学校着想,合理使用建设资金,使系统经济可行。
具体包括下以几个方面:1、内网络能够高速访问FTP服务器现在或上传文件实现资源共享功能,实现对不同类型的用户划分不同的权限,限制不同类型的用户只能访问特定的服务资源。
可以下载和上传资料文件,访问速度可以对指定的用户进行级别的划分。
2、建设Web服务器对外实现信息发布,对内实现教学教务管理。
网站发布学校新闻、通知、学校的活动等相关内容。
实现学生能够在网上进行成绩查询、网上报名、网上评教等功能;以及教师的信息查询、教学数据上传等。
3、建设邮件服务器以满足校园内部之间和内、外网这间的大量邮件传输的需求。
4、实现内网划分多个VLAN,实现校园内不同校区,不同楼宇,不同楼层的多客户接入。
5、内部实现PC间实现高速互访,同时可以访问互联网。
网络内同一IP段内的PC机可以通过网上邻居实现高速互访,传送资料文件等,解决不同楼宇,不同楼层之间通过移动存储设备传送数据费时、费力的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机网络课程设计实验报告一、实验内容和要求1、实验一数据包的捕获与分析Wireshark是一种开源的网络数据包的捕获和分析软件,本实验通过Wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。
具体内容及要求如下:Wireshark软件的安装;Wireshark软件的启动,并设置网卡的状态为混杂状态,使得Wireshark可以监控局域网的状态;启动数据包的捕获,跟踪PC之间的报文,并存入文件以备重新查;设置过滤器过滤网络报文以检测特定数据流;对常用协议的数据包的报文格式进行分析,利用协议分析软件的统计工具显示网络报文的各种统计信息。
2、实验二网络层实验—Ping程序的设计与实现实验目的本实验目的是使学生掌握网络层协议的原理及实现方法。
实验设计内容本实验为ICMP实验。
实验内容:Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充:-h 显示帮助信息-b 允许ping一个广播地址,只用于IPv4-t 设置ttl值,只用于IPv4-q 安静模式。
不显示每个收到的包的分析结果,只在结束时,显示汇总结果Ping命令的基本描述二、实验环境实验一数据包的捕获与分析1.联网计算机或linux 系统3.在PC中安装协议分析软件(如:Wireshark)4.物理基础:标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。
运用这一原理使信息捕获系统能够拦截的我们所要的信5.工作模式:1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。
2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。
但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 MAC地址的帧。
4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
实验二网络层实验—Ping程序的设计与实现1.联网计算机2.Linux系统3.系统自带编译环境三、程序的需求分析与逻辑框图需求分析1、实验一数据包的捕获与分析1>.在PC中安装协议分析软件。
2>.启动Wireshark协议分析软件,选择抓包菜单项启动实时监视器,开始实时跟踪显示网络数据报文。
可根据系统提示修改显示方式。
3>.调出跟踪存储的历史报文,选择有代表性的ETHERNET,,IP,ICMP,TCP,UDP报文,对照有关协议逐个分析报文各字段的含义及内容。
4>.设置过滤器属性,如目的地址,源地址,协议类型等。
如过滤不需要的网络报文,过滤器允许设置第二层,第三层或第四层的协议字段。
2、实验二网络层实验—Ping程序的设计与实现PING程序是我们使用的比较多的用于测试网络连通性的程序。
PING程序给予ICMP使用ICMP的回送请求和回送应答来工作。
ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
实现检测网络通畅及速度的ping,并扩展以下功能:-h 显示帮助信息-b 允许ping一个广播地址,只用于IPv4-t 设置ttl值,只用于IPv4-q 安静模式,不显示每个收到的包的分析结果,只在结束时,显示汇总结果三、程序的需求分析与逻辑框图逻辑框图1、总体设计程序分为两大部分:一部分读取收到的所有消息,并输出ICMP Echo replay消息,另一部分每个一秒钟发送一个Echo 消息。
另一部分由SIGALARM 信号每秒驱动一次。
2、详细设计main readloop recvfromprocsig_alarmsend为SIGALARM 建立信号处理程序无限接收循环每秒发送一个Echo 消息1)main 函数设置随同Echo 请求一起发送的可选数据长度处理命令行参数调用readloop 处理分组为SIGALARM 信号建立一个处理程序处理主机名参数三、程序的需求分析与逻辑框图逻辑框图2)readloop函数创建套接口设置套接口缓冲区大小发送第一个分组读取返回给ICMP原始套接口的每个分组记录收到分组的时间调用proc来处理这些分组 3)proc函数 4)send函数获取ICMP头部指针检查ICMP Echo replay 输出收到的所有ICMP消息构造ICMP消息计算校验和发送数据报三、程序的需求分析与逻辑框图逻辑框图Checksum 开始定义初始化cksum(size > 1)确定cksum 及size 大小是if (size)计算校验cksum ,获得结果cksum+=*(UCHAR*)b否结束1、实验一利用协议分析软件跟踪局域网报文,实验内容如下:将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。
设置过滤器过滤网络报文以检测特定数据流。
利用协议分析软件的统计工具显示网络报文的各种统计信息。
2、实验二Ping命令的基本描述Ping的操作是向某些IP地址发送一个ICMP Echo消息,接着该节点返回一个ICMP Echo replay消息。
ICMP消息使用IP头作为基本控制。
IP头的格式如下0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Version| IHL |Type of Service| Total Length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identification |Flags| Fragment Offset|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Time to Live | Protocol | Header Checksum|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Source Address |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Destination Address |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Version=4IHL Internet头长Type of Service = 0Total Length IP包的总长度2、实验二Ping实际上是使用ICMP中的ECHO报文来实现的。
Echo 或 Echo Reply 消息格式如下: 0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identifier | Sequence Number |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Data ...+-+-+-+-+-Typeecho消息的类型为8echo reply 的消息类型为0。
Code=0Checksum为从TYPE开始到IP包结束的校验和Identifier如果 code = 0, identifier用来匹配echo和echo reply消息Sequence Number如果 code = 0, identifier用来匹配echo和echo reply消息功能描述:收到echo 消息必须回应 echo reply 消息。
identifier 和 sequence number 可能被发送echo的主机用来匹配返回的echo reply消息。
例如: identifier 可能用于类似于TCP或UDP的 port 用来标示一个会话, 而sequence number 会在每次发送echo请求后递增。
四、程序核心功能的实现机制2、实验二1、数据结构的描述1) IP包格式struct ip {BYTE Ver_ihl;.);void err_sys(const char *fmt, ...);struct proto {void (*fproc)(char *, ssize_t, struct timeval *);void (*fsend)(void);struct sockaddr *sasend; /* sockaddr{} for send, from getaddrinfo */ struct sockaddr *sarecv; /* sockaddr{} for receiving */socklen_t salen; /* length of sockaddr{}s */int icmpproto; /* IPPROTO_xxx value for ICMP */ } *pr;#endif /* PING_H_ */#include ""struct proto proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };#ifdef IPV6struct proto proto_v6 = { proc_v6, send_v6, NULL, NULL, 0, IPPROTO_ICMPV6 }; #endifint datalen = 56; /* data that goes with ICMP echo request */double rtt_min = INFINITY, rtt_max = -INFINITY, rtt_total = 0, rtt_sqr_total =0;long long send_count = 0, recv_count = 0;int ttl_flag = 0, broadcast_flag = 0;int ttl = 0;struct timeval tval_start;const char *usage ="usage: ping [-v] [-h] [-b] [-t ttl] [-q] <hostname>\n""\t-v\tNormal mode\n""\t-b\tBroadcast\n""\t-t ttl\tSet TTL(0-255)\n""\t-q\tQuiet mode";int main(int argc, char **argv){int c;struct addrinfo *ai;opterr = 0; /* don't want getopt() writing to stderr */while ( (c = getopt(argc, argv, "vhbt:q")) != -1) {switch (c) {case 'v':verbose++;if (optind != argc-1)err_quit(usage);host = argv[optind];pid = getpid();signal(SIGALRM, sig_alrm);signal(SIGINT, sig_int);ai = host_serv(host, NULL, 0, 0);printf("ping %s (%s): %d data bytes\n", ai->ai_canonname, Sock_ntop_host(ai->ai_addr, ai->ai_addrlen), datalen);/* 4initialize according to protocol */if (ai->ai_family == AF_INET) {pr = &proto_v4;#ifdef IPV6} else if (ai->ai_family == AF_INET6) {pr = &proto_v6;if (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr))) err_quit("cannot ping IPv4-mapped IPv6 address"); #endif} elseerr_quit("unknown address family %d", ai->ai_family);pr->sasend = ai->ai_addr;pr->sarecv = calloc(1, ai->ai_addrlen);pr->salen = ai->ai_addrlen;gettimeofday(&tval_start, NULL);void proc_v4(char *ptr, ssize_t len, struct timeval *tvrecv){int hlen1, icmplen;double rtt;struct ip *ip;struct icmp *icmp;struct timeval *tvsend;ip = (struct ip *) ptr; /* start of IP header */hlen1 = ip->ip_hl << 2; /* length of IP header */icmp = (struct icmp *) (ptr + hlen1); /* start of ICMP header */ if ( (icmplen = len - hlen1) < 8)err_quit("icmplen (%d) < 8", icmplen);if (icmp->icmp_type == ICMP_ECHOREPLY) {if (icmp->icmp_id != pid)return; /* not a response to our ECHO_REQUEST */ if (icmplen < 16)err_quit("icmplen (%d) < 16", icmplen);tvsend = (struct timeval *) icmp->icmp_data;tv_sub(tvrecv, tvsend);rtt = tvrecv->tv_sec * + tvrecv->tv_usec / ;if (rtt < rtt_min) rtt_min = rtt;if (rtt > rtt_max) rtt_max = rtt;rtt_total += rtt;rtt_sqr_total += rtt * rtt;recv_count++;if (verbose > 0)void proc_v6(char *ptr, ssize_t len, struct timeval* tvrecv){#ifdef IPV6int hlen1, icmp6len;double rtt;struct ip6_hdr *ip6;struct icmp6_hdr *icmp6;struct timeval *tvsend;ip6 = (struct ip6_hdr *) ptr; /* start of IPv6 header */hlen1 = sizeof(struct ip6_hdr);if (ip6->ip6_nxt != IPPROTO_ICMPV6)err_quit("next header not IPPROTO_ICMPV6");icmp6 = (struct icmp6_hdr *) (ptr + hlen1);if ( (icmp6len = len - hlen1) < 8)err_quit("icmp6len (%d) < 8", icmp6len);if (icmp6->icmp6_type == ICMP6_ECHO_REPLY) {if (icmp6->icmp6_id != pid)return; /* not a response to our ECHO_REQUEST */ if (icmp6len < 16)err_quit("icmp6len (%d) < 16", icmp6len);tvsend = (struct timeval *) (icmp6 + 1);tv_sub(tvrecv, tvsend);rtt = tvrecv->tv_sec * + tvrecv->tv_usec / ;if (rtt < rtt_min) rtt_min = rtt;if (rtt > rtt_max) rtt_max = rtt;rtt_total += rtt;rtt_sqr_total += rtt * rtt;unsigned short in_cksum(unsigned short *addr, int len){int nleft = len;int sum = 0;unsigned short *w = addr;unsigned short answer = 0;while (nleft > 1) {sum += *w++;nleft -= 2;}/* 4mop up an odd byte, if necessary */if (nleft == 1) {*(unsigned char *)(&answer) = *(unsigned char *)w ;sum += answer;}/* 4add back carry outs from top 16 bits to low 16 bits */ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum >> 16); /* add carry */answer = ~sum; /* truncate to 16 bits */return(answer);}void send_v4(void){int len;struct icmp *icmp;icmp = (struct icmp *) sendbuf;icmp->icmp_type = ICMP_ECHO;icmp->icmp_code = 0;void send_v6(){#ifdef IPV6int len;struct icmp6_hdr *icmp6;icmp6 = (struct icmp6_hdr *) sendbuf;icmp6->icmp6_type = ICMP6_ECHO_REQUEST;icmp6->icmp6_code = 0;icmp6->icmp6_id = pid;icmp6->icmp6_seq = nsent++;gettimeofday((struct timeval *) (icmp6 + 1), NULL);len = 8 + datalen; /* 8-byte ICMPv6 header */sendto(sockfd, sendbuf, len, 0, pr->sasend, pr->salen);#endif /* IPV6 */}void readloop(void){ int size;char recvbuf[BUFSIZE];socklen_t len;ssize_t n;struct timeval tval;sockfd = socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);setuid(getuid()); /* don't need special permissions any more */size = 60 * 1024; /* OK if setsockopt fails */setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));if (ttl_flag)setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) ;if (broadcast_flag)setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast_flag, sizeof(broadcast_flag)) ;sig_alrm(SIGALRM); /* send first packet */void sig_alrm(int signo){(*pr->fsend)();send_count++;alarm(1);return; /* probably interrupts recvfrom() */}void sig_int(int signo){struct timeval tval_end;double tval_total;gettimeofday(&tval_end, NULL);tv_sub(&tval_end, &tval_start);tval_total = * + / ;puts("--- ping statistics ---");printf("%lld packets transmitted, %lld received, %.0lf%% packet loss, time %.2lfms\n",send_count, recv_count, (send_count - recv_count) * / send_count, tval_total);double rtt_avg = rtt_total / recv_count;printf("rtt min/avg/max/mdev = %.3lf/%.3lf/%.3lf/%.3lf ms\n", rtt_min,rtt_avg, rtt_max, rtt_sqr_total / recv_count - rtt_avg * rtt_avg);close(sockfd);exit(0);}void tv_sub(struct timeval *out, struct timeval *in){if ( (out->tv_usec -= in->tv_usec) < 0) { /* out -= in */char * sock_ntop_host(const struct sockaddr *sa, socklen_t salen){static char str[128]; /* Unix domain is largest */switch (sa->sa_family) {case AF_INET: {struct sockaddr_in *sin = (struct sockaddr_in *) sa;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)return(NULL);return(str);}#ifdef IPV6case AF_INET6: {struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;if (inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str)) ==NULL)return(NULL);return(str);}#endif#ifdef HAVE_SOCKADDR_DL_STRUCTcase AF_LINK: {struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa;if (sdl->sdl_nlen > 0)snprintf(str, sizeof(str), "%*s",sdl->sdl_nlen, &sdl->sdl_data[0]);char * Sock_ntop_host(const struct sockaddr *sa, socklen_t salen){char *ptr;if ( (ptr = sock_ntop_host(sa, salen)) == NULL)err_sys("sock_ntop_host error"); /* inet_ntop() setserrno */return(ptr);}struct addrinfo *host_serv(const char *host, const char *serv, int family, int socktype){ int n;struct addrinfo hints, *res;bzero(&hints, sizeof(struct addrinfo));= AI_CANONNAME; /* always return canonical name */= family; /* AF_UNSPEC, AF_INET, AF_INET6, etc. */= socktype; /* 0, SOCK_STREAM, SOCK_DGRAM, etc. */if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)return(NULL);return(res); /* return pointer to first on linked list */}/* end host_serv */static void err_doit(int errnoflag, int level, const char *fmt, va_list ap){ int errno_save, n;char buf[MAXLINE];errno_save = errno; /* value caller might want printed */#ifdef HAVE_VSNPRINTFvsnprintf(buf, sizeof(buf), fmt, ap); /* this is safe */#elsevsprintf(buf, fmt, ap); /* this is not/* Fatal error unrelated to a system call. * Print a message and terminate. */ void err_quit(const char *fmt, ...){va_list ap;va_start(ap, fmt);err_doit(0, LOG_ERR, fmt, ap);va_end(ap);exit(1);}/* Fatal error related to a system call. * Print a message and terminate. */ void err_sys(const char *fmt, ...){va_list ap;va_start(ap, fmt);err_doit(1, LOG_ERR, fmt, ap);va_end(ap);exit(1);}六、程序扩展功能的需求分析与实现2、实验二扩展功能-h 显示帮助信息-b 允许ping一个广播地址,只用于IPv4-t 设置ttl值,只用于IPv4-q 安静模式。