计算机网络课程设计实验报告_第1页
计算机网络课程设计实验报告_第2页
计算机网络课程设计实验报告_第3页
计算机网络课程设计实验报告_第4页
计算机网络课程设计实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机网络课程设计报告姓名:学号:班级:指导老师:湖南科技大学计算机科学与工程学院2013年6月实验一1. 实验名称:网络聊天程序的设计与实现2. 实验目的:通过本实验能够了解socket通信的原理并在此基础上编写一个聊天程序了解TCP/IP的基础知识,发现TCP与UDP勺优缺点以及在网络通信的应用。3. 实验原理:从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的两个主机使用网络的核心部分进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的

2、功能。从IP层来说,通信的两端是两个主机,IP数据报的首部明确的标志了这两个主机的IP地址。但是严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。根据应用程序的不同需求,运输层需要有两种不同的运输协议,即是面向连接的TCP和无连接的UDR在使用这两个协议时运输层向高层用户屏蔽了下面的网络核心的细节,它使应用进程看见的就是好像在两个运输层实体间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDPB议时,这

3、种逻辑通信信道仍然是一条不可靠信道。由于我在课程设计中采用的是UDPW议进行通信的,这里就只简述一下一些关于UDP的内容,UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDPM文后,不需要给出任何确认。虽然UD%提供可靠的交付,但在某些情况下UDP是一种最有效的工作方式。为此当我们使用UTPtH使两个计算机中的进程要互相通信,不仅必需知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。我们的计算机通信时采用客户-服务器方式。客户在发起通信请求时,必需先知道对方的服务器的IP地址和端口号,因此通过IP地址和端口号我们就能将两台主机

4、连接起来,然后通过输入输出流将信息发送到对方的主机上。这样就能实现网络的聊天程序。4.流程图:5.实验步骤:通过使用原理我们知道若要实现两主机间的通信最重要的是获得对方的IP地址和设置端口号,在实验中我们假定已经知道了要通信主机的IP地址,故在编程中主要的是套接字socke的编程步骤,在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。服务器编程步骤:1、加载数据库,创建套接字(WSAStrartup()/socket();2、绑定套接字到一个IP地址和一个端口上(bind();3、将套接字设置为监听模式等待请求(listen。);4、请求到来后,接受链接请求,返

5、回一个新的对应于此次连接的套接字(accept。);5、用返回的套接字和客户端进行通信(send()/rec();6、返回,等待另一个请求;7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup().其次是客户端的编程步骤:1、加载数据库,创建套接字(WSAStrartup()/socket();2、向服务器发送连接请求(connect。);3、和服务器端进行通信(send()/recv();4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup().6.实验过程中的问题:首先是在编写代码时考虑了是用TCP还是用UD的议,通过翻看了原

6、来计算机网络的书后举得利用TCP来编写聊天程序的话,由于TCP议相对于UDPB议复杂了许多且是面向连接的运输层协议在每次建立与断开连接的时候都要不停的进行确认十分占用网络资源,但UDR1不用那么繁琐,且效率相对的要高出许多。但是在代码测试时老师说到作为一个聊天工具重点是信息的交流对于UDP容易出现丢包的现象,且TCP协议具有很高的可靠性,对于网络的占用也并非想象中的那么严重,故对于编写此类程序还是用TCP的好一些。其次是在编程过程中发现在通信过程中由于端口号只设定一个所以一旦服务器与一台客户端连接时,其他的的客户端就不能与服务器进行连接了,因为先前的客户端占用的端口号。通过与老师的交流后知道了

7、,在使用TCP/UDPB议时有两条连接时,突然就有种豁然开朗的感觉。实验二:1 .实验名称:Ping程序上设计与实现2 .实验要求:用C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试一个主机到只一个主机之间的连通情况。要求:1)独立完成程序的设计、编码和调试。2)系统利用C语言实现,程序调试环境为TurboC或VC;3)按照课程设计规范书写课程设计报告。4)采用VC环境进行调试运行。3.实验内容本程序主要分为四个模块(功能模块图见图1.1):初始化模块,功能控制模块,数据报解读模块,Ping测试模块。初始化模块:该模块用于定义及初始化各个全局变量,为wi

8、nsock加载winsock体。功能控制模块:该模块是被其他模块调用,其功能包括解析参数、计算ICMP数据报文检验和、清除SOCKET,ICM四数据以及接受缓冲区。数据报解读模块:数据报解析模块提供了解读IP选项和解读ICMP报文的功能。Ping测试模块:该模块是本程序的核心模块,调用其他模块实现其功能,进而实现Ping的功能。4.流程图:开始5.实验中遇到的问题及解决方案:问题1:提示库函数名为未标示符?分析:在程序开头只有以下头文件,#include<winsock2.h>#include<stdio.h>#include<stdlib.h>忘记打开&l

9、t;ws2tcpip.h>头文件;问题2:提示出现内存(0x000000)错误?分析:voidDecodeICMPHeader(char*buf,intbytes,SOCKADDR_IN*from)buf动态指针指向错误。问题3:连接时所有有关winsock的库函数连接不上?分析:一定是缺少了某个头文件或没打开动态库,解决办法是在开头加上一下代码:#pragmacomment(lib,"ws2_32.lib");实验三1 .实验名称:基于IP多播组的网络会议2 .实验内容:了解IP多播的基本原理,参照局域网IP多播程序,设计一个简易的网络会议程序。3 .实验目的:1、

10、加深对计算机局域网IP多播工作原理的理解,通过编写计算机程序实现、模拟其功能,使学生理解并掌握其基本原理及工作过程。2、提高网络编程和应用的能力。提高实际编程能力和灵活运用所学知识解决问题的能力。4 .实验要求:编写一个简易的局域网IP多播网络会议程序,理解IP多播的基本概念和工作原理,程序由Sender和Receiver两个部分组成,Sender用户从控制台上输入多播发送数据,Receiver端都要求加入同一个多播组,完成接收Sender发送的多播数据。5 .实验原理:IP多播技术,也常称为组播通信,它是基于IP层的通信技术。是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的

11、,同时的)的TCP/IP网络技术,是一点对多点的通信。采用多播通信技术,不仅可以实现一个发送者和多个接收者之间进行通信的功能,而且可以有效减轻网络通信的负担,避免资源的无谓浪费。并不是所有的协议都支持多播通信,通常多播通信应用都建立在TCP/IP协议之上,IP地址采用D类地址来支持多播,由特殊的多播路由器来实现。IP多播提供两类服务:1)向多个目的地址传送数据。有许多向多个接收者传送信息的应用:例如交互式会议系统和向多个接收者分发邮件或新闻。如果不采用多播,目前这些应用大多采用TCP来完成(向每个目的地址传送一个单独的数据复制)。然而,即使使用多播,某些应用可能继续采用TCP来保证它的可靠性。

