计算机网络实验报告

计算机网络实验报告

实验一、局域网组建及测试实验

实验二、Internet服务在局域网中的实现

 

 

 

 

               姓    名:才旺   

 学    号:1315001208112    

实验一:局域网组建及测试实验

一、实验目的

1、掌握使用双绞线作为传输介质的网络连接方法,学会制作两种类型的接头。学会测线器的使用方法。

2、以双绞线为传输介质连接多台计算机,要求掌握基本的计算机网络知识、TCP/IP协议常识。

3、使用常用网络命令,测试分析网络状态,要求掌握基本的网络命令使用要点。

二、实验设备及环境

交换机,带RJ-45接口网卡的微机、5类双绞线、水晶头、压线钳、测线器。

三、实验原理

1、理解100BaseT连接双绞线的EIA/TIA 568标准。

     100BaseT连接双绞线有正线和反线两种。正线(标准568B):两端线序一样,线序是:白橙、橙、白绿、蓝、白蓝、绿、白棕和棕。反线(568A):一端为正线的线序,另一端为:白绿,绿,白橙,蓝,白蓝,橙,白棕,棕。正线用于连接PC-HUB、HUB-HUB普通口-级连口、HUB(级联口)-SWITCH和SWITCH-ROUTER。反线用于连接PC-PC、HUB-HUB普通口、HUB-HUB普通口-级连口、HUB-SWITCH和ROUTER-ROUTER。网线钳的基本使用。

2、网络配置中包含的基本协议、服务和基本参数。

    基本协议时TCP/IP协议,为传输控制协议/因特网互联协议,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。

    TCP/IP协议的参数会自动从DHCP获取。如需要使用静态IP则需要对网卡进行配置。

 

  图1    TCP/IP协议的静态配置图

四、试验内容及步骤

1、 网线的制作

准备好一根网线,2个水晶头,一个压线钳,根据网线的EIA/TIA 568标准,从以下步骤制作网线。

第一步:利用压线钳的剪线刀口剪裁出计划需要使用的双绞线的适当长度。

第二步:把双绞线的灰色保护层去掉,并且将线头剪齐。

第三步:剥除掉灰色的塑料保护膜后,可见双绞线的网线的4对8条芯线,每对的颜色都不同。每对缠绕的两根芯是由一种染有相应颜色的芯线加上一条染有少许相应颜色的白色相间的芯线组成。

第四步:将每对都是缠绕在一起的芯线逐一解开,解开后根据需要接线的规则把几组线缆依次的排列好并解顺,排列的时候应该尽量避免线路的缠绕和重叠。

第五步:将整理好的线缆插入水晶头内。注意线的排列顺序。

第六步:检查到线是准确的插入水晶头后,要进行压线了。把水晶头插入压线钳的8P槽内,用力握紧线钳。这样一压,可以使水晶头突出在外面的针脚压入水晶头内,听到“啪”的一声即可。

第七步:使用网络测试仪测试制作好的网线的连通线。

2、根据实际硬件及实现要求规划出网络框架,划出拓扑图如图2所示。

 图2 局域网拓扑图

3、检查主机的TCP/IP配置情况。

      1) 主机所在的网络是否能够提供动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)的支持,系统是否在启动时自动获取并配置IP地址、DNS服务器地址等信息。

      (3)使用ipconfig命令显示当前所有的TCP/IP网络配置情况、刷新动态主机配置协议(DHCP)和设置域名系统(DNS)。查看网络配置并记录下来,了解并使用其他ipconfig 命令及其参数。

4、 检查网络从一个节点到另一个节点的连通线。使用ping命令进行如下测试。

     1)测试本机TCP/IP协议安装是否正常?

 

      从中可以看出,使用ping 127.0.0.1后,发送的数据包全部接收到了,表示TCP/IP协议安装正常。

    2)测试本机网卡安装是否正常?

使用 “ping  172.16.129.108"后,显示有发送和接收数据包,表示网卡安装正常。

     3)测试本机与远程主机是否连通?

