《网络及其计算》实验指导书精选_第1页
《网络及其计算》实验指导书精选_第2页
《网络及其计算》实验指导书精选_第3页
《网络及其计算》实验指导书精选_第4页
《网络及其计算》实验指导书精选_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

计算机网络实验指导书网络技术基础实验中心编著

实验一网络命令使用1实验二FTP站点构建及操作5实验三交换机配置实验7实验四路由器配置实验(静态路由)13实验五路由器配置实验(动态路由)16实验六NAT配置27实验七协议数据分析31实验八SOCKET编程实现Client/Server通信程序32图4图SEQ图\*ARABIC4BosonNetsim实验主窗口过以下命令集配置各设备(各设备的IP设置要求如REF_Ref122358127\h图5)图SEQ图\*ARABIC5实验中各设备的IP设置要求以下一行即为一个命令,”//”后为注释,不要作为命令输入R1的配置命令集:enable//进入特权模式configt//进入配置状态hostnameR1//改名为R1interfacee0//选择以太网接口0进行配置ipaddress//配置IP地址及子网掩码ipnatinside//启动NAT转换功能,作为内侧noshut//启动该接口interfaces0ipaddressclockrate64000//设置波特率为64000ipnatoutsidenoshutipnatinsidesourcestatic00//将//映射为00routerRIP//启动该路由器的RIP协议network//设置R1的初始路由表,即直连着这个网段network//设置R1的初始路由表,即直连着这个网段R2的配置命令集:enable//进入特权模式config//进入配置状态hostnameR2//改名为R1interfacee0//选择以太网接口0进行配置ipaddress//配置IP地址及子网掩码noshut//启动该接口interfaces0ipaddressclockrate64000//设置波特率为64000noshutrouterRIP//启动该路由器的RIP协议network//设置R1的初始路由表,即直连着这个网段network//设置R1的初始路由表,即直连着这个网段//在向下配置之前请想一想RIP协议的工作原理是什么,这样配置有什么意义HostA的配置命令集:ipconfig/ip//设置主机的IP地址与子网掩码ipconfig/dg//设置默认网关为R1HostB的配置命令集:ipconfig/ip//设置主机的IP地址与子网掩码ipconfig/dg//设置默认网关为R1测试A、B、R1、R2相互之间的连通性切换到主机Aping//ping主机B的IP切换到主机Bping00//ping主机A的NAT转换后的地址

实验七协议数据分析实验目的了解协议分析仪的使用方法和基本特点。增强对网络协议的理解。实验要求要求在进行协议数据分析后,能够将网络数据与具体的网络操作相互映证,如实的记录实验结果,完成实验实验环境1.一台运行Windows2000的计算机2.各计算机已通过网卡、双绞线、集线器实现网络硬件连接。预备知识在通常状态下,计算机的网卡只会接收目的地址与网卡的MAC地址相同的帧、广播帧或组播帧,但将网卡的工作模式设置为混杂模式时,网卡会接收所有到达的帧,Ethereal软件就是将网卡的工作模式设置为混杂模式,尽可能多的捕获网络数据,并能对每一个网络数据包进行分析的工具软件。实验步骤1.从现有的网络数据中捕获网络数据,针对一个数据包并从不同的网络层次(帧、IP数据报、TCP段、HTTP协议数据等)来分析网络数据,记录每个层次协议数据的每个字段的值;2.使用ping命令产生网络数据,并对数据进行分析,记录一个ARP请求消息分析结果及对应响应消息分析结果,记录一个回声请求数据的分析结果和一个响应数据的分析结果。3.使用tracert命令产生网络数据,并对数据进行分析,记录关键的数据特征,并做出解释。4.用浏览器浏览某个网站(比如:,),查看捕获的数据,记录这次访问产生的网络数据(只记录每个数据包是什么数据包),注意它们的次序,给出简单的解释。参考文献KennethD.Reed著,孙坦等译.协议分析[M].北京:电子工业出版社,2002.谢鲲,张大方.共享网段网络协议分析系统设计与实现[J].计算机工程与科学,2002.24(2).福禄克公司关于协议分析(测试)仪的网站./Ethereal分析仪网站.

