解析IP数据包实验报告讲解

合集下载

大作业2:IP包的截获和解析

大作业2:IP包的截获和解析
目ຫໍສະໝຸດ IP地址选项填充域
数据部分
IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本。本程序主要针对版本是IPV4的数据包的解析。
报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的。因此,IP数据包的头长度在20—40B之间,是可变的。
u_char SrcMAC[6]; /* source HW addresss */
u_char Ethertype; /* ethernet type */
} DLCHEADER;
2、IP数据报格式
0 4 8 16 19 24 31
版本
报头标长
服务类型
总长度
标识
标志
片偏移
生存时间
协议
头校验和
源IP地址
三.主要数据结构
各种包头部、IP地址等的结构体定义在Header.h中。
1、以太网帧格式
因此,以太网帧头部的数据结构定义为:
typedef struct tagDLCHeader /*以太网数据帧头部结构*/
{
u_char DesMAC[6]; /* destination HW addrress */
目前,IPv4的报头结构为常用的ICMP报文包括ECHO-REQUEST(响应请求消息)、ECHO-REPLY(响应应答消息)、Destination Unreachable(目标不可到达消息)、Time Exceeded(超时消息)、Parameter Problems(参数错误消息)、Source Quenchs(源抑制消息)、Redirects(重定向消息)、Timestamps(时间戳消息)、Timestamp Replies(时间戳响应消息)、Address Masks(地址掩码请求消息)、Address Mask Replies(地址掩码响应消息)等,是Internet上十分重要的消息。后面章节中所涉及到的ping命令、ICMP拒绝服务攻击、路由欺骗都与ICMP协议息息相关。

实验四-ICMP数据报和IP数据报分片分析实验报告

实验四-ICMP数据报和IP数据报分片分析实验报告

实验四ICMP 协议和IP 数据报分片分析【实验目的】1. 理解 ICMP 协议报文类型和格式;2. 理解 ping 命令的工作原理;3. 理解 traceroute 的工作原理;4. 理解 IP 协议报文类型和格式。

【实验环境】与因特网连接的电脑,操作系统为Windows,安装有Wireshark、IE 等软件。

【实验内容】1. 使用 wireshark 抓包软件分析ICMP 协议报文的类型;2. 分析 ping 命令的工作原理;3. 分析 tracert 命令的工作原理;4. 使用 wireshark 抓包软件分析IP 协议报文以及报文分片。

【实验步骤】1. 分析ICMP 协议步骤1:在 PC1 运行 Wireshark,开始截获报文,为了只截获和实验内容有关的报文,将Wireshark 的 Captrue Filter 设置为“No Broadcast and no Multicast”;步骤2:在 PC1 以 baidu 为目标主机,在命令行窗口执行 Ping 命令,要求ping 通8 次;【答】:Ping 命令为:____ ping –n 8 baidu ____将命令行窗口进行截图:【答】:步骤3:停止截获报文,分析截获的结果,答复以下问题:〔1〕将抓包结果进行截图〔要求只显示 ping 的数据包〕:〔2〕截获的 ICMP 报文有几种类型?分别是:【答】:两种:8(Echo〔ping〕 request) 、 0(Echo (ping) reply )〔3〕分析截获的 ICMP 报文,按下表要求,将各字段信息填入表中,要求填写前4 个报文的信息。

〔4〕查看ping 请求信息,ICMP 的type是 ___Echo〔ping〕 request___。

和code是 __8__。

并截图。

〔5〕查看相应得ICMP 响应信息,ICMP 的type 是___Echo〔ping〕 reply___和code 是 __0__。

TCPIP实验之IP数据包分析--

TCPIP实验之IP数据包分析--

TCP/IP协议与编程实验姓名:班级:学号:实验题目用Wireshark抓包分析ip数据包一、实验目的1、了解并会初步使用Wireshark,能在所用电脑上进行抓包2、了解IP数据包格式,能应用该软件分析数据包格式3、查看一个抓到的包的内容,并分析对应的IP数据包格式二、实验内容Wireshark 是网络包分析工具。

网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。

实验步骤:1、打开wireshark,选择接口选项列表。

或单击“Capture”,配置“option”选项。

2、设置完成后,点击“start”开始抓包:3、显示结果:3、选择某一行抓包结果,双击查看此数据包具体结构。

4、捕捉IP数据报。

① 写出IP数据报的格式。

IP数据报首部的固定部分中的各字段含义如下:(1)版本占4位,指IP协议的版本。

通信双方使用的IP协议版本必须一致。

目前广泛使用的IP协议版本号为4(即IPv4)。

(2)首部长度占4位,可表示的最大十进制数值是15。

请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。

当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。

因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。

首部长度限制为60 字节的缺点是有时可能不够用。

但这样做是希望用户尽量减少开销。

最常用的首部3)区分服务占8位,用来获得更好的服务。

这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。

1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。

只有在使用区分服务时,这个字段才起作用。

(4)总长度总长度指首部和数据之和的长度,单位为字节。

总长度字段为16位,因此数据报的最大长度为216-1=65535字节。

长度就是20字节(即首部长度为0101),这时不使用任何选项。

IP数据报文分析

IP数据报文分析
计算机科学与技术学院实验报告(电子版)
课程:TCP/IP协议分析
实验名称
IP数据包格式
指导老师
姓名
学号
班级
实验地点
实验日期
成绩
一、实验内容:
抓取IP数据包进行分析
二、实验目的:
熟悉ip数据包的格式。
分析iP数据包
三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况):
Windows系统抓包软件
四、程序清单与测试数据:
08 00:协议类型
45:4代表版本号IPV4,5代表首部长度。当前为标准IP头4*5=20
00:服务类型
00 3C :IP数据包总长度
04 5A:标识
00 00:标志+片偏移
80:生存时间
01:ICMP协议
8ห้องสมุดไป่ตู้ 25 :首部校验和
C0 A8 21 04:源IP地址
C0 A806ED:目的IP地址
2、IP数据包分片:
五、实验结果、分析、体会等:
简单的了解ip报文格式,对ip数据报有了更进一步的认识。
执行ping命令:
图4-1
抓取数据包:
图4-2
图4-3
图4-4
图4-5
图4-6
图4-3、图4-4、图4-5和图4-6为IP分片包,标识为7e ca,图4-3、图4-4与图4-5标志为001,DF位为0,代表分片。MF为1,代表后面有分片。图4-5标志为000,DF位为0,代表分片。MF为0,代表最后一个分片
一、IP数据包分析:
1、IP数据包格式:
图1-1
本机信息:
图2-1
IP:192.168.33.4MAC:8C-89-A5-3B-90-4B