12、2)客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。目前,这项服务是通过广播来提供的,但是使用多播可降低不提供这项服务主机的负担。6 .实验过程:1、启动VisualC+6.0,创建一个控制台项目工程。在此项目工程中添加Sender和Receiver两个项目。Receiver项目实现步骤:(1)、创建一个SOCK_DGRAW的Socket。(2)、将此Socket绑定到本地的一个端口上,为了接收服务器端发送的多播数据。(3)、加入多播组。(4)、接收多播数据。Sender实现步骤:(1)、创建一个SOCK_DGRAW的Socket。(2)、加入多播组。(3)、发送多播数据.2、编译

13、两个项目,在局域网中按如下步骤测试:(1)、将Sender.exe拷贝到发送多播数据的PC上。(2)、将Receiver.exe拷贝到多个要求接收多播数据的PC上.(3)、各自运行相应的程序。(4)、在SenderPC上输入多播数据后,你就可以在ReceiverPC上看到输入的多播数据。实验四1 .实验名称:网络嗅探器2 .实验原理:嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的

14、数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(rawsocket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过

15、ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构.数据包的总体结构:数据包IP头TCP头(或其他信息头)数据数据在从应用层到

16、达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:16位16位源端口目的端口UDPK度UDP校验和而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:16位16位源端口目的端口顺序号确认号TCP头长(保留)7位URGACKPSHRSTSYNFIN窗口大小校验和紧急指针可选项(0或更多的32位字)数据(可选项)对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义:typedefstruct_TCPWORDSrcPort;/源端口WO

17、RDDstPort;/目的端口DWORDSeqNum;/顺序号DWORDAckNum;/确认号BYTEDataOff;/TCP头长BYTEFlags;标志(URGACK等)WORDWindow;/窗口大小WORDChksum;/校验和WORDUrgPtr;/紧急指针TCP;typedefTCP*LPTCP;typedefTCPUNALIGNED*ULPTCP;在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。如果是小端点机,就要在发送和接收时先行转换然后才能进行传

18、输。IP数据段头格式如下:16位16位版本IHL服务类型总长标识标志分段偏移生命期协议头校验和源地址目的地址选项(0或更多)同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义:typedefstruct_IPunionBYTEVersion;/版本BYTEHdrLen;/IHL;BYTEServiceType;/服务类型WORDTotalLen;/总长WORDID;/标识unionWORDFlags;/标志WORDFragOff;/分段偏移;BYTETimeToLive;/生命期BYTEProtocol;/协议WORDHdrChksum;/头校验和DWORD

19、SrcAddr;/源地址DWORDDstAddr;/目的地址BYTEOptions;/选项IP;typedefIP*LPIP;typedefIPUNALIGNED*ULPIP;在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。嗅探器的具体实现根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。由于前面已经将程序的设计流程讲述的比较清楚了,因此这里就不在赘述了,下面就结合注释对程序的具体是实现进行讲解,同时为程

20、序流程的清晰起见,去掉了错误检查等保护性代码。主要代码实现清单为:/检查Winsock版本号,WSAData为WSADATA构对象WSAStartup(MAKEWORD(2,2),&WSAData);/创建原始套接字sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);/设置IP头操作选项,其中flag设置为ture,亲自对IP头进行处理setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);/获取本机名gethostname(char*)LocalName,sizeof(Lo

21、calName)-1);/获取本地IP地址pHost=gethostbyname(char*)LocalName);/填充SOCKADDR_M构addr_in.sin_addr=*(in_addr*)pHost->h_addr_list0;/IPaddr_in.sin_family=AF_INET;addr_in.sin_port=htons(57274);/把原始套接字sock绑定到本地网卡地址上bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in);/dwValue为输入输出参数,为1时执行,0时取消DWORDdwValue=1;/设置SO

