为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

IP解析数据包

2017-11-12 7页 doc 22KB 66阅读

用户头像

is_348501

暂无简介

举报
IP解析数据包IP解析数据包 1.课程设计目的 本章课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。 2.课程设计要求 本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。 程序的具体要求如下: 1)以命令行形式运行:ipparse logfile,其中ipparse是程序名 而logfile则代表记录结果的日志文件。 2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包...
IP解析数据包
IP解析数据包 1.课程设计目的 本章课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP的相关问题,从而对IP层的工作原理有更好的理解和认识。 2.课程设计要求 本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。 程序的具体要求如下: 1)以命令行形式运行:ipparse logfile,其中ipparse是程序名 而logfile则代记录结果的日志文件。 2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)当程序接收到键盘输入CtrlC时退出 3.课程设计分析 3.1 网卡设置 为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们使用套接字socket进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。 3.2 程序设计 本程序主要由三部分构成:初始化原始套接字,反复监听捕获数据包和解析数据包。下面就结合核心代码对程序的具体实现进行分析,同时使程序更加清晰,去掉了错误检查等保护性代码。 3.2.1 使用原始套接字 套接字分为三种,即流套接字Stream socket、数据报套接字Datagram Socket 和原始套接字Raw Socket。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下: Socket sock: Sockwsasocketaf_inetsock_rawipproto-ipnull0wsa-flag-overlapped: 本设计不用考虑超时情况。 创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。最后使用bind函数将socket绑定到本地网卡上。绑定网卡后,需用WSAIoctl函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。 3.2.2 接收数据包 在程序中可使用recv函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用recv函数实现接收功能。 3.2.3 定义IP头部的数据结构 程序需要定义一个数据结构表示IP头部。其代码如下: //定义IP数据包头的结构 struct IP_HEADER unsigned short ip_version /IP 的版本号 / ip_hdr_len; /IP包头的长度/ ip_tos; /IP包的服务类型/ ip_total_len; /IP包的总长度/ ip_id; /IP包的分段标识/ ip_flags; /IP包的分段标志/ ip_frag_offset; /IP包的分段偏移/ ip_ttl; /IP包的生存时间/ ip_proto; /IP包的高层协议/ ip_hdr_chksum /IP包的校验和/ struct IPADDRESS ip_src_addr; /IP包的源IP地址/ ip_dest_addr; /IP包的目的IP地址/ ipheader 3.2.4 IP包的解析 解析IP包的字段有两种策略。针对长度为8位、16位和32位的字段或子字段时,可以利用IP-HEADER的成员直接获取。要解析长度不是8位倍数的字段或子字段时,可以利用C语言中的移位 以人、及与、或操作完成。 3.2.5 流程图 4.解析IP数据包设计相关知识 互联网层 是TCP/IP协议参考模型中的关键部分。IP协议把传输层送来的消息组装成IP数据包, 并把IP数据传递给数据链路层。IP协议在TCP/IP协议族中处于核心地位,IP协议制 定了统一的IP数据包格式,以消除各通信子网间的差异,从而为信息发送方和接收 方提供了透明的传输通道。编制本程序前,首先要对IP包的格式有一定的了解。 IP 数据包的第一字段是版本字段,其长度为4位,表示所使用的IP协议的版本。目前的 版本IPV4,版本字段的值为4,下一代的版本是IPV6,版本字段的值为6。本程序主 要针对版本值为4的IP数据包的解析。 报头标长IHL字段为4位,它定义了以4B为一 个单位的IP包的报头长度。报头除了选项字段和填充域字段外,其他各字段是定长 的。因此,IP数据包的头长度在20-40B之间,是可变的。 0 4 8 16 19 24 版本 报头 标长 服务类型 总长度 标识 标志 片偏移 生存时间 协议 头校验和 源IP地址 目 的IP地址 选项 填充域 数据部分 IP数据包的格式 服务类型字段共8位,用于指示 路由器如何处理该数据包,米侄纬ざ扔?位服务类型TOS子域和3位优先级 precedence子域组成,1位为保留位,该字段结构如下所示: 优先级 D T R C 0 服 务类型字段结构 位数 意义 111 网络控制 110 网络间控制 101 重要CRITIC/ECP 100 即时、优先 011 即时 010 立刻 001 优先 000 普通 优先级子域的说明 6.程 序设计 6.1 IP地址结构定义 struct IPADDRESS unsigned short ip_a ip_b ip_c ip_d //定义IP数据包头的结构 struct IP_HEADER unsigned short ip_version /IP的版本号 / ip_hdr_len; /IP包头的长度/ ip_tos; /IP包的服务类型/ ip_total_len; /IP包的总长 度/ ip_id; /IP包的分段标识/ ip_flags; /IP包的分段标志/ ip_frag_offset; /IP包的 分段偏移/ ip_ttl; /IP包的生存时间/ ip_proto; /IP包的高层协议/ ip_hdr_chksum /IP包的校验和/ struct IPADDRESS ip_src_addr; /IP包的源IP地址/ ip_dest_addr; /IP 包的目的IP地址/ ipheader //IP包的链表结构 struct stru_ip_link char rcv_ip_bufMAX_IP_SIZE struct stru_ip_link next 6.2 协议的定义 包含相应的头文 件include include): DWORD dwIoControlCodeSIO_RCVALL /接收所有的IP包/ dwProtocolIPPROTO_IP /协议类型为IP/ 6.3捕获处理 1.加载 Winsock; 2.创建一个 接收原始IP包的socket连接; 3.绑定到一个接口; 4.进行WSAIoctl设置,接收所有 的IP数据包。 代码如下: if WSAIoctls dwIoControlCode optval sizeofoptval NULL 0 dwBytesRet NULL NULL SOCKET_ERROR 5.接着设定一个线程进行捕获: (1) 创建一个接收IP包的链表头; (2)设置一个标识,为真,则不断进行IP包的捕获; (3)建立一个新的结点,将捕获的数据包加入到该结点; (4)如果链表的长度达 到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链 表不足给定的长度,而又中止IP捕获时,对链表的处理; (5)为下一个IP包链表 创建一个链表头。 6.建立一个进行IP包解析并显示的线程,进行解析IP数据包,然 后显示IP数据包。 6.4 源程序 include include include include include include include include main struct sockaddr_in addr struct ether_header peth struct iphdr pip struct tcphdr ptcp struct udphdr pudp char mac16 int isock r len char data char ptemp char ss32dd32 ifsock socketAF_PACKET SOCK_RAW htonsETH_P_ALL -1 //建立 socket //man socket可以看到上面几个宏的意思 diesocket 1 do_promisceth0 sock //eth0为网卡名称 systemifconfig for len sizeofaddr r recvfromsockchar bufsizeofbuf 0 struct sockaddr addrlen //调试的时候可以增加一个输出r的语句判断是 否抓到包 bufr 0 printfsbuf ptemp buf peth struct ether_header ptemp ptemp sizeofstruct ether_header //指针后移eth头的长度 pip struct ip ptemp //pip指向ip层的 包头 ptemp sizeofstruct ip//指针后移ip头的长度 switchpip-protocol //根据不同协议 判断指针类型 case IPPROTO_TCP: ptcp struct tcphdr ptemp //ptcp指向tcp头部 if0 strcmpinet_ntoastruct in_addrpip-saddrinet_ntoastruct in_addrpip-daddr printfTCP pkt :FORM:s:dninet_ntoastruct in_addrpip-saddrntohsptcp-source printfTCP pkt :TO:s:dninet_ntoastruct in_addrpip-daddrntohsptcp-dest break case IPPROTO_UDP: pudp struct udphdr ptemp //ptcp指向udp头部 printfUDP pkt:n len:d payload len:d from s:d to s:dn r ntohspudp-len inet_ntoastruct in_addrpip-saddr ntohspudp-source inet_ntoastruct in_addrpip-daddr ntohspudp-dest break default: printfUnkown pkt protocl:dn pip-protocol break //end switch //perrordump 6.5 运行 界面 7.自我评析和 这次计算机网络课程设计的“解析IP数据包”,通过近一周 的上机操作,充分应用了所学的计算机网络和C的知识,并去图书馆查阅了一些书 集和上网搜索一部分相当资料,粗略设计出该程序。 总体上来说,这次课程设计还 是比较成功的,充分运用了所学的计算机网络知识,设计出了如何解析IP数据包, 从而更加深刻的了解到了IP数据包的结构及IP协议的相关问题,从而对IP层的工作 原理有更好的理解和认识。 当然,由于学艺不精,在课程设计的过程也碰到的不少 问题。该程序也存在着不少的缺陷,比如并不是所有的数据包都能捕获,如:IP数 据包以外的数据包都抓不到;只支持ICMP、IGMP、TCP、UDP这些协议。 其实这 些通过最近的课程设计觉得最重要一点就是:我们一定要自己动手,这样才能真正 的学到东西。书本知识固然重要,但我们更要学会将书本知识应用到实际的工作中。 实践中才会发现错误,也才能改进,才能达到学习的最终目的。 最后感谢在这次课 程设计中帮助过我的老师,同学 8.课程设计参考资料 《计算机网络第四版》 主编: 谢希仁 出版社:电子工业出版社 出版或修订时间:2004年7月 《计算机网络课程 设计》 主 编:吴功宜 胡晓英 张仁 何云 王宁 出版社:机械工业出版社 出版或 修订时间:2005年9月 《计算机网络设计》 主 编:易建勋 出版社:人民邮电出版 社 出版或修订时间:2007年10月
/
本文档为【IP解析数据包】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索