arp,ip,icmp协议数据包捕获分析实验报告数据

arp,ip,icmp协议数据包捕获分析实验报告数据

arp,ip,icmp协议数据包捕获分析实验报告数据篇一:网络协议分析实验报告实验报告课程名称计算机网络实验名称网络协议分析系别专业班级指导教师学号姓名实验成绩一、实验目的掌握常用的抓包软件,了解ARP、ICMP、IP、TCP、UDP 协议的结构。

二、实验环境1.虚拟机(VMWare或Microsoft Virtual PC)、Windows XX Server。

客户机A客户机B2.实验室局域网,WindowsXP三、实验学时2学时,必做实验。

四、实验内容注意:若是实验环境1,则配置客户机A的IP地址:/24,X为学生座号;另一台客户机B的IP地址:(X+100)。

在客户机A上安装EtherPeek(或者sniffer pro)协议分析软件。

若是实验环境2则根据当前主机A的地址,找一台当前在线主机B完成。

1、从客户机A ping客户机B ,利用EtherPeek(或者sniffer pro)协议分析软件抓包,分析ARP 协议;2、从客户机A ping客户机B,利用EtherPeek(或者sniffer pro)协议分析软件抓包,分析icmp协议和ip协议;3、客户机A上访问,利用E(转载于: 小龙文档网:arp,ip,icmp协议数据包捕获分析实验报告数据)therPeek(或者sniffer pro)协议分析软件抓包,分析TCP和UDP 协议;五、实验步骤和截图(并填表)1、分析arp协议,填写下表12、分析icmp协议和ip协议,分别填写下表表一:ICMP报文分析233、分析TCP和UDP 协议,分别填写下表4表二: UDP 协议 5篇二:网络层协议数据的捕获实验报告篇三:实验报告4-网络层协议数据的捕获实验报告。

网络数据包分析实验(很好的哦)

网络数据包分析实验(很好的哦)

网络数据包分析实验一、实验目的分析一组数据:00 1e 37 52 6c 44 00 1d 72 84 dd 96 08 00 45 00 00 3c 02 88 00 00 80 01 23 5c 0a 00 00 70 0a 00 00 6e 08 00 49 5c 03 00 01 00 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 767 61 62 63 64 65 66 67 68 69二、实验内容1.数据链路层头部(以太帧头部):00 1e 37 52 6c 44 00 1d 72 84 dd 9608 00分析如下:(1)数据头部的前6个字节是接收者的mac地址:00 1e37 52 6c 44(2)数据头部的中间6个字节是发送者的mac地址:00 1d72 84 dd 96(3)数据头部的最后2个字节代表网络协议,即:08 00是IP协议类型。

2.IP数据包数据分析:(1)第一个字节(45)的前4位表示的是IP协议的版本,即IPv4;它的后4位表示首部长度为20字节。

(2)第二个字节(00)是区分服务。

(3)第三、四字节(00 3c)是指首部和数据之和的长度40个字节(4)第五、六字节(02 88)是一个数据报被分片后的标识,便于正确地重装原来的数据报(5)第七、八字节(00 00)分前3位为标志位和后13位为片偏移,其中标识位只有两位有意义,表明这已经是若干用户数据报片最后一个(MF=0,并且DF=0)不需要再分片了。

偏移为0(6)第九个字节(80)表示的是数据报在网络中的寿命为128(7)第十个字节(01)指出这个数据报携带的数据时使用的ICMP协议(8)第十一、十二字节(23 5c)表示首部检验和,对数据报的保留与丢弃进行判别第十三个字节加上后面的3个字节(0a 00 00 70)是发送者的IP源地址(172.16.163.20)第十七个字节及后面的三个字节(0a 00 00 6e)是接收者的IP地址(224.00.00.22)最后四个字节(08 00 49 5c)是任意的与填充项。

最新实验二-IP数据包的捕获与解析

最新实验二-IP数据包的捕获与解析

实验二IP数据包的捕获与解析网络09021.实验目的:掌握网络层的基本原理,通过编程实现网卡截取标准格式的IP包;解析IP数据包,了解IP包结构中个字段的含义与用途。

