还剩13页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
计算机网络课程设计报告姓名:学号:班级指导老师:湖南科技大学计算机科学与工程学院20136年月实验一
1.实验名称网络聊天程序的设计与实现//分段偏移WORD FragOff;;//生命期BYTE TimeToLive;//协议BYTE Protocol;//头校验和WORD HdrChksum;//源地址DWORD SrcAddr;目的地址DWORD DstAddr;////选项BYTE Options;}IP;typedef IP*LPIP;typedef IPUNALIGNED*ULPTP;在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了.嗅探器的具体实现根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、源地址、目标地址、源端IP IP TCP口号、目标端口号以及数据包长度等信息.由于前面已经将程序的设计流程讲述的比较清楚了,TCP因此这里就不在赘述了,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码主要代码实现清单为//检查版本号,为结构对象Winsock WSADataWSADATAWSAStartup MAKEWORD2,2,WSAData;//创建原始套接字sock=socketAF_INET,SOCK_RAW,IPPROTO RAW;//设置头操作选项,其中设置为亲自对头进行处理IP flagture,IPsetsockoptsock,IPPROTO_IP,IPJIDRINCL,char*flag,sizeof flag;//获取本机名gethostname char*LocalName,sizeof LocalName-l;//获取本地地址IPpHost=gethostbyname char*LocalName;//填充结构SOCKADDR_INaddr_in.sin_addr=*in_addr*pHost-h_addr_list
[0];//IPaddr in.sin family=AF INET;addr_in sinport=htons57274;o//把原始套接字绑定到本地网卡地址上sockbind sock,PSOCKADDR addr_in,sizeofaddr_in;为输入输出参数,为时执行,时取消//dwValue10DWORD dwValue=1;//设置为以便接收所有的包其中S0CK_RAW SIO_RCVALL,IP SIO_RCVALL//的定义为#define SIO_RCVALL_WSAI0W I0C_VEND0R,1ioctlsocketsock,SIO_RCVALL,dwValue;前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以了
3.IP数据报头的结构体struct ipheader{报头长度*/unsigned charip_hl:4;/*header length(版本)*//*versionunsigned charip_v:4;unsigned charip_tos;/*type osservice服务类型*/unsigned short int ip_len;(总长度)*//*total lengthunsigned shortint ip_id;(标识符)*//*identificationunsigned shortintip_off;(段移位域)*//*fragment offsetfieldunsigned charunsigned char(生存时间)*//*time toliveip_p;unsigned shortint协议)*//*protocol(ip_sum;unsigned intip_src;(校验和)*//*checksumunsigned intip_dst;源地址)*//*source address()*//*destination address(目的地址)*/
4.TCP报头结构体/*total ipheader length:20bytes(=160bits)typedef struct tcpheader{unsignedshort intsport;unsigned shortintdport;unsigned int th_seq;(源端口号)*/unsigned intth_ack;unsigned char/source port(目的端口号)*/th_x:4;unsigned charth_off:4;/destination portunsigned char Flags;unsigned short/*sequence number(包的序列号)*/intthwin;unsigned shortint(确认应答号)*//*acknowledgement numberth_sum;unsigned shortint(未使用)*//*unusedth_urp;}TCP_HDR;(数据偏移量)*//*data offset
5.UDP报头结构体typedef/*标志全*/struct udphdr{unsigned short(窗口)*//*windowssport;unsigned shortdport;(校验和)*//*checksumunsigned shortlen;unsignedshort紧急指针)*//*urgent pointer(cksum;}UDP_HDR;5o变量(源端口号)*//*source port(目的端口号)*//*destination port长度)*//*udp length(udp校验和)*//*udp checksum(udpSOCKET sock;/*进行网络通信的套接字*/;SOCKET socketint af,int type,int protocol应用程序调用函数来创建一个能够进行网络通信的套接字.*第一个参数指定应用程序使用的socket通信协议的协议族,对于协议族,该参数置TCP/IP AFJNET;第二个参数指定要创建的套接字类型,流套接字类型为数据报套接字类SOCK_STREAM,型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议.该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回套接字描述INVALID.SOCKETo符是一个整数类型的值.每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里WSADATAwsd;存储被函数调用后返回的数据,即存放初始化信息WSAstartup Windowssocketswindows socket的无符号整数DWORD dwBytesRet;32bit;unsigned intoptval=1;unsignedchar*dataudp,*datatcpint i,pCount=0,lentcp,lenudp;用来指定地址和端口信息SOCKADDRJN sa,saSource,saDest;ip主机指针struct hostentFAR*pHostent;char FARname[MAX_HOSTNAME_LAN];二char szSourceIP[MAX_ADDR_LEN],szDestIP[MAX_ADDR_LEN],RecvBuf
[65535]{0};struct udphdr*pUdpheader;struct ipheader*pipheader;struct tcpheader*pTcpheader;WSAStartup MAKEWORD2,1,wsd;创建一个被指针变量连接而成的变量MAKEWORD2,1word6o过滤规则二二二;if socksocketAF_INET,SOCK_RAW,IPPROTOJP SOCKET_ERROR exitlgethostnamename,MAX_HOSTNAME_LAN;pHostent=gethostbyname name;;sa sin_family=AF_INETo二sa sin_port htons6000;o一〉;memcpysa sin_addr.S_un S_addr,pHostent h_addr_list
[0],pHostent-h_length bindsock,SOCKADDRo o设定自己主*sa,sizeof sa;/*bind机的地址和端口号刃IPif WSAGetLastError==10013;exitlWSAIoctlsock,SIO_RCVALL,optval,sizeofoptval,NULL,0,dwBytesRet,NULL,NULL;pipheader=struct ipheader*RecvBuf;;pTcpheader=structtcpheader*RecvBuf+sizeofstruct ipheader;pUdpheader=struct udphdr*RecvBuf+sizeof struct ipheaderwhile1{memsetRecvBuf,0,sizeofRecvBuf;recvsock,RecvBuf,sizeofRecvBuf,0;一saSourceo sin_addr s_addr=pipheader>ip_src;ostrncpyszSourceIP,inet_ntoasaSource.sin_addr,MAX_ADDR_LEN;一〉saDest.sin_addr.s_addr=pipheader ip_dst;strncpy szDestIP,inet_ntoa saDest.sin_addr,MAX_ADDR_LEN;一一lentcp=ntohs pipheader>ip_len sizeof structipheader+sizeofstructtcpheader;一lenudp=ntohsplpheader>ip_len-sizeofstruct ipheader+sizeofstruct udphdr;}实验心得通过本次计算机网络课程设计,我更加充分的理解了课本上的知识,并能够加以扩展,从而应用于实践当中.这几天的课程设计令我受益匪浅,很多平时模棱两可的知识点都认真复习并实践了我对网络编程提升了认识,我意识到我们所学的东西将来都是要付诸实践的,所以一切要从实际情况出发,理论联系实际,这样才能真正发挥我们所具备的能力.还有这次的课程设计我还是遇到了很多的问题的,不过在老师和同学的帮助下,以及自己到网上的查找下,都顺利的解决了我觉得,在学习的过程中,当遇到问题苦思不得其所的时候,千万不要一根筋的非得自己做出来,这时候就是我们锻炼交际能力的时候到了,我们可以问老师,也可以问机房里的同学,,这样我们既解决了问题,又提升了大家的关系,这是一举两得的事情,因此大家千万不要羞于开口.另外,也可以通过上网查询资料来解决问题,一般来说当我遇到问题时我会先记下来,晚上或者问题比较多的时候就到网络上集中查询或求助.这也是行之有效的办法,通过查找资料,对于这些问题的解决办法我印象相当深刻最后我觉得编程这东西就是要多动手,代码这东西一定要自己手打,光看是没有用的,看的懂不一定就打的出来,许多问题是要在打代码,编译的过程时才能发现的还有我觉得学得越多发现自己不懂的东西还真的很多呢,我要加倍努力,争取学更多有用的知识最后真诚感谢老师很同学们的帮助!
2.实验目的通过本实验能够了解socket通信的原理并在此基础上编写一个聊天程序了解TCP/IP的基础知识,发现TCP与UDP的优缺点以及在网络通信的应用3o实验原理从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层当网络的边缘部分中的两个主机使用网络的两个主机使用网络的核心部分进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能,从IP层来说,通信的两端是两个主机,IP数据报的首部明确的标志了这两个主机的IP地址但是严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信.根据应用程序的不同需求,运输层需要有两种不同的运输协议,即是面向连接的TCP和无连接的UDP在使用这两个协议时运输层向高层用户屏蔽了下面的网络核心的细节,它使应用进程看见的就是好像在两个运输层实体间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道.但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道由于我在课程设计中采用的是UDP协议进行通信的,这里就只简述一下一些关于UDP的内容,UDP在传送数据之前不需要先建立连接远地主机的运输层在收到UDP报文后,不需要给出任何确认.虽然UDP不提供可靠的交付,但在某些情况下UDP却是一种最有效的工作方式为此当我们使用UTP协议使两个计算机中的进程要互相通信,不仅必需知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)我们的计算机通信时采用客户一服务器方式客户在发起通信请求时,必需先知道对方的服务器的IP地址和端口号,因此通过IP地址和端口号我们就能将两台主机连接起来,然后通过输入输出流将信息发送到对方的主机上这样就能实现网络的聊天程序.4・流程图.
5.实验步骤通过使用原理我们知道若要实现两主机间的通信最重要的是获得对方的IP地址和设置端口号,在实验中我们假定已经知道了要通信主机的IP地址,故在编程中主要的是套接字socke的编程步骤,在这个程序中,将两个工程添加到一个工作区要链接一个ws2_32,lib的库文件、服务器编程步骤
1、加载数据库,创建套接字2WSAStrartupO/socket;、绑定套接字到一个地址和一个端口上3IP bind;、将套接字设置为监听模式等待请求4listen;、请求到来后,接受链接请求,返回一个新的对应于此次连接的套接字5accept;、用返回的套接字和客户端进行通信6send/rec;、返回,等待另一个请求;
7、关闭套接字,关闭加载的套接字库8closesocket/WSACleanup.、其次是客户端的编程步骤
1、加载数据库,创建套接字2WSAStrartup/socket;、向服务器发送连接请求3connect;、和服务器端进行通信4send/recv;关闭套接字,关闭加载的套接字库closesocket/WSACleanup6实验过程中的问题首先是在编写代码时考虑了是用TCP还是用UDP协议,通过翻看了原来计O算机网络的书后举得利用TCP来编写聊天程序的话,由于TCP协议相对于UDP协议复杂了许多且是面向连接的运输层协议在每次建立与断开连接的时候都要不停的进行确认十分占用网络资源,但UDP就不用那么繁琐,且效率相对的要高出许多但是在代码测试时老师说到作为一个聊天工具重点是信息的交流对于UDP很容易出现丢包的现象,且TCP协议具有很高的可靠性,对于网络的占用也并非想象中的那么严重,故对于编写此类程序还是用TCP的好一些.其次是在编程过程中发现在通信过程中由于端口号只设定一个所以一旦服务器与一台客户端连接时,其他的的客户端就不能与服务器进行连接了,因为先前的客户端占用的端口号通过与老师的交流后知道了,在使用TCP/UDP协议时有两条连接时,突然就有种豁然开朗的感觉.实验二lo实验名称Ping程序上设计与实现
2.实验要求用C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试一个主机到只一个主机之间的连通情况要求独立完成程序的设计、编码和调试1系统利用语言实现,程序调试环境为或2C TurboC VC;按照课程设计规范书写课程设计报告3采用环境进行调试运行4VC
3.实验内容本程序主要分为四个模块功能模块图见图初始化模块,功能控制模块,数据报解读模块,lo1测试模块初始化模块该模块用于定义及初始化各个全局变量,为加载体,Ping winsockwinsock功能控制模块该模块是被其他模块调用,其功能包括解析参数、计算数据报文检验和、清ICMP除包数据以及接受缓冲区数据报解读模块数据报解析模块提供了解读选项和SOCKET,ICMP IP解读报文的功能测试模块该模块是本程序的核心模块,调用其他模块实现其功能,ICMP Ping进而实现的功能Ping
4.流程图:开始输入的地址PING IP解析输入内容,设置参数PING5o实验中遇到的问题及解决方案问题提示库函数名为未标示符?1分析在程序开头只有以下头文件,ftinclude winsock
2.h〉#include(stdio.httinclude stdlib.h)忘记打开〉头文件;(ws2tcpip ho问题提示出现内存错误?2:(oxOOOOOO)分析void DecodelCMPHeader(char*buf,int bytes,SOCKADDR IN*from)动态指针指向错误buf问题连接时所有有关的库函数连接不上?3:winsock分析一定是缺少了某个头文件或没打开动态库,解决办法是在开头加上一下代码#pragmacomment(lib,,zws2_
32.lib〃);实验三
1.实验名称:基于IP多播组的网络会议2实验内容了解IP多播的基本原理,参照局域网IP多播程序,设计一个简易的网络会议程序3实验目的L加深对计算机局域网IP多播工作原理的理解,通过编写计算机程序实现、模拟O其功能,使学生理解并掌握其基本原理及工作过程.
2.提高网络编程和应用的能力.提高实际编程能力和灵活运用所学知识解决问题的能力.
4.实验要求编写一个简易的局域网IP多播网络会议程序,理解IP多播的基本概念和工作原理,程序由Sender和Receiver两个部分组成,Sender用户从控制台上输入多播发送数据,Receiver端都要求加入同一个多播组,完成接收Sender发送的多播数据5o实验原理IP多播技术,也常称为组播通信,它是基于IP层的通信技术是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信采用多播通信技术,不仅可以实现一个发送者和多个接收者之间进行通信的功能,而且可以有效减轻网络通信的负担,避免资源的无谓浪费并不是所有的协议都支持多播通信,通常多播通信应用都建立在TCP/IP协议之上,IP地址采用D类地址来支持多播,由特殊的多播路由器来实现.多播提供两类服务IP向多个目的地址传送数据有许多向多个接收者传送信息的应用例如交互式会议系统和向1)多个接收者分发邮件或新闻如果不采用多播,目前这些应用大多采用来完成(向每个目TCP的地址传送一个单独的数据复制)然而,即使使用多播,某些应用可能继续采用来保证TCP它的可靠性客户对服务器的请求.例如,无盘工作站需要确定启动引导服务器目前,这项服务是通过2)广播来提供的,但是使用多播可降低不提供这项服务主机的负担
6.实验过程、启动创建一个控制台项目工程在此项目工程中添加和两个项1Visual C++60,Sender Receiver目项目实现步骤Receiver、创建一个类型的1SOCK_DGRAM Socketo、将此绑定到本地的一个端口上,为了接收服务器端发送的多播数据2Socket、加入多播组
3、接收多播数据4实现步骤Sender⑴、创建一个类型的SOCK_DGRAM Socket.、加入多播组.
2、发送多播数据
3.编译两个项目,在局域网中按如下步骤测试2将拷贝到发送多播数据的上1>Sender exeP C、将拷贝到多个要求接收多播数据的上2Receiver exeP C、各自运行相应的程序
3、在上输入多播数据后,你就可以在上看到输入的多播数据.4Sender PCReceiver PC实验四lo实验名称网络嗅探器2o实验原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字socket方式来进行但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字来实现的,raw socket这也有别于通常经常使用的数据流套接字和数据报套接字.在创建了原始套接字后,需要通过函数来设置头操作选项,然后再通过函数将原始套接字绑定到本地网卡.setsockoptIP bind为了让原始套接字能接受所有的数据,还需要通过来进行设置,而且还可以指定ioctlsocket是否亲自处理头至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流IP式套接字或数据报套接字那样通过函数来完成.但是与其他两种套接字不同的是,原始recv套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有头、头等信息头的IP TCP最原始的数据信息,这些信息保留了它在网络传输时的原貌.通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析.下面先给出结构.数据包的总体结构数据包头头或其他信息头数据IPTCP数据在从应用层到达传输层时,将添加数据段头,或是数据段头.其中数据段头TCP UDP UDP比较简单,由一个字节的头和数据部分组成,具体格式如下8位位1616源端口目的端口长度校验和UDPUDP而数据头则比较复杂,以个固定字节开始,在固定头后面还可以有一些长度不固定TCP20的可选项,下面给出数据段头的格式组成TCP位位1616源端口目的端口顺序号确认号头长(保留)位窗口大小TCP7URG ACKPSH RSTSYN FIN校验和紧急指针可选项或更多的位字)(032数据(可选项)对于此数据段头的分析在编程实现中可通过数据结构来定义TCP_TCP//源端口typedef struct_TCP{WORD SrcPort;目的端口WORD DstPort;////顺序号DWORD SeqNum;确认号DWORD AckNum;//头长BYTE DataOff;//TCP标志、等)BYTE Flags;//(URG ACK//窗口大小WORD Window;校验和WORD Chksum;//紧急指针WORD UrgPtr;//}TCP;typedef TCP*LPTCP;typedef TCPUNALIGNED*ULPTCP;在网络层,还要给数据包添加一个数据段头以组成数据报数据头以大端点机TCP IP IPIP次序传送,从左到右,版本字段的高位字节先传输是大端点机;是小端点机)(SPARC Pentium如果是小端点机,就要在发送和接收时先行转换然后才能进行传输数据段头格式如下IP位位1616版本服务类型总长IHL标识标志分段偏移生命期协议头校验和源地址目的地址选项或更多)(0同样,在实际编程中也需要通过一个数据结构来表示此数据段头,下面给出此数据结构IP的定义typedef structIP{版本union{BYTE Version;//BYTE HdrLen;//IHL};//服务类型BYTE ServiceType;总长WORD TotalLen;//〃标识WORD ID;//标志union{WORD Flags;。
个人认证
优秀文档
获得点赞 0