实验八SOCKET编程实现Client/Server程序实验目的1.掌握网络应用程序的开发方法;2.掌握Client/Server结构软件的设计与开发方法3.掌握Socket机制的工作原理实验要求1.使用VC++,利用套接字技术编写一个简单的通信程序。2.分析调试程序,了解VC++的特点,套接字的特性3.记录调试分析的全过程,加深对套接字的理解实验预备知识1、客户机/服务器模式在网络中最常用的通信模式是客户机/服务器模式(Client/Server模式或C/S模式)。服务器方要先启动,并监听指定端口,等待客户端的请求,根据客户端的请求提供相应服务。2、基本套接字一般来说,要进行网络通信,必须要在网络的每一端都要建立一个套接字,两个套接字之间是可以建立连接的,也是可以无连接的,并通过对套接字的“读”、“写”操作实现网络通信功能。类似于文件的打开、读、写、关闭的方式。套接字有三种类型:数据流套接字(SOCK_STREAM):对应TCP协议。数据报套接字(SOCK_DGRAM):对应UDP协议。原始套接字(SOCK_RAW)。通过使用原始套接字,可以将网卡设为混杂模式。并且可以捕获到的数据包不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌,通过对这些在低层传输的原始信息的分析可以得到更多网络的信息。一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)3、基本套接字系统调用为了更好地说明套接字编程原理,下面给出几个基本套接字系统调用说明。a.创建套接字──socket()应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:SOCKETPASCALFARsocket(intaf,inttype,intprotocol);参数af:指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是互连网区域。参数type:描述要建立的套接字的类型。参数protocol:说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的协议。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。socket()系统调用实际上指定了相关五元组中的“协议”这一元。b.指定本地地址──bind()将本地主机地址和本地端口与所创建的套接字号联系起来,其调用格式如下:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数s:是由socket()调用返回的套接字描述符(套接字号)。参数name:是赋给套接字s的本地地址,其长度可变,结构随通信域的不同而不同,TCP/IP协议使用的地址结构如下:structsockaddr_in{shortsin_family;/*AF_INET*/u_shortsin_port;/*16位端口号,网络字节顺序*/structin_addrsin_addr;/*32位IP地址,网络字节顺序*/charsin_zero[8];/*保留*/}网络字节顺序:不同的计算机存放多字节值的顺序不同,有的机器在起始地址先存放低位字节,有的先存高位字节。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,它们均含在协议头文件中。参数namelen:表明了name的长度。如果没有错误发生,bind()返回0。否则返回值SOCKET_ERROR。c.建立套接字连接──connect()与accept()connect()用于建立连接。无连接的套接字进程也可以调用connect(),这样就不必每次都指定目的地址。而accept()用于使服务器等待来自某客户进程的实际连接。intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数s:是欲建立连接的本地套接字描述符。参数name:为指向对方套接字地址结构的指针。参数namelen:对方套接字地址结构长度。如果没有错误发生,connect()返回0。否则返回值SOCKET_ERROR。SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);参数s:为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。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()以获得一个唯一的地址。d.监听连接──listen()此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:intPASCALFARlisten(SOCKETs,intbacklog);参数s:标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。Backlog:表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。e.数据传输──send()与recv()当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);参数s:为已连接的本地套接字描述符。buf:指向存有发送数据的缓冲区的指针,其长度由len指定。Flags:指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);参数s:为已连接的套接字描述符。Buf:指向接收输入数据缓冲区的指针,其长度由len指定。Flags:指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。**Flags参数可以是0或者是以下的组合:MSG_DONTROUTE:不查找路由表。是send函数使用的标志,这个标志告诉IP协议,目的主机在本地网络上面,没有必要查找路由表。MSG_OOB:表示可以接收和发送带外的数据。MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清除系统缓冲区的内容。这样下次读的时候,仍然是一样的内容。一般在有多个进程读写数据时可以使用这个标志。MSG_WAITAL:是recv函数的使用标志,表示等到所有的信息到达时才返回。使用这个标志的时候recv会一直阻塞,直到指定的条件满足,或者是发生了错误。1)当读到了指定的字节时,函数正常返回,返回值等于len。2)当读到了文件的结尾时,函数正常返回,返回值小于len。3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)。f.数据传输——sendto()与recvfrom()Sendto()用于在无连接套接字上发送消息。Recvfrom()可以记录发送者的地址,该地址与sendto所指定的地址结构完全相同。intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,structsockaddr*to,inttolen)intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen)sockfd:表示套接字描述符。buf:发送或接收的缓冲区。len:缓冲区及大小。recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL。sendto负责向to发送信息,此时在to里面存储了接收信息方的详细信息。g.数据传输——recvmsg()和sendmsg()recvmsg和sendmsg的功能类似于recvfrom和sendto,只不过将一些信息放入了一个结构中。intrecvmsg(intsockfd,structmsghdr*msg,intflags)intsendmsg(intsockfd,structmsghdr*msg,intflags)structmsghdr{void*msg_name;intmsg_namelen;structiovec*msg_iov;intmsg_iovlen;void*msg_control;intmsg_controllen;intmsg_flags;}structiovec{void*iov_base;/*缓冲区开始的地址*/size_tiov_len;/*缓冲区的长度*/}msg_name和msg_namelen当套接字是非面向连接时(UDP),它们存储接收和发送方的地址信息。msg_name实际上是一个指向structsockaddr的指针,msg_name是结构的长度。当套接字是面向连接时,这两个值应设为NULL.msg_iov和msg_iovlen指出接受和发送的缓冲区内容。msg_iov是一个结构指针,msg_iovlen指出这个结构数组的大小。msg_control和msg_controllen这两个变量是用来接收和发送控制数据时的msg_flags指定接受和发送的操作选项,和recv,send的选项一样。h.关闭套接字──closesocket()与Shutdown()closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。closesocket()的调用格式如下:BOOLPASCALFARclosesocket(SOCKETs);参数s:待关闭的套接字描述符。如果没有错误发生,closesocket()返回0。否则返回值SOCKET_ERROR。intshutdown(intsockfd,inthowto)TCP连接是双向的(是可读写的),当我们使用close时,会把读写通道都关闭,有时侯我们希望只关闭一个方向,这个时候我们可以使用shutdown。针对不同的howto,系统回采取不同的关闭方式.howto=0这个时候系统会关闭读通道,但是可以继续写。howto=1关闭写通道,但是可以继续读。howto=2关闭读写通道。i.输入/输出多路复用──select()select()调用用来检测一个或多个套接字的状态。对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。请求给定状态的套接字集合由一个fd_set结构指示。在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时,select()调用返回满足条件的套接字的数目,其调用格式如下:intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);参数nfds:指明被检查的套接字描述符的值域,此变量一般被忽略。参数readfds:指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据。参数writefds:指向要做写检测的套接字描述符集合的指针。Exceptfds:指向要检测是否出错的套接字描述符集合的指针。Timeout:指向select()函数等待的最大时间,如果设为NULL则为阻塞操作。select()返回包含在fd_set结构中已准备好的套接字描述符的总数目,或者是发生错误则返回SOCKET_ERROR。4、数据转换和网络信息函数a、字节顺序转换函数在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的,比如i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反。为了统一起来,有专门的字节顺序转换函数。unsignedlonginthtonl(unsignedlonginthostlong)unsignedshortinthtons(unisgnedshortinthostshort)unsignedlongintntohl(unsignedlongintnetlong)unsignedshortintntohs(unsignedshortintnetshort)在这四个转换函数中,h代表host,n代表network。s代表short,l代表long,第一个函数的意义是将本机器上的long数据转化为网络上的long,其它几个函数的意义类似。b、IP和域名的转换在网络上标志一台机器可以用IP或者是用域名,那么怎么进行转换呢?structhostent*gethostbyname(constchar*hostname)structhostent*gethostbyaddr(constchar*addr,intlen,inttype)在中有structhostent的定义structhostent{char*h_name;/*主机的正式名称*/char*h_aliases;/*主机的别名*/inth_addrtype;/*主机的地址类型AF_INET*/inth_length;/*主机的地址长度对于IP4是4字节32位*/char**h_addr_list;/*主机的IP地址列表*/}#defineh_addrh_addr_list[0]/*主机的第一个IP地址*/gethostbyname可以将机器名(如)转换为一个结构指针.在这个结构里面储存了域名的信息gethostbyaddr可以将一个32位的IP地址(C0A80001)转换为结构指针.这两个函数失败时返回NULL且设置h_errno错误变量,调用h_strerror()可以得到详细的出错信息c、字符串的IP和32位的IP转换.在网络上面IP地址都用点分十进制数字表示(如:),而在structin_addr结构中用的是32位的IP,为了转换我们可以使用下面两个函数:intinet_aton(constchar*cp,structin_addr*inp)char*inet_ntoa(structin_addrin)函数里面a代表ascii,n代表network。第一个函数表示将a.b.c.d的IP转换为32位的IP,,存储在inp指针里面。第二个是将32位IP转换为a.b.c.d的格式。d、服务信息函数在网络程序里面我们有时候需要知道端口、IP和服务信息,这个时候可以使用以下几个函数intgetsockname(intsockfd,structsockaddr*localaddr,int*addrlen)intgetpeername(intsockfd,structsockaddr*peeraddr,int*addrlen)structservent*getservbyname(constchar*servname,constchar*protoname)structservent*getservbyport(intport,constchar*protoname)structservent{char*s_name;/*正式服务名*/char**s_aliases;/*别名列表*/ints_port;/*端口号*/char*s_proto;/*使用的协议*/}5、典型调用时序图a.面向连接的套接字的系统调用时序图