2.实验原理:IP数据报结构:3. 实验环境平台:Windows、编程环境:VC 6.0、语言:C++4流程图及源代码#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#include<fstream>#include <windows.h>#pragma comment(lib,"ws2_32") //指定连接到网络应用和internet#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)typedef struct IP_HEAD{union //定义联合{unsigned char Version;unsigned char HeadLen;};unsigned char ServiceType;unsigned short TotalLen; Array unsigned short Identifier;union{unsigned short Flags;unsigned short FragOffset;};unsigned char TimeToLive;unsigned char Protocol;unsigned short HeadChecksum;unsigned int SourceAddr;unsigned int DestinAddr;unsigned char Options;}ip_head; //定义IP头部的数据结构void main(int argc,char *argv[]){using namespace std;ofstream outfile("C:\\logfile.txt",ios::out);if(argc!=2){cout<<endl<<"请以下格式输入命令行return;}WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0){cout<<endl<<"WSASTartup初始化失败"<<endl;return;}SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); //三个参分别为通信发生的区字段,套接字的类型,与IP协议if(sock==INVALID_SOCKET){cout<<endl<<"创建Socket失败!"<<endl;closesocket(sock);WSACleanup();}BOOL flag=TRUE;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *) &flag,sizeof(flag))==SOCKET_ERROR){cout<<endl<<"setsockopt操作失败:"<<WSAGetLastError()<<endl;closesocket(sock);WSACleanup();}char hostName[128];//获取主机名if(gethostname(hostName,100)==SOCKET_ERROR){cout<<endl<<"gethostname操作失败:"<<WSAGetLastError()<<endl;closesocket(sock);WSACleanup();}hostent *pHostIP; //获取本地IPif((pHostIP=gethostbyname(hostName))==NULL){cout<<endl<<"gethostbyname操作失败:"<<WSAGetLastError()<<endl;closesocket(sock);WSACleanup();}sockaddr_in host_addr;//host_addr.sin_family=AF_INET;host_addr.sin_port=htons(6000);host_addr.sin_addr=*(in_addr *)pHostIP->h_addr_list[0];if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr))==SOCKET_ERROR){cout<<endl<<"bind操作失败:"<<WSAGetLastError()<<endl;closesocket(sock); //绑定网卡WSACleanup();}DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;if(WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen) , &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR){cout<<endl<<"WSAIoctl操作失败:"<<WSAGetLastError()<<endl;closesocket(sock); //将网卡设为混杂模式,以接受所有数据WSACleanup();}cout<<endl<<"开始解析IP包:"<<endl;char buffer[65535]; //设置缓冲区int packsum=atoi(argv[1]); //字符串转换为整形for(int i=0;i<packsum;i++){if(recv(sock,buffer,65535,0)>0) //四个参数分别是套接字描述符,缓冲区的地址,缓冲区大小,附加标志{ip_head ip=*(ip_head *)buffer;cout<<"-----------------------"<<endl;cout<<"版本:"<<(ip.Version>>4)<<endl; //获取头部长度字段cout<<"头部长度:"<<((ip.HeadLen &0x0f)*4)<<endl; //获取头部长度字段cout<<"服务类型:Priority"<<(ip.ServiceType>>5)<<", Service"<<((ip.ServiceType>>1)&0x0f)<<endl;//优先级子域和TOS子域cout<<"总长度:"<<ip.TotalLen<<endl;//获取总长度字段cout<<"标识符:"<<ip.Identifier<<endl;//获取标识字段cout<<"标志位:"<<((ip.Flags>>15)&0x01)<<",DF= "<<((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl; //获得标志字段cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; //获取分段偏移字段cout<<"生存周期:"<<(int)ip.TimeToLive<<endl; //获取生存时间字段cout<<"协议:Protocol"<<(int)ip.Protocol<<endl; //获取协议字段cout<<"头部校验和:"<<ip.HeadChecksum<<endl; //获取头校验和字段cout<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl; //获取源IP地址字段cout<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl; //获取目的IP地址字段outfile<<"-----------------------"<<endl;outfile<<"版本:"<<(ip.Version>>4)<<endl;outfile<<"头部长度:"<<((ip.HeadLen &0x0f)*4)<<endl;outfile<<"服务类型:Priority"<<(ip.ServiceType>>5)<<", Service"<<((ip.ServiceType>>1)&0x0f)<<endl;outfile<<"总长度:"<<ip.TotalLen<<endl;outfile<<"标识符:"<<ip.Identifier<<endl;outfile<<"标志位:"<<((ip.Flags>>15)&0x01)<<",DF= "<<((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl;outfile<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl;outfile<<"生存周期:"<<(int)ip.TimeToLive<<endl;outfile<<"协议:Protocol"<<(int)ip.Protocol<<endl;outfile<<"头部校验和:"<<ip.HeadChecksum<<endl;outfile<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl;outfile<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl;}}closesocket(sock);WSACleanup();}5.运行结果:。

ip实验报告

ip实验报告

ip实验报告篇一:iP实验报告华中师范大学计算机科学系实验报告书实验题目:解析iP数据包课程名称:计算机网络主讲教师:刘玉华辅导教师:课程编号:班级:0401实验时间:20XX-5-1012345篇二:实验四、iP协议分析实验报告实验四、iP协议分析实验报告序号:姓名:学号:成绩指导老师1.实验目的:分析iP协议报文格式.2.实验环境:局域网环境,或者是联网的单机。

3.实验步骤:(1)启动ethereal软件,开始报文捕获。

(2)捕获iP的数据包(3)停止捕获报文。

4.实验分析,回答下列问题(1)请说明你是如何获得iP的捕获文件,并附上捕获的截图。

答:清空浏览器缓存,打开ethereal软件,开始报文捕获。

启动某个基于TcP的应用程序,打开浏览器输入。

(3)等出现浏览的网页后停止数据包的捕获。

(4)出现协议分析界面,将filter一栏填入ip,则只显示ip协议信息(2)通过捕获的数据包分析iP的报文结构,将iP协议树中各名字字段,字段长度,(3)请举例说明iP协议中iP分组分片和组装的过程。

答:iP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。

这一过程称为分片(fragmentation)。

iP分片(Fragmentation)发生在要传输的iP报文大小超过最大传输单位mTU(maximumTransmissionUnit)的情况。

比如说,在以太网(Ethernet)环境中可传输最大iP报文大小(mTU)为1500字节。

如果要传输的报文大小超过1500字节,则需要分片之后进行传输。

由此可以看出,iP分片在网络环境中是经常发生的事件。

5.实验总结,总结你在实验过程中遇到的问题和解决的方法。

答:(1)、实验过程中由于对ip协议的不熟悉,不明白各个字段的具体含义与作用,通过看书和查看相关的资料能够很好的完成实验。

(2)对ip协议的分组分片和组装的过程的知识掌握还不是彻底,还是不能熟练、正确的对其进行分析。

实验五、IP协议分析实验报告

实验五、IP协议分析实验报告

实验五、IP协议分析实验报告一、实验目的本次实验的主要目的是深入理解 IP 协议的工作原理和机制,通过实际的抓包分析,掌握 IP 数据包的格式、IP 地址的分类与分配、子网掩码的作用以及路由选择的基本过程。

二、实验环境1、操作系统:Windows 102、抓包工具:Wireshark三、实验原理1、 IP 协议概述IP(Internet Protocol)协议是 TCP/IP 协议簇中最为核心的协议之一,它负责为网络中的设备提供逻辑地址(即 IP 地址),并实现数据包的路由和转发。

2、 IP 数据包格式IP 数据包由头部和数据部分组成。

头部包含了源 IP 地址、目的 IP地址、协议类型、生存时间(TTL)等重要信息。

3、 IP 地址分类IP 地址分为 A、B、C、D、E 五类,其中 A、B、C 类为常用的单播地址,D 类用于组播,E 类为保留地址。

4、子网掩码子网掩码用于确定 IP 地址中的网络部分和主机部分,从而实现子网划分。

5、路由选择路由器根据 IP 数据包中的目的地址和路由表,选择合适的路径将数据包转发到下一跳。

四、实验步骤1、打开 Wireshark 软件,选择合适的网络接口进行抓包。

2、在网络中进行一些常见的网络操作,如访问网页、发送邮件等,以获取 IP 数据包。