用指令"ping 172.16.129.3" 后,测试到本机与远程主机是连通的。

    4)使用tracert命令,查看本地主机向远程主机发送信息包传送的路径,并记录下来;

 

     使用“trccert 202.197.235.15”命令后,本机向远程主机(202.197.235.15)发送的信息包传送失败,可能原因是202.197.235.15的网点并不存在,或者服务器没有打开。

当使用命令“trccert www.hao123.com”时,可以看到本机向网站www.hao123.com发送信息包成功。

5)使用ruote命令,查看本地主机路由,记录下来。

五、思考题

1、IP地址、子网掩码、网关地址与代理服务器地址分别表示什么含义?

答:IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。

   子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

   网关地址是一种充当转换重任的计算机系统或设备,可以使用再不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间。

   代理服务器地址是在开放系统互联(OSI)模型的对话层,从而起到防火墙的作用。

2、 集线器与交换机在原理、实现与使用上有那些区别?
    1)从原理上看:集线器(这里仅指非交换式单网段和多网段型)在OSI体系结构中属于OSI的第一层物理层设备,而交换机属于OSI的第二层数据链路层设备,现在常见的三层交换为在二层平台上提供VLAN和基于IP的路由和交换功能,而四层交换则为基于端口的应用。集线器只是对数据的传输起到同步、放大和整形的作用,对数据传输中的短帧、碎片等无法进行有效的处理,不能保证数据传输的完整性和正确性,类似于一个大的总线型局域网;而交换机不但可以对数据的传输做到同步、放大和整形,而且可以过滤短帧、碎片对封装数据包进行转发等。
    2)从实现上看:集线器是一种广播模式,也就是说集线器的某个端口工作的时候,其他所有端口都能够收听到信息,容易产生广播风暴,并且每一个时刻只有一个端口发送数据,另外安全性差,所有的网卡都能接收到所发数据,只是非目的地网卡丢弃了信包。当交换机工作的时候,只有发出请求的端口和目的端口之间相互响应而不影响其他端口,因此交换机就能够隔离冲突域和有效的抑制广播风暴的产生。
    3)从使用上看:交换机工作于数据链路层以MAC地址进行寻址,有一定的额外寻址开销,在数据流量小时,时延可能相对数据传输时间而言较大;集线器工作于物理层为广播方式传输数据,流量小时性能下降不明显适合于共享总线型结构局域网

六、实验中遇到的问题及解决的方法。

   1)制作网线时插入水晶头候,线的排列顺序不对。

     刚开始,露出的双绞线比较长,所以插入水晶头候,线就发生了错乱,线头的顺序就乱了,测试时出错。所以在将双绞线的长度剪得合适,并且插入之前将线头并排压紧后,较容易插入水晶头。

   2)对网络命令不够熟悉

     因为向对tracert、route等查看的指令不熟悉,所以运用指令之前,我上网搜索了相关的资料,所以在以后的学习中,遇到什么问题就要想办法尽量解决掉。

七、实验总结。

通过本次试验,首先加强了自己动手解决问题的能力,而且让我对所学的计算机网络知识有了连贯的复习和总结,对一些问题有了更深入的了解和见解,通过查阅相关资料也开阔了视野,同时也让我感觉到网络之庞大。

首先掌握了网线的制作和测试方法,其次运用网络指令,了解了IP地址、子网掩码、默认网关与代理服务器地址的含义及其作用,以及获取自己想要的关于主机是否运行正常的内容。同时,查看了网络连接的硬件基础,能组建简单的局域网。

    总之,要想彻底了解掌握,仍要通过不断的努力学习。


实验二、Internet服务在局域网中的实现

一、实验目的

1、了解DNS的基本原理

2、了解互联网上DNS的层次关系

3、掌握Windows 20## sever中DNS基本配置。

二、实验原理和内容

DNS是域名系统 (Domain Name System)的缩写,是一种组织成域层次结构的计算机和网络服务命名系统。DNS 命名用于TCP/IP网络,如Internet,用来通过用户友好的名称定位计算机和服务。当用户在应用程序中输入DNS 名称时,DNS服务可以将此名称解析为与此名称相关的其他信息,如IP地址。