22、CK_RAMSIO_RCVALL以便接收所有的IP包。其中SIO_RCVALL/的定义为:#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)ioctlsocket(sock,SIO_RCVALL,&dwValue);前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以了。3 .IP数据报头的结构体:structipheaderunsignedcharip_hl:4;/*headerlength(报头长度)*/unsignedcharip_v:4;/*version(版本)*/unsigned char ip_tos;

23、unsigned short int ip_len;unsigned short int ip_id;unsigned short int ip_off;unsigned char ip_ttl;unsigned char ip_p;unsigned short int ip_sum;unsigned int ip_src;unsigned int ip_dst;4.TCP报头结构体:typedef struct tcpheader unsigned short int sport;unsigned short int dport;unsigned int th_seq;unsigned in

24、t th_ack;unsigned char th_x:4;unsigned char th_off:4;unsigned char Flags;unsigned short int th_win;unsigned short int th_sum;unsigned short int th_urp;TCP_HDR;5.UDP 报头结构体:typedef struct udphdr unsigned short sport;unsigned short dport;unsigned short len;unsigned short cksum;UDP_HDR;5 .变量/*type os se

25、rvice 服务类型 */*total length ( 总长度 )*/*identification ( 标识符 )*/*fragment offset field( 段移位域 )*/*time to live ( 生存时间 )*/*protocol( 协议 )*/*checksum( 校验和 )*/*source address(源地址广/*destination address( 目的地址 )*/* total ip header length: 20 bytes (=160 bits) */*source port ( 源端口号 )*/*destination port( 目的端口号)

26、*/"sequence number(包的序列号)*/*acknowledgement number( 确认应答号)*/*unused(未使用)*/*data offset( 数据偏移量)*/* 标志全 */*windows( 窗口 )*/*checksum( 校验和 )*/*urgent pointer( 紧急指针 )*/*source port( 源端口号 )*/*destination port( 目的端口号)*/*udp length(udp 长度 )*/*udp checksum(udp 校验和 )*/SOCKETsock;/*进行网络通信的套接字*/SOCKETsocke

27、t(intaf,inttype,intprotocol);应用程序调用socket函数来创建一个能够进行网络通信的套接字。*第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个

28、字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。WSADATAwsd;存储被WSAstartup函数调用后返回的Windowssockets数据,即存放windowssocket初始化信息DWORDdwBytesRet;32bit的无符号整数unsignedintoptval=1;unsignedchar*dataudp,*datatcp;inti,pCount=0,lentcp,lenudp;SOCKADDR_INsa,saS

29、ource,saDest;用来指定ip地址和端口信息structhostentFAR*pHostent;主机指针charFARnameMAX_HOSTNAME_LAN;charszSourceIPMAX_ADDR_LEN,szDestIPMAX_ADDR_LEN,RecvBuf655350;structudphdr*pUdpheader;structipheader*pIpheader;structtcpheader*pTcpheader;WSAStartup(MAKEWORD(2,1),&wsd);MAKEWORD(2,1)创建一个被指针变量连接而成的word变量6.过滤规则:if(

30、sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=SOCKET_ERROR)exit(1);gethostname(name,MAX_HOSTNAME_LAN);pHostent=gethostbyname(name);sa.sin_family=AF_INET;sa.sin_port=htons(6000);memcpy(&sa.sin_addr.S_un.S_addr,pHostent->h_addr_list0,pHostent->h_length);bind(sock,(SOCKADDR*)&sa,sizeof(sa);/*bind()设定自己主机的IP地址和端口号*/if(WSAGetLastError()=10013)exit(1);WSAIoctl(sock,SIO_RCVALL,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL);pIpheader=(structipheader*)RecvBuf;pTcpheader=(structtcpheader*)(RecvBuf+sizeof(structipheader);pUdpheader=(structudphdr*)(RecvBuf+sizeof(structiphe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论