3、停止抓包,并对抓取到的数据包进行筛选,只显示 IP 协议的数据包。

4、逐个分析 IP 数据包的头部信息,包括源 IP 地址、目的 IP 地址、协议类型、TTL 等。

5、观察不同类型的 IP 地址,并分析其网络部分和主机部分。

6、研究子网掩码在数据包中的作用,以及如何通过子网掩码确定子网范围。

7、分析路由选择过程,观察数据包在网络中的转发路径。

五、实验结果与分析1、 IP 数据包格式分析通过对抓取到的 IP 数据包进行分析,我们可以看到其头部格式如下:版本(Version):通常为 4,表示 IPv4 协议。

头部长度(Header Length):以 4 字节为单位,指示头部的长度。

高三计算机课件 网络课程设计-IP数据包解析实验报告

高三计算机课件 网络课程设计-IP数据包解析实验报告

目录目录 (1)1、课程设计目的 (2)2、课程设计要求 (2)3、相关知识 (2)4、课程设计分析 (6)4.1 网卡设置 (6)4.2 使用套接字 (6)4.2.2 接收数据包 (7)4.3 定义IP头部的数据结构 (7)4.4 IP包的解析 (9)4.5 协议的定义 (9)4.6捕获处理 (9)5、运行结果 (10)6、总结 (10)7、课程设计参考资料 (11)8、源程序代码 (11)1、课程设计目的本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。

2、课程设计要求本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。

程序的具体要求如下:1)以命令行形式运行:ipparse logfile,其中ipparse是程序名, 而logfile 则代表记录结果的日志文件。

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

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

3、相关知识互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP协议的数据包格式.IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析.报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B之间,是可变的.0 4 8 16 19 24 31图1 IP数据包的格式服务类型字段共8位,用于指示路由器如何处理该数据包.该字段长度由4位服务类型(TOS)子域和3位优先级子域组成,1位为保留位,该字段结构如图2所示.B7 b6 b5 b4 b3 b2 b1 b0图2 服务类型字段结构优先级共有8种,优先级越高表明数据包越重要.表1中列出了各种优先级所代表的意义.表一优先子域的说明在4位服务类型子域中b4,b3,b2,b1分别表示D(延迟),T(吞吐量),R(可靠性)与C(成本).表2列出了服务器类型自域的构成.总长度字段为2B,它定义了以字节为单位的数据包的总长度.IP数据包的最大长度为65535B.标识字段的长度为16位,用于识别IP数据包的编号.每批数据都要有一个标识值,用于让目的主机判断新来的数据属于哪个分组.报头中的标志字段如图7-3所示.标志字段共3位,最高位是0.禁止分片标志DF(do not fragment)字段的值若为1,表示不能对数据包分片;若DF值为0,则表明可以分片.分片标志MF( more fragment)的值为1,表示接收到的不是最后一个分片;若MF值为0,表示接收到的是最后一个分片.片偏移字段共13位,说明分片在整个数据包中的相对位置.片偏移值是以8B 为单位来记数的,因此选择的分片长度应该是8B的整数倍.生存时间(TTL)字段为8位,用来设置数据包在互联网络的传输过程的寿命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的.协议字段为8位,表示使用此IP数据包的高层协议类型,常用的协议号如表3所示.表3 典型的协议号头校验和字段为16位,用于存放检查报头错误的校验码。

ip数据报解析源地址目的地址

ip数据报解析源地址目的地址

ip数据报解析源地址目的地址青岛农业大学理学与信息科学学院计算机网络综合实习报告题目IP数据报解析源地址/目的地址专业计算机科学与技术学号姓名指导教师日期2014年11月8日一、设计任务和目的设计一个解析IP数据包的程序,并根据这个程序,从IP数据报头中解析出源地址和目的地址等相关问题,从而对IP层的工作原理有更好的理解和认识。

通过实际操作,加深对计算机网络的理解,了解计算机网络应用的灵活性,加深对IP数据报格式的了解,点分十进制理解,巩固所学习的C语言。

二、设计要求编写计算机程序,从网络捕获数据包,从IP数据报头中解析出源地址和目的地址,将它们以点分十进制形式输出。

三、设计内容3.1原理概述:3.1.1 点分十进制表示法:对主机或路由器来说,ip地址都是32位的二进制代码,为了提高可读性,我们常常把32位的ip地址中的每8位用其等效的十进制数字表示,并且在这些数字之间加上一个点,这就叫做点分十进制表示法(dotted decimal notation)。

例如:一个ip地址:100000000 00001011 00000011 00011111 用点分十进制表示为:128.11.3.31读起来要方便得多。

3.1.2 IP数据报格式:IP协议所处理的数据单元称为IP数据报。

其格式如下:图3-1 数据报格式图[1]IP数据报由首部和数据两部分组成,首部又分为定长部分和变长部分。

◆版本(VER):4位,表示数据报的IP协议版本,当前的IP协议版本号为4,即IPv4;下一代网络协议IPv6,版本号为6.◆首部长度(HLEN):4位,表示以字长(4字节)为单位的数据报首部长度。

◆服务类型(SERVICE TYPE): 8位,规定本数据报的处理方式。

前三位是优先级,0-7,0表示最低,7最高(最重要),但目前的IPv4没有使用优先级。

后4位是TOS,表示本数据报在传输过程中所希望得到的服务,D--最小延迟(minimize delay);T--最大吞吐率(maximize throughout);R--最高可靠性(maximize reliability);C--最低成本(minimize cost)。

最新实验二-IP数据包的捕获与解析

最新实验二-IP数据包的捕获与解析

实验二IP数据包的捕获与解析网络09021.实验目的:掌握网络层的基本原理,通过编程实现网卡截取标准格式的IP包;解析IP数据包,了解IP包结构中个字段的含义与用途。