所以,我们想要我们自己内部网上的域名能成功地被解析(即翻译成IP地址),就需要将我们自己的2K机建立成一个DNS服务器,里面包含有我们的域名和IP地址之间的映射表。这通常需要建立一种A记录,A是Address的简写,意为“主机记录”或“主机地址记录”,是所有DNS记录中最常见的一种。

三、实验仪器设备和材料清单

PC机,交换机,路由器,各种线缆。

四、实验内容及步骤

1、按组网图连接好设备,配置各路由器的各接口的IP地址等;配置各台计算机的IP地址和默认网关;

2、 建立DNS的具体步骤为:

  第一步:进入控制面板,在删除/添加程序里面添加网络组建和网络配置。

  第二步:在程序面板中找到组建管理,进入DNS。在DNS中建立一个新的区域,设置好域

          名(这个域名由于不和外网连接,操作者可以随意设置)

  第三步:在域名下面先进一个主机,给主机分配一个IP地址

  第四步:进入cmd面板,ping 域名。计算机会自动解析出域名对应的IP地址。这里的域

          名相当于IP的一个称呼,两者是等价的。只是在形式上,域名的形式更面向对      

          象。人们使用的时候容易记忆

3、 进行DNS的设置

    1)“开始”,“程序”,“管理工具”,“ DNS ”,选中 DNS 服务器,选“正向搜索区域”,右键,“新建区域”,如图 1

          http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image002_0000.jpg

                                 图 1 新建区域图

      2)选标准主区域,如图 1所示。

              http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image004_0000.jpg

                               图 2 选标准主区域

     3 )选“正向搜索区域”,如图 3所示。

               http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image006_0000.jpg

                       图 3  选正向搜索区域

      4)输入区域名称,如图 4所示。

                 http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image008_0000.jpg

                           图 4   输入区域名称

       5 )确定区域文件存放位置,如图 5所示。

http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image010_0000.jpg

                       图 5  确定区域文件存放位置

     6 )按“完成”,安装结束,如图 6所示

http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image012_0000.jpg

图 6 “完成”界面

    7)在 DNS 服务器里选“正向搜索区域”,右键,“建立主机”,输入名称和 IP 地址。

http://learning.sohu.com/upload/itweek03/images/pl-dns2_clip_image014_0000.jpg

图 10 输入记录

   8)设置好的DNS的图形界面如下。

  9)DNS设置后的验证,测试所进行的设置是否成功,采用2K自带的“ping”命令来完成。

测试DNS的设置

五、思考题

1、 如何设置FTP、TELNET服务?

答:进入终端命令模式,用root用户登录;

    开启ftp服务。

  cd /etc/xinetd.d ,编辑ftp服务的配置文件gssftp:

  vi gssftp ,将 修改两项内容:

  (1)server_args = -l –a 去掉-a 改为server_args = -l

  (2)disable=yes改为disable=no

  (3)保存退出。(输入":X"保存退出,":q!"不保存退出)

    开启telnet服务