无连接协议的套接字调用时序图6、面向连接示例程序a.VC++Socket编程简单的Tcp/ip服务器#include<windows.h>#include<iostream.h>#include<winsock.h>#defineNO_FLAGS_SET0#definePORT(u_short)44965#defineMAXBUFLEN256INTmain(VOID){WSADATAData;SOCKADDR_INserverSockAddr;SOCKADDR_INclientSockAddr;SOCKETserverSocket;SOCKETclientSocket;intaddrLen=sizeof(SOCKADDR_IN);intstatus;intnumrcv;charbuffer[MAXBUFLEN];/*initializetheWindowsSocketDLL*/status=WSAStartup(MAKEWORD(1,1),&Data);/*初始化WinsockDLLif(status!=0)cerr<<"ERROR:WSAStartupunsuccessful"<<endl;/*zerothesockaddr_instructure*/memset(&serverSockAddr,0,sizeof(serverSockAddr));/*specifytheportportionoftheaddress*/serverSockAddr.sin_port=htons(PORT);/*specifytheaddressfamilyasInternet*/serverSockAddr.sin_family=AF_INET;/*specifythattheaddressdoesnotmatter*//*INADDR_ANY的具体含义是,绑定到。此时,对所有的地址都将是有效的serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);/*createasocket*/serverSocket=socket(AF_INET,SOCK_STREAM,0);if(serverSocket==INVALID_SOCKET)cerr<<"ERROR:socketunsuccessful"<<endl;/*associatethesocketwiththeaddress*/status=bind(serverSocket,(LPSOCKADDR)&serverSockAddr,sizeof(serverSockAddr));if(status==SOCKET_ERROR)cerr<<"ERROR:bindunsuccessful"<<endl;/*allowthesockettotakeconnections*/status=listen(serverSocket,1);if(status==SOCKET_ERROR)cerr<<"ERROR:listenunsuccessful"<<endl;/*accepttheconnectionrequestwhenoneisreceived*/clientSocket=accept(serverSocket,(LPSOCKADDR)&clientSockAddr,&addrLen);cout<<"Gottheconnection..."<<endl;while(1){numrcv=recv(clientSocket,buffer,MAXBUFLEN,NO_FLAGS_SET);if((numrcv==0)||(numrcv==SOCKET_ERROR)){cout<<"Connectionterminated."<<endl;status=closesocket(clientSocket);if(status==SOCKET_ERROR)cerr<<"ERROR:closesocketunsuccessful"<<endl;status=WSACleanup();if(status==SOCKET_ERROR)cerr<<"ERROR:WSACleanupunsuccessful"<<endl;return(1);}cout<<buffer<<endl;}/*while*/b.VC++Socket编程简单的Tcp/ip客户端#include<windows.h>#include<iostream.h>#include<winsock.h>#defineNO_FLAGS_SET0#definePORT(u_short)44965#defineDEST_IP_ADDR"58"//ServeraddressINTmain(VOID){WSADATAData;SOCKADDR_INdestSockAddr;SOCKETdestSocket;unsignedlongdestAddr;intstatus;intnumsnt;char*toSendtxt="TestString";/*initializetheWindowsSocketDLL*/status=WSAStartup(MAKEWORD(1,1),&Data);if(status!=0)cerr<<"ERROR:WSAStartupunsuccessful"<<endl;/*convertIPaddressintoin_addrform*/destAddr=inet_addr(DEST_IP_ADDR);/*copydestAddrintosockaddr_instructure*/memcpy(&destSockAddr.sin_addr,&destAddr,sizeof(destAddr));/*specifytheportportionoftheaddress*/destSockAddr.sin_port=htons(PORT);/*specifytheaddressfamilyasInternet*/destSockAddr.sin_family=AF_INET;/*createasocket*/destSocket=socket(AF_INET,SOCK_STREAM,0

温馨提示

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

评论

0/150

提交评论