2.实验原理:IP数据报结构:3. 实验环境平台:Windows、编程环境:VC 6.0、语言:C++4流程图及源代码#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#include<fstream>#include <windows.h>#pragma comment(lib,"ws2_32") //指定连接到网络应用和internet#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)typedef struct IP_HEAD{union //定义联合{unsigned char Version;unsigned char HeadLen;};unsigned char ServiceType;unsigned short TotalLen; Array unsigned short Identifier;union{unsigned short Flags;unsigned short FragOffset;};unsigned char TimeToLive;unsigned char Protocol;unsigned short HeadChecksum;unsigned int SourceAddr;unsigned int DestinAddr;unsigned char Options;}ip_head; //定义IP头部的数据结构void main(int argc,char *argv[]){using namespace std;ofstream outfile("C:\\logfile.txt",ios::out);if(argc!=2){cout<<endl<<"请以下格式输入命令行return;}WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0){cout<<endl<<"WSASTartup初始化失败"<<endl;return;}SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); //三个参分别为通信发生的区字段,套接字的类型,与IP协议if(sock==INVALID_SOCKET){cout<<endl<<"创建Socket失败!"<<endl;closesocket(sock);WSACleanup();}BOOL flag=TRUE;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *) &flag,sizeof(flag))==SOCKET_ERROR){cout<<endl<<"setsockopt操作失败:"<<WSAGetLastError()<<endl;closesocket(sock);WSACleanup();}char hostName[128];//获取主机名if(gethostname(hostName,100)==SOCKET_ERROR){cout<<endl<<"gethostname操作失败:"<<WSAGetLastError()<<endl;closesocket(sock);WSACleanup();}hostent *pHostIP; //获取本地IPif((pHostIP=gethostbyname(hostName))==NULL){cout<<endl<<"gethostbyname操作失败:"<<WSAGetLastError()<<endl;closesocket(sock);WSACleanup();}sockaddr_in host_addr;//host_addr.sin_family=AF_INET;host_addr.sin_port=htons(6000);host_addr.sin_addr=*(in_addr *)pHostIP->h_addr_list[0];if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr))==SOCKET_ERROR){cout<<endl<<"bind操作失败:"<<WSAGetLastError()<<endl;closesocket(sock); //绑定网卡WSACleanup();}DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;if(WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen) , &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR){cout<<endl<<"WSAIoctl操作失败:"<<WSAGetLastError()<<endl;closesocket(sock); //将网卡设为混杂模式,以接受所有数据WSACleanup();}cout<<endl<<"开始解析IP包:"<<endl;char buffer[65535]; //设置缓冲区int packsum=atoi(argv[1]); //字符串转换为整形for(int i=0;i<packsum;i++){if(recv(sock,buffer,65535,0)>0) //四个参数分别是套接字描述符,缓冲区的地址,缓冲区大小,附加标志{ip_head ip=*(ip_head *)buffer;cout<<"-----------------------"<<endl;cout<<"版本:"<<(ip.Version>>4)<<endl; //获取头部长度字段cout<<"头部长度:"<<((ip.HeadLen &0x0f)*4)<<endl; //获取头部长度字段cout<<"服务类型:Priority"<<(ip.ServiceType>>5)<<", Service"<<((ip.ServiceType>>1)&0x0f)<<endl;//优先级子域和TOS子域cout<<"总长度:"<<ip.TotalLen<<endl;//获取总长度字段cout<<"标识符:"<<ip.Identifier<<endl;//获取标识字段cout<<"标志位:"<<((ip.Flags>>15)&0x01)<<",DF= "<<((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl; //获得标志字段cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; //获取分段偏移字段cout<<"生存周期:"<<(int)ip.TimeToLive<<endl; //获取生存时间字段cout<<"协议:Protocol"<<(int)ip.Protocol<<endl; //获取协议字段cout<<"头部校验和:"<<ip.HeadChecksum<<endl; //获取头校验和字段cout<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl; //获取源IP地址字段cout<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl; //获取目的IP地址字段outfile<<"-----------------------"<<endl;outfile<<"版本:"<<(ip.Version>>4)<<endl;outfile<<"头部长度:"<<((ip.HeadLen &0x0f)*4)<<endl;outfile<<"服务类型:Priority"<<(ip.ServiceType>>5)<<", Service"<<((ip.ServiceType>>1)&0x0f)<<endl;outfile<<"总长度:"<<ip.TotalLen<<endl;outfile<<"标识符:"<<ip.Identifier<<endl;outfile<<"标志位:"<<((ip.Flags>>15)&0x01)<<",DF= "<<((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl;outfile<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl;outfile<<"生存周期:"<<(int)ip.TimeToLive<<endl;outfile<<"协议:Protocol"<<(int)ip.Protocol<<endl;outfile<<"头部校验和:"<<ip.HeadChecksum<<endl;outfile<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl;outfile<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl;}}closesocket(sock);WSACleanup();}5.运行结果:。

ip数据包解析实验报告

ip数据包解析实验报告

ip数据包解析实验报告IP数据包解析实验报告引言:IP数据包解析是计算机网络领域中非常重要的一项技术,它能够帮助我们理解和分析网络通信过程中的数据传输。

在本次实验中,我们将深入学习和探索IP 数据包解析的原理和应用。

通过对实验样本的解析和分析,我们将能够更好地理解IP数据包的结构和功能,为网络通信的优化和安全提供有力的支持。

一、实验目的本次实验的主要目的是通过对IP数据包的解析,深入了解IP协议的工作原理和数据包的格式。

通过实际操作和观察,我们将能够掌握IP数据包的结构和各个字段的含义,进一步加深对计算机网络通信的理解。

二、实验环境和工具本次实验使用的环境为Windows操作系统,工具为Wireshark网络抓包工具。

Wireshark是一款功能强大的网络协议分析工具,它能够对网络数据包进行捕获和分析,提供详细的协议信息和数据解析。

三、实验步骤1. 打开Wireshark工具,选择合适的网络接口进行数据包捕获。

2. 启动网络通信应用程序,例如浏览器或者远程连接工具。

3. 在Wireshark中停止数据包捕获,然后选择一条IP数据包进行解析。

4. 通过分析IP数据包的各个字段,了解其结构和含义。

例如,源IP地址、目标IP地址、协议类型、数据包长度等。

5. 分析IP数据包的源和目标地址,探索网络通信的路径和过程。

通过查找路由表和网络拓扑,了解数据包的传输路径。

6. 根据实验结果,总结IP数据包解析的过程和方法。

思考IP数据包解析在网络通信中的应用和意义。

四、实验结果与分析通过对多个IP数据包的解析和分析,我们得到了以下实验结果和分析结论:1. IP数据包的源IP地址和目标IP地址是网络通信的重要标识,它们决定了数据包的发送和接收方向。

2. IP数据包的协议字段指示了数据包所使用的传输协议,例如TCP、UDP或ICMP等。