cd /etc/xinetd.d ,察看telnet服务的配置文件krb5-telnet的设置:$ {! b7 r0 A8 d. z

   开启telnet服务设置

   vi krb5-telnet ,

将disable=yes,改为disable=no,保存退出。

激活服务:

  telnet /ftp 是挂在 xinetd 底下的,所以自然只要重新激活 xinetd 就能够将 xinetd 里头的设定重新读进来,所以刚刚设定的telnet /ftp自然也就可以被激活。

  激活目录和命令:

  cd /etc/rc.d/init.d/

  service xinetd restart

  有时会提示命令不存在,需要加上命令的路径

  [root@localhost init.d]# service xinetd resart

  bash: service: command not found

  [root@localhost init.d]# /sbin/service xinetd restart

   若提示xinetd: 未被识别的服务,则说明/etc/rc.d/init.d下无xinetd包

  [root@localhost init.d]# yum -y install xinetd*   //下载xinetd包

[root@localhost init.d]# service xinetd resart    //重新启动FTP、Telnet服务

这样既可ftp登陆到服务器。完成以上工作后,就是无法上传,但可以下载,那你就要:

修改配置文件vi /etc/selinux/config:

SELINUX=enforcing   更改为=====》SELINUX=disabled

修改完后,重启或执行:setenforce 0

2、真实DNS系统是如何工作的?

    答:当 DNS 客户端需要查询程序中使用的名称时,它会查询 DNS 服务器来解析该名称。客户端发送的每条查询消息都包括三条信息,指定服务器回答的问题:指定的 DNS 域名,规定为完全合格的域名 (FQDN),指定的查询类型,可根据类型指定资源记录,或者指定查询操作的专用类型,DNS 域名的指定类别,对于 Windows DNS 服务器,它始终应指定为 Internet (IN) 类别。

六、实验中遇到的问题及解决的方法

1)设置好DNS区域后,用ping命令测试,总是映射不到相对应的域名。

   这是因为主机的DNS设置不正确引起的。我们用的是虚拟机和主机进行的通信,我是在虚拟机中建立的DNS区域,首先用ping命令将主机和虚拟机连通,其次将主机的DNS设置成虚拟机的IP地址。这是因为从虚拟机中出来的数据包,到主机上,不经过外网,要寻找数据接入口,所以只要将主机的DNS设置成虚拟机的IP就可以了。

七、实验总结

通过本次实验,了解了DNS的基本原理,了解互联网上DNS的层次关系及掌握windows 20## server中DNS的配置方法。在实验中,因为对DNS不是很了解,所以在是按照实验指导书一步一步来的,并且还上网搜索了一些问题,从而才顺利的完成了实验。所以,在以后的实验中,还是要多动手、多动脑的。

 

第二篇:计算机网络课程设计报告(IP数据包)

未标题-1 副本

CENTRAL  SOUTH  UNIVERSITY

网络工程实验报告

学生姓名            惠苗壮                        

指导教师            刘丽敏                      

学    院            信息科学与工程学院              

专业班级            计科0904                 

学    号            0909091627                   

完成时间            20120530       


目      录

第一章  设计目的、任务与要求   

1.1设计目的······················································1

1.2设计的任务与要求··············································1

第二章 系统分析设计 

2.1捕获原理分析··················································2

2.2数据包详细结构················································3

2.3主流程图······················································5

第三章 系统实现

3.1 Windows Socket编程简介······································6

3.2报头数据结构定义·············································6

3.3程序具体实现················································7

3.4程序运行····················································12

第四章 心得体会   ·················································14

参考文献···························································16

附录·······························································17


第一章 设计目的、任务与要求

1.1课程设计的目的:

《计算机网络原理》课程是计算机科学与技术专业的重要专业课程之一。随着计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给《计算机网络》课程的教学提出了新的更高的要求。计算机网络原理课程设计的目的与任务是为了使学生在课程学习的同时,通过在一个计算机网络环境中的实际操作,巩固《计算机网络原理》课堂教学所讲授网络 的基本理论、基本概念和方法技术,对现代计算机网络的基本功能有一个初步的了解。为学生今后使用计算机网络的理论和方法,开发大型、复杂的集成系统,打下一个坚实的基础.

1.2课程设计的任务与要求:

课程设计的基本要求是:

1.通过课程设计实践,理解计算机网络原理的基本要点;

2.通过课程设计实践,要求学生对于网络的相关协议有深入的掌握,通过实验加深对计算机网络工作原理的理解,学会使用网络软件开发工具,培养学生的自学能力和开发网络系统软件的能力,并训练软件工程的开发方法。

3.通过课程设计实践,进一步培养学生综合开发网络软件的能力,培养团队合作的能力,重点在网络应用软件的开发。

4. 整个课程设计要求学生按软件工程原理进行组织,文档和参考文献必须规范、齐全。

1.3 IP数据包的捕获与分析的基本要求:

本次实验的要求在网络环境,使用VC++编写程序实现捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。

程序的具体要求如下:

l)以命令行形式运行:ipparse logfile,其中Ipparse是程序名,而logfile则代表记录结果的日志文件。

2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。


3)当程序接收到键盘输入Ctrl+C时退出。

