吴炜文311351实验报告.docx
- 文档编号:27390205
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:28
- 大小:245.94KB
吴炜文311351实验报告.docx
《吴炜文311351实验报告.docx》由会员分享,可在线阅读,更多相关《吴炜文311351实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
吴炜文311351实验报告
实验报告
课程名称___网络应用编程_______
题目名称基础篇2,5,6章
学生学院___计算机学院_________
专业班级12级网络工程1班
学号3112006351
学生姓名_____吴炜文__________
指导教师孙为军____________
2015年6月24日
实验1IP包流量分析程序
一.实验目的和要求
1.实验目的
IP就是真实流量,是有人真正浏览了您的网站而产生的流量,每台电脑只有一个IP地址,所以一个IP就是一个人,反映在统计上就是独立IP数量,IP是InternetProtocol(因特网协议)的缩写,它是通过计算机网络进行交流的最常用的协议之一。
随着网络技术的飞速发展,链路容量和设备处理能力不断升级,Internet的规模呈爆炸性增长,社会对Internet的依赖性越来越高,随之而来,网络传输的业务类型已从简单的低带宽要求的文件传送、电子邮件等变为数据、语音、视频等大流量业务,并且,业务对可靠性,实时性,安全性传输的要求越来越高。
基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的,通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。
2.实验要求
编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件或用图形表示出来(建议用图形表示出统计结果)。
2.实验环境
操作系统:
Windows7
编译语言:
c++,JAVA
编译环境:
Microsoftvisualc++6.0,Eclispe
3.实验原理
原始实验:
IP数据报的格式说明IP协议都具有什么功能。
其首部,版本目前广泛使用的版本号为4;首部长度站4bit;服务类型占8bit,其中服务类型TOS子域占4位,优先级子域占3位,另一位为保留位;总长度字段为2B,IP数据包的最大长度是65535B;标识占16bit,它是一个计数器,用来产生数据报的标识;标志占3bit,其中最低为为MF,MF=1时为后面“还有分片”,MF=0表示这是数据报片中的最后一个,DF=0时,表示允许分片;片偏移以8个字节为偏移单位;生存时间字段记为TTL,单位为秒;协议段占8bit,用于指出次数据是使用何种协议,典型的协议号有6:
TCP,17:
UDP,1:
ICMP。
本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。
首先,初始化套接字,然后监听数据包,解析数据包。
SOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。
WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。
recv(sock,buffer,65535,0)函数用来接收经过的IP包,其参数分别是套接字描述符,缓冲区的地址,缓冲区的大小。
typedefstructIP_HEAD{}ip_head;用来定义IP头部数据。
setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)函数用来获取本机IP地址。
htons()函数将无符号短整型转换为网络字节顺序的数据。
扩展实验:
使用Winpcap捕获数据包
获取网络设备列表
列出所有网卡,让用户选择需要监视的网卡
以混杂模式打开网卡
编译并设置过滤器
捕获IP数据包
在Eclipse环境下运用JAVA语音编写。
4.实验步骤和结果记录
实验流程图:
结果截图:
显示出5个网卡的信息
选择第五个网卡进行IP包流量分析
5.关键源代码
publicclassTestJpcap{
publicstaticvoidmain(String[]args)throwsIOException{
Scannerconsole=newScanner(System.in);
getDevices();//显示PC机上可用的网卡的信息
System.out.println("请输入网卡号<0-5>");
intnum=console.nextInt();//获取用户要打开的网卡号
System.out.println("请输入抓包时间(分钟)");
intminuets=console.nextInt();//获取用户抓包时间
oneByOneReceiver(num,minuets);//调用抓包方法
获取网络接口列表
publicstaticvoidgetDevices(){
NetworkInterface[]devices=JpcapCaptor.getDeviceList();
for(inti=0;i System.out.println(i+": "+devices[i].name+"(" +devices[i].description+")"); System.out.println("datalink: "+devices[i].datalink_name+"(" +devices[i].datalink_description+")"); System.out.print("MACaddress: "); for(byteb: devices[i].mac_address) System.out.print(Integer.toHexString(b&0xff)+": "); System.out.println(); for(NetworkInterfaceAddressa: devices[i].addresses) System.out.println("address: "+a.address+""+a.subnet +""+a.broadcast); } 使用逐个捕获方法,从网络接口捕获数据包 publicstaticvoidoneByOneReceiver(intindex,inttime)throwsIOException{ NetworkInterface[]devices=JpcapCaptor.getDeviceList(); JpcapCaptorcaptor=JpcapCaptor.openDevice(devices[index],65535, false,20); PrintWriterpw=newPrintWriter(newFileWriter(newFile("packets.txt"))); //设置过滤器 captor.setFilter("ip",true); intcounter=0; Packetpacket; longstartTime=System.currentTimeMillis(); while(startTime+time*60*10>=System.currentTimeMillis()){ packet=captor.getPacket(); System.out.println(packet); if(packet! =null){ Stringips=packet.toString().split("\\s+")[1]; pw.write(ips); pw.println(); counter++; } } pw.close(); CounterPacketscp=newCounterPackets(); cp.readPackets(); cp.print(); System.out.println("PacketNumbers: "+counter); } 6.实验体会 由于对JAVA语言比较熟悉,所以用JAVA语言完成了实验的扩展部分,使用Winpcap捕获了数据包。 查阅了相关资料,了解了IP数据报的各种位与协议的概念和意义,通过解析IP数据包这个实验,基本掌握了用套接字编程来实现获取并解析IP数据包的方法。 实验2Tracert程序 1.实验目的和要求 1、实验目的 1.熟悉原始套接字编程。 2.了解网络的结构。 3.了解网络传输底层协议。 4.熟悉掌握 ICMP协议的工作原理和路由跟踪原理。 5.掌握vc6.0下程序调试、运行的基本方法。 6.通过实验熟悉协议的应用。 2、实验要求 1、通过实验,可以使程序记录并显示了数据报从源端机器传送到目标机器的过程中所经过的路由器的IP地址,并且记录了数据报到达每个路由器所需要的时间。 认真观察到达每个路由器的时间有什么区别,从而熟练掌握tracert的工作原理和ICMP报文协议。 2、当我们不能通过网络访问目的设备时,网络管理员就需要判断是哪里出了问题。 问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。 2.实验环境 操作系统: Windows7 编译语言: c++ 编译环境: Microsoftvisualc++6.0 3.实验原理 路由是把信息从源穿过网络传递到目的地的行为,在传输过程中,遇到一系列的中间节点。 这些中间节点构成了路由跟踪的依据。 路由跟踪是在路由的基础上提出的问题,是利用路由跟踪实用程序于确定IP数据报访问目标所采取的路径。 当我们不能通过网络访问目的设备时,网络运行者就需要判断是哪里出了问题。 问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。 解决方法是了解了IP数据报访问目标所采取的路径,将发现网络布网简单拓扑,确定路由断点即可解决网络故障。 操作系统中的tracert或traceroute路由跟踪程序,通过它可以查看到达目标地址所经过的路径。 它的作用与ping有类似之处使用ping可以检查是否连接,如果不通,一般不好准确判断哪一个节点出错,而使用tracert则可以准确判断出错的部分。 系统实现路由的跟踪,每经过一个路由,要求得到经过该路由节点的地址,也就是说输入目标信息,可以得到本地主机到目标经过的所有中间节点。 这些中间节点用IP地址标识。 并要求对跟踪跳数,每一跳等待时间可控。 为了让系统更加完善,首先要测试目标的连通性,系统中也要实现目标探测功能,即Ping功能。 当数据报从你的计算机经过多个网关传送到目的地时,Tracert命令可以用来跟踪数据报使用的路由(路径)。 该实用程序跟踪的路径是源计算机到目的地的一条路径,不能保证或认为数据报总遵循这个路径。 Tracert是一个运行得比较慢的命令(如果你指定的目标地址比较远),每个路由器你大约需要给它15秒钟。 Tracert使用时只需要在tracert后面跟一个IP地址或URL,Tracert会进行相应的域名转换,Tracert一般用来检测故障的位置,你可以用tracertIP在哪个环节上出了问题,虽然还是没有确定是什么问题,但它已经告诉了我们问题所在的地方。 4.实验步骤和结果记录 程序流程图: 开始 初始化WINSOCK2环境 解析命令行参数中的IP地址或主机名 目的主机回应答或达到最大跳站值? Y TTL++ N 填充ICMP回显请求数据报并发送 有数据报到达? 是预期数据报? NY N 超时,打印星号 解析并显示输出 Y 释放各种资源打印结束信息 结束 结果截图: 5.关键源代码 初始化winsock2环境: WSADATAwsa; if(WSAStartup(MAKEWORD(2,2),&wsa)! =0) { cerr<<"\nFailedtoinitializetheWinSock2DLL\n" <<"errorcode: "< return-1; } 探测路由: DECODE_RESULTstDecodeResult; BOOLbReachDestHost=FALSE; USHORTusSeqNo=0; intiTTL=1; intiMaxHop=DEF_MAX_HOP; while(! bReachDestHost&&iMaxHop--) { //设置IP数据报头的ttl字段 setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char*)&iTTL,sizeof(iTTL)); //输出当前跳站数作为路由信息序号 cout< //填充ICMP数据报剩余字段 ((ICMP_HEADER*)IcmpSendBuf)->cksum=0; ((ICMP_HEADER*)IcmpSendBuf)->seq=htons(usSeqNo++); ((ICMP_HEADER*)IcmpSendBuf)->cksum=GenerateChecksum((USHORT*)IcmpSendBuf,sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE); //记录序列号和当前时间 stDecodeResult.usSeqNo=((ICMP_HEADER*)IcmpSendBuf)->seq; stDecodeResult.dwRoundTripTime=GetTickCount(); //发送ICMP的EchoRequest数据报 if(sendto(sockRaw,IcmpSendBuf,sizeof(IcmpSendBuf),0, (sockaddr*)&destSockAddr,sizeof(destSockAddr))==SOCKET_ERROR) { //如果目的主机不可达则直接退出 if(WSAGetLastError()==WSAEHOSTUNREACH) cout<<'\t'<<"Destinationhostunreachable.\n" <<"\nTracecomplete.\n"< closesocket(sockRaw); WSACleanup(); return0; } 解码得到的数据报: BOOLDecodeIcmpResponse(char*pBuf,intiPacketSize,DECODE_RESULT&stDecodeResult) { //检查数据报大小的合法性 IP_HEADER*pIpHdr=(IP_HEADER*)pBuf; intiIpHdrLen=pIpHdr->hdr_len*4; if(iPacketSize<(int)(iIpHdrLen+sizeof(ICMP_HEADER))) returnFALSE; //按照ICMP包类型检查id字段和序列号以确定是否是程序应接收的Icmp包 ICMP_HEADER*pIcmpHdr=(ICMP_HEADER*)(pBuf+iIpHdrLen); USHORTusID,usSquNo; if(pIcmpHdr->type==ICMP_ECHO_REPLY) { usID=pIcmpHdr->id; usSquNo=pIcmpHdr->seq; } elseif(pIcmpHdr->type==ICMP_TIMEOUT) { char*pInnerIpHdr=pBuf+iIpHdrLen+sizeof(ICMP_HEADER);//载荷中的IP头 intiInnerIPHdrLen=((IP_HEADER*)pInnerIpHdr)->hdr_len*4;//载荷中的IP头长 ICMP_HEADER*pInnerIcmpHdr=(ICMP_HEADER*)(pInnerIpHdr+iInnerIPHdrLen);//载荷中的ICMP头 usID=pInnerIcmpHdr->id; usSquNo=pInnerIcmpHdr->seq; } else returnFALSE; 六.实验体会 搞了一天,晕的要死. 实验3WebServer程序 一、实验目的和要求 实验目的: 了解WebServer的工作流程,理解超文本传输协议(HTTP)的基本原理与认证机制,掌握Windows下使用Socket实现C/S结构程序的编程方法。 实验要求: 实现一个简单的WebServer,能够响应客户端的请求将指定目录下的HTML或text文件通过指定的TCP端口发送给客户端。 具体要求如下: 1)在Windows平台实现,要求使用图形界面显示Server的各种信息。 2)Server启动时可指定服务端口,默认为8000。 3)可指定WebServer的根目录。 4)Server应能够并发处理多个请求,要求至少能支持Get命令。 鼓励增强Weberver的功能,如支持Head、Post以及Delete等命令。 5)统计WebServer接收和发送的流量。 6)不允许使用已有的HTTP库 二、实验环境 1.Windows 2.VisualC++ 三、 实验原理 Web浏览器和Web服务器之间使用HTTP协议进行通信。 HTTP请求/响应的步骤: 1)链接至Web服务器 2)发送HTTP请求 3)服务器接受请求并返回HTTP响应 4)HTTP服务器告知TCP关闭这个TCP连接 5)HTTP客户接收这个响应消息 HTTP/1.1的改进: 1)持久连接 2)新增加集中资源请求 3)身份认证 4)支持缓存 5)支持块编码 6)内容协商 7)高效使用IP地址 四、实验步骤和结果记录 WebServer可以分成两个组成的模块: 客户端请求处理模块和响应生成发送模块。 其中,客户请求处理模块的任务就是负责接收客户的连接,它监听系统的端口,以获取客户机到达本服务器的连接,在程序中线程ListenThread实现该部分功能。 当获取一个连接请求时,就为该链接建立一个客户请求处理线程来处理这个请求,该处理线程就是响应生成发送模块。 响应生成发送模块负责分析请求中的各个协议参数,根据客户请求的分析结果查找资源,生成响应和发送响应,在程序中线程ClientThread实现该部分功能。 程序流程图: 实验截图: 五、关键源代码 1.客户请求处理模块的实现 在接收客户请求之前,首先应该创建套接字,在某一特定端口侦听客户端的请求。 实现该部分功能的代码如下: boolCHttpProtocol: : StartHttpSrv() { WORDwVersionRequested=WINSOCK_VERSION; WSADATAwsaData; intnRet; //启动Winsock nRet=WSAStartup(wVersionRequested,&wsaData);//加载成功返回0 if(nRet) { //错误处理 AfxMessageBox("InitializeWinSockFailed"); returnfalse; } //检测版本 if(wsaData.wVersion! =wVersionRequested) { //错误处理 AfxMessageBox("WrongWinSockVersion"); returnfalse; } m_hExit=CreateEvent(NULL,TRUE,FALSE,NULL); if(m_hExit==NULL) { returnfalse; } //创建套接字 m_listenSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED); if(m_listenSocket==INVALID_SOCKET) { //异常处理 CString*pStr=newCString; *pStr="Couldnotcreatelistensocket"; SendMessage(m_hwndDlg,LOG_MSG,(UINT)pStr,NULL); returnfalse; } SOCKADDR_INsockAddr; LPSERVENTlpServEnt; if(m_nPort! =0) { //从主机字节顺序转为网络字节顺序赋给sin_port sockAddr.sin_port=htons(m_nPort); } else { //获取已知http服务的端口,该服务在tcp协议下注册 lpServEnt=getservbyname("http","tcp"); if(lpServEnt! =NULL) { sockAddr.sin_port=lpServEnt->s_port; } else { sockAddr.sin_port=htons(HTTPPORT);//默认端口HTTPPORT=80 } } sockAddr.sin_family=AF_INET; sockAddr.sin_addr.s_addr=INADDR_ANY;//指定端口号上面的默认IP接口 //初始化content-type和文件后缀对应关系的map CreateTypeMap(); //套接字绑定 nRet=bind(m_listenSocket,(LPSOCKADDR)&sockAddr,sizeof(structsockaddr)); if(nRet==
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 吴炜文 311351 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)