不同的协议有不同的功能和特点。

3. IP数据包的数据字段可以携带应用层的数据信息,例如网页内容或者文件传输数据。

计算机网络上机实验之 IP分析

计算机网络上机实验之 IP分析

3.1 IP分析实验报告1.实验目的:①熟悉IP的报文格式以及关键字段的含义②掌握IP地址的分配方法。

③理解路由器转发IP数据报的流程1.实验步骤:步骤一:初始化所有设备的ARP表信息为了方便观察,本实验预设了一个场景0,其中包含从PC0到PC1以及PC0到PC2的预定义数据包。

在实时模式和模拟模式中来回切换三次。

以便仿真系统填写相关设备的ARP表,使后续路由器的解释更加清晰。

单击场景面板中的Delete键删除所有场景,便于后续的实验,步骤二:观察IP数据报的转发单击Simulation模拟选项卡进入模拟模式。

单击Add Simple PDU按钮,然后分别单击PC0和PC2则pc0将向pc2发送一个包含ICMP报文的IP数据报。

単击Auto capture/play(自动捕获/播放)或者Capture/Forward按钮以运行模拟,并捕获事件和数据包。

此时, 可观察到IP 数据报的转发过程。

在Event List中找到AtDevice(在设备)显示为Router0 的第一个事件, 单击其彩色正方形,如图3-6所示, 単击lnbound PDU Details选项卡以査看IP 数据报的内容。

我们可以观察到IP分组中l1办议类型字段值为1 (PR0: Oxl), 这表明IP分组中封装了ICMP 报文。

再对比Inbound PDU Details和〇utbound PDU,我们可以发现在〇utbound PDU中IP 分组的TTL 字段值被减1了(由255变成254)。

由于PacketTracer 没有计算校验和, 因此我们也无法观察到校验和的变化。

另外,我们也可以观察到,源地址字段在IP的转发过程中始终没有发生变化, 但是源MAC地址和目标MAC地址发生了相应的变化。

步骤3 : 初始化并观赛各路由器的路由表删除所有场景,使用Inspect (检查)工具(右端的放大镜)分别打开RouterO、Routerl和Router2的路由表,并排列好路由表窗口,以便同时比较三个路由表。

计网实验报告(抓取本地网卡的IP数据包)

计网实验报告(抓取本地网卡的IP数据包)

计网大型实验报告课程计算机网络原理大型实验姓名汪敏倩班级计科1201 学号201226100117一、实验目的1.1任务一:了解常用网络命令Ping、Tracert/traceroute、Arp、Route的工作原理及使用。

1.2任务二:了解交换机的工作原理,掌握常用交换机的配置和应用以及静态路由的配置。

1.3任务三:抓取本地网卡的IP数据包,并且分析IP数据包的各个部分字段。

二、实验软件2.1任务一:cmd.exe命令解释程序2.2任务二:Packet.Tracer模拟器2.3任务三:Wincap网络抓包器,jnetpcap开源包,eclipes编程器,java语言三、实验步骤或实验原理3.1任务一:3.1.1◆实验原理:1、Ping是Windows下的一个命令在Unix和Linux下也有这个命令。

ping也属于一个通信协议,是TCP/IP协议的一部分。

利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。

它所利用的原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

使用格式:Ping空格IP地址。

该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。

2、Tracert/traceroute 的用处和PING是差不多的。

但是也有本质的区别。

用ping的时候是不会显示经过的路径的。

但是用tracerert的时候就可以显示经过的路由,并且显示它经过那个路由,花了多少时间,并且每个路由都会测试3次。

它可以让你知道,你的计算机离目的计算机在网络上的距离有多远,经过多久才能到达。

使用格式:Tracert/traceroute空格IP地址。

3、ARP即地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。

主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存一节约资源。

IP数据包解析

IP数据包解析

计算机网络课程设计报告题目:解析IP数据包学生姓名:学号:专业班级:计算机科学与技术同组姓名:指导教师:设计时间:2015年上学期第17周一、课程设计的目的和意义目的:1、通过解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP 协议的相关问题。

2、通过接收和解析IP数据包,了解IP数据包的基本结构与IP协议的基本功能。

3、捕获网络中的数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。

意义:1、为了在本次课程设计过程中,熟悉开发设计的基本流程,从分析任务到确立整体框架再到确定算法,然后再一步步实现各函数的功能。

从中熟悉新的库函数,并提高编程技巧。

2、我们已经学完了网络层的理论知识,可是对它的理解很粗浅。

之前只知道关于网络层的一些概念性的东西。

可是做完设计后,我才从整体上理解了网络层的框架,明白了网络层的每一个组成部分都是有它特定的功能和意义的,从而对网络层协议有了更深入的理解。

3、程序设计能直接有效地训练我们的创新思维,培养分析问题、解决问题的能力。

二、课程设计的内容和要求根据后面介绍的数据包结构,编写程序的具体要求如下:1)以命令行形式运行:ipparse logfile,其中ipparse是程序名, 而logfile 则代表记录结果的日志文件。

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

3)当程序接收到键盘输入Ctrl+C时退出三、解析IP数据包设计的相关技术3.1 IP数据包的格式与分析3.2 程序设计分析3.2.1 网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们使用套接字(socket)进行编程。

但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。

对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。

解析IP数据包实验报告讲解

解析IP数据包实验报告讲解

解析IP数据包实验报告讲解成都工业学院(课程设计实验报告)院系: 计算机工程系课程名称: 计算机网络设计名称: 解析IP数据包专业名称:网络工程班级: 1305022姓名:牟黎明学号: 11指导老师: 刘枝盛老师成绩:设计时间:2014年12月22日—2014年12月26日成都工业学院课程设计任务书指导教师(签名):目录一、课程设计的目的和意义 (3)二、课程设计的内容和要求 (3)三、解析IP数据包设计的相关技术 (4) ● 3.1 IP数据包的格式与分析 (4)● 3.2 程序分析设计 (6)● 3.2.1 网卡设置 (6)● 3.2.2 程序设计 (6)● 3.2.3 程序设计 (7)● 3.2.4 程序设计 (7)● 3.2.5 程序设计 (7)四、课程设计过程 (8)● 4.1 程序流程图 (8)● 4.2源程序代码 (9)● 4.3 程序运行结果 (16)● 4.3.1.登陆界面,提示输入命令符 (16)● 4.3.2.命令符输入错误后提示界面 (16)● 4.3.3.截获的IP数据包界面 (17)● 4.3.4.继续抓包图 (17)五、课程设计小结 (18)参考文献 (18)一、课程设计的目的和意义目的:本章课程设计的目的就是设计一个解析IP数据包的程序(我的编辑环境为visual2102),并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对网络层的工作原理有更好的理解和认识。