第二章 系统分析设计

2.1数据包捕获的原理分析
    以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络 上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联 连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3 标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这 是捕获数据包的物理基础。
以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的 CSMA/CD 协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据 的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。如果是的话,接收该数据帧,进行物理数据帧的 CRC 校验,然后将数据帧提交给LLC 子层。
网卡具有如下的几种工作模式:
    1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。
    2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
    3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。
    4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。

2.2网络数据包的结构为:

HO)D{%Z9FB7TUN(5NB~OIKP

DLC数据帧头:

RT%Q1Y2ZV)EC9}G0()3F6_K

IP数据报结构:   

L06ESWQBP_T}BW__7@@WR@0

TCP数据包结构:

]R5PFZ$BC{7[5(OXICPH46P

UDP数据报结构:

E]Y9B$V9J5B~(@[6~]VL[DO

ICMP数据报结构:

8E~`IVV8%278R4{TE8EA(~R

IGMP数据报结构:

74$XG1{U)52}~5DSC%UT08B

2.3 主流程图:

 

第三章 系统实现

3.1Windows Socket编程简介

TCP/IP协议与WinSock网络编程接口的关系
WinSock并不是一种网络协议,它只是一个网络编程接口,也就是说,它不是协议,但是它可以访问很多种网络协议,你可以把他当作一些协议的封装。现在的WinSock已经基本上实现了与协议无关。你可以使用WinSock来调用多种协议的功能。那么,WinSock和TCP/IP协议到底是什么关系呢?实际上,WinSock就是TCP/IP协议的一种封装,你可以通过调用WinSock的接口函数来调用TCP/IP的各种功能.例如我想用TCP/IP协议发送数据,你就可以使用WinSock的接口函数Send()来调用TCP/IP的发送数据功能,至于具体怎么发送数据,WinSock已经帮你封装好了这种功能。

3.2报头数据结构的定义:

typedef struct _IP_HEADER

{

    union

    {

       BYTE Version;

       BYTE HdrLen;

    };                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    BYTE ServiceType;

    WORD TotalLen;

    WORD ID;

    union

    {

       WORD Flags;

       WORD Fragoff;

    };

    BYTE TimeToLive;

    BYTE Protocol;

    WORD HdrChksum;

    DWORD SrcAddr;

    DWORD DstAddr;

    BYTE Options;

}IP_HEADER;

3.3程序的具体实现:

1.启动winsock

?      使用函数WSAStartup()完成winsock的启动

?      if (WSAStartup(MAKEWORD(2,2), &wsData) != 0)

?         {

?            printf("WSAStartup failed!\n");

?            return -1;

?         }

2.初始化socket的创建

    SOCKET sock;

    WSADATA wsData;

    ofstream ofs("ip.log",ios::app);

    if (WSAStartup(MAKEWORD(2,2), &wsData) != 0)

    {

       printf("WSAStartup failed!\n");

       return -1;

    }

    if ( ( sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP) ) == INVALID_SOCKET )

    {

       printf("create socket failed\n");

       return -1;

    }

    BOOL flag = true;

    if ( setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char*)&flag, sizeof(flag)) == SOCKET_ERROR )

    {

       printf("setsockopt failed!\n");

       return -1;

    }

    char hostName[128];

    if ( gethostname(hostName, 100) == SOCKET_ERROR )

    {

       printf("gethostname failed!\n");

       return -1;

    }

    hostent* pHostIP;

    if( ( pHostIP = gethostbyname(hostName) ) == NULL )

    {

       printf("gethostbyname failed\n");

       return -1;

  }

3.初始化socket的绑定:

sockaddr_in addr_in;

  addr_in.sin_addr = *(in_addr*)pHostIP->h_addr_list[0];

  addr_in.sin_family = AF_INET;

  addr_in.sin_port = htons(6000);

  if ( bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR )

  {

     printf("bind failed\n");

     return -1;

  }

4.设置网卡的混杂模式:

#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)

    DWORD dwBufferLen[10];

  DWORD dwBufferInLen = 1;

  DWORD dwBytesReturned = 0;

  char buffer[100];

  if ( WSAIoctl(sock, IO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen),

     &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL) == SOCKET_ERROR )

  {

     printf("ioctlsocket faild\n");

     return -1;

  }

5.用户按下Ctrl+C,终止程序的实现。

对于程序来说,要时时处于抓包状态,对于用户来说又要随时能结束程序。所以在实现该功能时,我使用了线程技术,即通过主线程以外的另一个进程,来控制主进程中的抓包循环。从而,既保证了程序的实时性,又不影响抓包。

6.日志文件的实现

定义一个C++输出流,利用write函数,将操作逐步写入文件即可。

while ( true )

    {

       int size = recv(sock, buffer, sizeof(buffer), 0);

       IP_HEADER ip = *(IP_HEADER *)buffer;

       cout << "-----------------------" << endl;

       s+="\n-----------------------\n";

       cout << "Version: " << (ip.Version>>4) << endl;

       _itoa(ip.Version>>4,buffer1,10);

       s+="Version: ";

       s+=buffer1;

       s+="\n";

       cout << "IHL: " << ( (ip.HdrLen & 0x0f) * 4) << endl;

       s+="IHL:";

       _itoa((ip.HdrLen & 0x0f)*4,buffer1,10);

       s+=buffer1;

       s+="\n";

       cout << "Type of service: Priority" << (ip.ServiceType >> 5) <<

           ", Service" << ( (ip.ServiceType >> 1 ) & 0x0f) << endl;

       s+="Type of service: Priority";

        _itoa(ip.ServiceType >> 5,buffer1,10);

       s+=buffer1;

        s+=", Service";

        _itoa((ip.ServiceType >> 1 ) & 0x0f,buffer1,10);

       s+=buffer1;

       s+="\n";

      

       cout << "TOtal Length: " << ip.TotalLen << endl;

       s+="TOtal Length: ";

        _itoa( ip.TotalLen ,buffer1,10);

       s+=buffer1;

       s+="\n";

       cout << "Identifcation: " << ip.ID << endl;

       s+="Identifcation: ";

        _itoa( ip.ID ,buffer1,10);

       s+=buffer1;

       s+="\n";

        cout << "sign: " << ( (ip.Flags >> 15) & 0x01) << ", DF = " <<

           ( (ip.Flags >> 14) & 0x01) << ", Mf = " << ( (ip.Flags >> 13) &0x01) << endl;

       s+="sign: ";

        _itoa((ip.Flags >> 15) & 0x01,buffer1,10);

       s+=buffer1;

        s+= ", DF = ";

        _itoa((ip.Flags >> 14) & 0x01,buffer1,10);

        s+=buffer1;

       s+=", Mf = ";

        _itoa((ip.Flags >> 13) & 0x01,buffer1,10);

        s+=buffer1;

       s+="\n";

       cout << "Fragment offset: " << (ip.Fragoff & 0x1fff) << endl;

        s+="Fragment offset: ";

        _itoa(ip.Fragoff & 0x1fff,buffer1,10);

        s+=buffer1;

       s+="\n";

       cout << "Time to live: " << (int)ip.TimeToLive << endl;

        s+="Time to live: ";

        _itoa((int)ip.TimeToLive ,buffer1,10);

        s+=buffer1;

       s+="\n";

       cout << "Protocol:" <<(int)ip.Protocol << endl;

       s+="Protocol:" ;

        _itoa((int)ip.Protocol ,buffer1,10);

        s+=buffer1;

       s+="\n";

       cout << "Header Checksum: " << ip.HdrChksum << endl;

        s+="Header Checksum: ";

        _itoa( ip.HdrChksum ,buffer1,10);

        s+=buffer1;

       s+="\n";

       cout << "Source address: " << inet_ntoa(*(in_addr *)&ip.SrcAddr) << endl;

       s+="Source address: ";

        s+=inet_ntoa(*(in_addr *)&ip.SrcAddr);

       s+="\n";

       cout << "Destination address: " <<inet_ntoa(*(in_addr *)&ip.DstAddr) << endl;

       s+="Destination address: ";

        s+=inet_ntoa(*(in_addr *)&ip.DstAddr);

       s+="\n";

       p=&s[0];

       ofs.write(p,strlen(p));

    }

3.4程序运行

主页面:

 

文件;

 

第四章 心得体会

这次的课程设计使我感触很深,学了一个学期的计算机网络,都不知道那些书上的知识是怎么应用在实践中,通过这次的课程设计我了解了很多以前似懂非懂的东西,然后在把书上的那些代码经过分析,应用在这次课程设计中,使感觉计算机网络真的是很有趣的一门课程。

这次的课程设计,加强了我们动手、思考和解决问题的能力。巩固和加深了对网络编程的理解,提高综合运用本课程所学知识的能力。培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。而且做课程设计同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西。认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。所以这个期末测试之后的课程设计对我们的作用是非常大的。

这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在整个设计过程中,构思是很花费时间的。调试时经常会遇到这样那样的错误,有的是因为粗心造成的语法错误。当然,很多也时用错了方法,总是实现不了。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点:

   1、认真上好专业实验课,多在实践中锻炼自己。

2、写程序的过程中要考虑周到,严密。

3、在做设计的时候要有信心,有耐心,切勿浮躁。

4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。

5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。

每个实验通常都要花费很久的时间才能理清一个程序的思路,而且要不断的调试程序才能把程序调试正确,同时还要做到界面的输出也是需要美化的。这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,也完成了课程设计。

通过这次的课程设计,让我更加了解到计算机网络的重要性。以及它对我们专业的网络方向发展发挥的作用。对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!同时在做课程设计时要能够从多方面去考虑,去研究,用多种算法去实现要求。此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,这些都让我受益非浅,今后的制作应该能够更轻松,自己也都能够解决并高质量的完成项目。

最后,感谢这些天来,一直陪着我们,辛苦工作的指导刘丽敏老师,感谢您的无私奉献和辛勤教导,使我能得到进步,能够取得成功,感谢您!

参考文献:

[1]Andrew S.Tanenbaum .计算机网络.清华大学,1998,32.

[2]网站


附录;

程序源代码如下:

#include "winsock2.h"

#include "ws2tcpip.h"

#include <windows.h>

#include <fstream>

#include <iostream>

#pragma comment(lib,"ws2_32")

using namespace std;

typedef struct _IP_HEADER

{

   union

   {

      BYTE Version;

      BYTE HdrLen;

   };                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

   BYTE ServiceType;

   WORD TotalLen;

   WORD ID;

   union

   {

      WORD Flags;

      WORD Fragoff;

   };

   BYTE TimeToLive;

   BYTE Protocol;

   WORD HdrChksum;

   DWORD SrcAddr;

   DWORD DstAddr;

   BYTE Options;

}IP_HEADER;

int main ()

{

   SOCKET sock;

    WSADATA wsData;

   ofstream ofs("ip.log",ios::app);

   if (WSAStartup(MAKEWORD(2,2), &wsData) != 0)

   {

      printf("WSAStartup failed!\n");

      return -1;

   }

   if ( ( sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP) ) == INVALID_SOCKET )

   {

      printf("create socket failed\n");

      return -1;

   }

   BOOL flag = true;

   if ( setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char*)&flag, sizeof(flag)) == SOCKET_ERROR )

   {

      printf("setsockopt failed!\n");

      return -1;

   }

   char hostName[128];

   if ( gethostname(hostName, 100) == SOCKET_ERROR )

   {

      printf("gethostname failed!\n");

      return -1;

   }

   hostent* pHostIP;

   if( ( pHostIP = gethostbyname(hostName) ) == NULL )

   {

      printf("gethostbyname failed\n");

      return -1;

   }

   sockaddr_in addr_in;

   addr_in.sin_addr = *(in_addr*)pHostIP->h_addr_list[0];

   addr_in.sin_family = AF_INET;

   addr_in.sin_port = htons(6000);

   if ( bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR )

   {

      printf("bind failed\n");

      return -1;

   }

#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)

    DWORD dwBufferLen[10];

   DWORD dwBufferInLen = 1;

   DWORD dwBytesReturned = 0;

   char buffer[100];

   if ( WSAIoctl(sock, IO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen),

      &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL) == SOCKET_ERROR )

   {

      printf("ioctlsocket faild\n");

      return -1;

   }

  

   printf("Analysis IP Packet !\n\n");

   string s;

   char * p;

   char buffer1[100];

   while ( true )

   {

      int size = recv(sock, buffer, sizeof(buffer), 0);

      IP_HEADER ip = *(IP_HEADER *)buffer;

      cout << "-----------------------" << endl;

      s+="\n-----------------------\n";

      cout << "Version: " << (ip.Version>>4) << endl;

      _itoa(ip.Version>>4,buffer1,10);

      s+="Version: ";

      s+=buffer1;

      s+="\n";

      cout << "IHL: " << ( (ip.HdrLen & 0x0f) * 4) << endl;

      s+="IHL:";

      _itoa((ip.HdrLen & 0x0f)*4,buffer1,10);

      s+=buffer1;

      s+="\n";

      cout << "Type of service: Priority" << (ip.ServiceType >> 5) <<

        ", Service" << ( (ip.ServiceType >> 1 ) & 0x0f) << endl;

      s+="Type of service: Priority";

        _itoa(ip.ServiceType >> 5,buffer1,10);

      s+=buffer1;

        s+=", Service";

        _itoa((ip.ServiceType >> 1 ) & 0x0f,buffer1,10);

      s+=buffer1;

      s+="\n";

     

      cout << "TOtal Length: " << ip.TotalLen << endl;

      s+="TOtal Length: ";

        _itoa( ip.TotalLen ,buffer1,10);

      s+=buffer1;

      s+="\n";

      cout << "Identifcation: " << ip.ID << endl;

      s+="Identifcation: ";

        _itoa( ip.ID ,buffer1,10);

      s+=buffer1;

      s+="\n";

        cout << "sign: " << ( (ip.Flags >> 15) & 0x01) << ", DF = " <<

        ( (ip.Flags >> 14) & 0x01) << ", Mf = " << ( (ip.Flags >> 13) &0x01) << endl;

      s+="sign: ";

        _itoa((ip.Flags >> 15) & 0x01,buffer1,10);

      s+=buffer1;

       s+= ", DF = ";

        _itoa((ip.Flags >> 14) & 0x01,buffer1,10);

        s+=buffer1;

      s+=", Mf = ";

        _itoa((ip.Flags >> 13) & 0x01,buffer1,10);

        s+=buffer1;

      s+="\n";

      cout << "Fragment offset: " << (ip.Fragoff & 0x1fff) << endl;

        s+="Fragment offset: ";

        _itoa(ip.Fragoff & 0x1fff,buffer1,10);

        s+=buffer1;

      s+="\n";

      cout << "Time to live: " << (int)ip.TimeToLive << endl;

        s+="Time to live: ";

        _itoa((int)ip.TimeToLive ,buffer1,10);

        s+=buffer1;

      s+="\n";

      cout << "Protocol:" <<(int)ip.Protocol << endl;

      s+="Protocol:" ;

        _itoa((int)ip.Protocol ,buffer1,10);

        s+=buffer1;

      s+="\n";

      cout << "Header Checksum: " << ip.HdrChksum << endl;

        s+="Header Checksum: ";

        _itoa( ip.HdrChksum ,buffer1,10);

        s+=buffer1;

      s+="\n";

      cout << "Source address: " << inet_ntoa(*(in_addr *)&ip.SrcAddr) << endl;

      s+="Source address: ";

        s+=inet_ntoa(*(in_addr *)&ip.SrcAddr);

      s+="\n";

      cout << "Destination address: " <<inet_ntoa(*(in_addr *)&ip.DstAddr) << endl;

      s+="Destination address: ";

        s+=inet_ntoa(*(in_addr *)&ip.DstAddr);

      s+="\n";

      p=&s[0];

      ofs.write(p,strlen(p));

   }

   ::closesocket(sock);

   ::WSACleanup();

   return 0;

}

相关推荐