意义:1、有利于编程能力的提高在做设计的过程中,我再一次熟悉了开发设计的基本流程,从分析任务到确立整体框架再到确定算法,然后再一步步实现各函数的功能。

从中,我熟悉了许多新的库函数,并提高了编程技巧。

2、有利于基础知识的理解在这次课程设计之前,我们已经学完了网络层的理论知识,可是对它的理解很粗浅。

之前只知道关于网络层的一些概念性的东西。

可是做完设计后,我才从整体上理解了网络层的框架,明白了网络层的每一个组成部分都是有它特定的功能和意义的,从而对网络层协议有了更深入的理解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

成都工业学院(课程设计实验报告)院系: 计算机工程系课程名称: 计算机网络设计名称: 解析IP数据包专业名称:网络工程班级: 1305022姓名:牟黎明学号: 11指导老师: 刘枝盛老师成绩:设计时间:2014年12月22日—2014年12月26日成都工业学院课程设计任务书指导教师(签名):目录一、课程设计的目的和意义 (3)二、课程设计的内容和要求 (3)三、解析IP数据包设计的相关技术 (4)● 3.1 IP数据包的格式与分析 (4)● 3.2 程序分析设计 (6)● 3.2.1 网卡设置 (6)● 3.2.2 程序设计 (6)● 3.2.3 程序设计 (7)● 3.2.4 程序设计 (7)● 3.2.5 程序设计 (7)四、课程设计过程 (8)● 4.1 程序流程图 (8)● 4.2源程序代码 (9)● 4.3 程序运行结果 (16)● 4.3.1.登陆界面,提示输入命令符 (16)● 4.3.2.命令符输入错误后提示界面 (16)● 4.3.3.截获的IP数据包界面 (17)● 4.3.4.继续抓包图 (17)五、课程设计小结 (18)参考文献 (18)一、课程设计的目的和意义目的:本章课程设计的目的就是设计一个解析IP数据包的程序(我的编辑环境为visual2102),并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对网络层的工作原理有更好的理解和认识。

意义:1、有利于编程能力的提高在做设计的过程中,我再一次熟悉了开发设计的基本流程,从分析任务到确立整体框架再到确定算法,然后再一步步实现各函数的功能。

从中,我熟悉了许多新的库函数,并提高了编程技巧。

2、有利于基础知识的理解在这次课程设计之前,我们已经学完了网络层的理论知识,可是对它的理解很粗浅。

之前只知道关于网络层的一些概念性的东西。

可是做完设计后,我才从整体上理解了网络层的框架,明白了网络层的每一个组成部分都是有它特定的功能和意义的,从而对网络层协议有了更深入的理解。

3、有利于逻辑思维的锻炼程序设计能直接有效地训练我们的创新思维,培养分析问题、解决问题的能力。

即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。

二、课程设计的内容和要求本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。

程序的具体要求如下:1)打开本程序,根据提示,输入命令符ParsePacket,开始抓包。

获取经过本机的ip数据。

若输入错误,将退出重新打开才行。

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

3)第一次抓包完成后,可按1号键选择再次抓包,也可按2号键选择退出。

三、解析IP数据包设计的相关技术3.1 IP数据包的格式与分析互联网层是TCP/IP协议参考模型中的关键部分。

IP协议把传输层送来的消息组装成IP数据包,并把IP数据传递给数据链路层。

IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除各通信子网间的差异,从而为信息发送方和接收方提供了透明的传输通道。

编制本程序前,首先要对IP包的格式有一定的了解。

图(1)给出了IP协议的数据包格式。

IP数据包的第一字段是版本字段,其长度为4位,表示所使用的IP协议的版本。

目前的版本IPV4,版本字段的值为4,下一代的版本是IPV6,版本字段的值为6。

本程序主要针对版本值为4的IP数据包的解析。

报头标长(IHL)字段为4位,它定义了以4B为一个单位的IP包的报头长度。

报头除了选项字段和填充域字段外,其他各字段是定长的。

因此,IP数据包的头长度在20-40B之间,是可变的。

0 4 8 16 19 24 31(位)图1IP数据包的格式服务类型字段共8位,用于指示路由器如何处理该数据包。

该字段长度由4位服务类型(TOS)子域和3位优先级(b7 b6 b5)(precedence)子域组成,1位为保留位,该字段结构如图(2)所示:b7b6b5b4b3b2 b1b0图2服务类型字段结构优先级共有关8种,优先级越高表明数据包越重要。

图(3)列出了各种优先级所代表的意义。

图3优先级子域的说明在4位服务类型子域中,b4 b3 b2 b1分别表示D(延迟)、T(吞吐量)、R (可靠性)与(成本)。

表图(4)列出了服务类型子域的构成。

图4列出了服务类型子域总长度字段为2B,它定义了以字节为单位的数据包的总长度。

IP数据包的最大长度为216 =65535B。

标识字段长度为16位,用于识别IP数据包的编号。

每批数据都有一个标识值,用于让目的主机判断新来的数据属于哪个分组。

报头中的标志字段如图(5)所示。

标志字段共3位,最高位是0,禁止分片标志DF字段的值若为1,表示不能对数据包分片;若DF值为0,则表明可以分片。

分片标志MF的值为1,表示接收到的不是最后一个分片;若MF值为0,表示接收到的是最后一个分片。

图5标志字段的结构片偏移字段共13位,说明分片在整个数据包中的相对位置。

片偏移值是8B 为单位来计数的,因此选择的分片长度应该是8B的整数倍。

生存时间(TTL)字段为8位,用来设置数据包在互联网络的传输过程的寿命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的。

协议字段为8位,表示使用IP数据包的高层协议类型头部验和字段为16位,用于存放检查报头错误的校验码。

3.2 程序分析设计3.2.1 网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们使用套接字(socket)进行编程。

但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。

对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。

我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。

3.2.2 程序设计本程序主要由三部分构成:初始化原始套接字,反复监听捕获数据包和解析数据包。

下面就结合核心代码对程序的具体实现进行分析,同时使程序流程更加清晰,去掉了错误检查等保护性代码。

3.2.3 使用原始套接字套接字分为三种,即流套接字(Stream socket)、数据报套接字(Datagram Socket)和原始套接字(Raw Socket)。

要进行IP层数据包的接收和发送,应使用原始套接字。

创建原始套接字的代码如下:Socket sock:Sock=WSAsocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped): 本设计不用考虑超时情况。

创建套接后,IP头就会包含在接收数据包中。

然后,我可以设置IP头操作选项,调用setsockopt函数。

其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。

最后使用bind()函数将socket绑定到本地网卡上。

绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。

如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP 包。

3.2.4 接收数据包在程序中可使用recv()函数接收经过的IP包。

该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。

因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。

设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。

3.2.5 IP包的解析解析IP包的字段有两种策略。

针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。

要解析长度不是8位倍数的字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。

四、课程设计过程首先,分析任务,明确该程序需要实现的功能;然后,根据该功能画出相应的程序流程图;其次,打开VS2012,用C、C++语言书写源代码,并且进行调试,直到得出正确的结果,并对程序的最后运行结果进行截图;最后,完成课程设计报告。

4.1 程序流程图如下:图6程序流程图4.2源程序代码#include"winsock2.h"//windows socket(称作"套接字",用于描述IP地址和端口,是一个通信链的句柄) 的头文件包括//#define IPPROTO_IP 0 /* dummy for IP *///#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options *///#define IPPROTO_ICMP 1 /* control message protocol *///#define IPPROTO_IGMP 2 /* internet group management protocol *///#define IPPROTO_GGP 3 /* gateway^2 (deprecated) *///#define IPPROTO_IPV4 4 /* IPv4 */#include"ws2tcpip.h"//与IPv6相关的一个头文件#include"iostream"#include"stdio.h"using namespace std;#pragma comment(lib,"ws2_32.lib") //告诉编译器在编译形成的.obj文件和.exe文件中加一条信息,使得链接器在链接库的时候要去找wsock32.lib这个库,不要先去找别的库。

//定义IP头部结构typedef struct_IP_HEADER{union{BYTE Version; //版本(前4位)BYTE HdrLen; //IP头部长度(后4位)};BYTE ServiceType; //服务类型WORD TotalLen; //总长度WORD ID; //标志识union{WORD Flags; //标志(前3位)WORD FragOff; //分段偏移(后13位)};BYTE TimeToLive; //生命期BYTE Protocol; //协议WORD HdrChksum; //头校验和DWORD SrcAddr; //源地址DWORD DstAddr; //目的地址BYTE Options; //选项}IP_HEADER;//解析IP包的版本信息void getVersion(BYTE b, BYTE & version){version=b>>4; //右移运算}//解析IP包的头部长度void getIHL(BYTE b,BYTE & result){result=(b&0x0f)*4;}//解析IP包的服务类型char * parseServiceType_getProcedence(BYTE b){switch(b>>5) //“>>”代表右移运算符例如:14 >> 2的值为3,因为14(即二进制的00001110)向右移两位等于3(即二进制的00000011){case 7:return"Network Control";break;case 6:return"Internet work Control";break;case 5:return"CRITIC/ECP";break;case 4:return"Flash Override";break;case 3:return"Flsah";break;case 2:return"Immediate";break;case 1:return"Priority";break;case 0:return"Routine";break;default:return"Unknow";break;}}//解析IP包的服务级别char * parseServiceType_getTOS(BYTE b){b=(b>>1)&0x0f;switch(b){case 0:return"Normal service";break;case 1:return"Minimize monetary cost";break;case 2:return"Maximize reliability";break;case 4:return"Maximize throughput";break;case 8:return"Minimize delay";break;case 15:return"Maximize security";break;default:return"Unknow";}}//解析IP包的标志位void getFlags(WORD w,BYTE & DF,BYTE & MF) {DF=(w>>14)&0x01;MF=(w>>13)&0x01;}//解析IP包的分段标志位void getFragOff(WORD w,WORD & fragOff){fragOff=w&0x1fff;}//解析IP包的协议类型char * getProtocol(BYTE Protocol){switch(Protocol/*协议*/) {case 1:return"ICMP";case 2:return"IGMP";case 4:return"IP in IP";case 6:return"TCP";case 8:return"EGP";case 17:return"UDP";case 41:return"IPv6";case 46:return"RSVP";case 89:return"OSPF";default:return"UNKNOW";}}//解析完毕,输出结果,从电脑中读取,并打印到屏幕void ipparse(FILE* file,char* buffer) //IP查询,分析{IP_HEADER ip=*(IP_HEADER*)buffer;fseek(file,0,SEEK_END);//解析IP包的版本信息BYTE version;getVersion(ip.Version,version);fprintf(file,"版本号=%d\r\n",version);//解析IP包的头部长度BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"报头标长=%d(BYTE)\r\n",headerLen);//解析IP包的服务类型与等级fprintf(file,"服务类型=%s,%s\r\n",parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType));//解析IP的总长度fprintf(file,"总长度=%d(BYTE)\r\n",ip.TotalLen);//解析IP包的标志符fprintf(file,"标识=%d\r\n",ip.ID);//解析IP包的标志位BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"标志 DF=%d,MF=%d\r\n",DF,MF);//解析IP包的分段偏移WORD fragOff;getFragOff(ip.FragOff,fragOff);fprintf(file,"分段偏移值=%d\r\n",fragOff);//解析IP包的生存期fprintf(file,"生存期=%d(hopes)\r\n",ip.TimeToLive);//解析IP包的协议类型fprintf(file,"协议=%s\r\n",getProtocol(ip.Protocol));//解析IP包的头部校验和fprintf(file,"头校验和=0x%0x\r\n",ip.HdrChksum);//解析IP包的IP地址fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,"*********************************************\r\n");}//以下为主函数int main(){//生成一个txt文件,作为记录IP解析的数据int nRetCode = 0;{FILE * file;if((file=fopen("history.txt","wb+"))==NULL){printf("fail to open file %s");return -1;}//fopen函数(C语言书中讲到)用来打开一个文件,其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式);//其中,“文件指针名”必须是被说明为FILE 类型的指针变量//“文件名”是被打开文件的文件名;//“使用文件方式”是指文件的类型和操作要求。

相关文档
最新文档