优秀课设——IP数据包解析

合集下载

第7章 解析IP数据包

第7章  解析IP数据包

7.3 相关知识-协议字段

协议字段 -8位 表示使用此IP数据包的高层协议类型, 常用的协议号如下表所示:
协议名称 序号 ICMP 17 IGMP 41 IP in IP 46 TCP 89 EGP 协议名称 UDP IPv6 RSVP OSPF
序号 1 2 4 6 8
7.3 相关知识-头校验和字段(1/2)
7.3 相关知识-总长度字段



总长度字段- 2B 总长度=包头+数据 定义以字节为单位的数据包的总长度 IP数据包的最大长度为216=65535B
预备知识-报文的分片和重组控制



由于IP互连的物理网络处理的最大报文长度不 同,所以IP数据包在传输过程中可能被分片。 IP数据包使用“标识”、“标志”、“片偏移” 三个域对分片进行控制。 分片后的报文独立选择路由路径传输,最后在 目的地进行重组。
网络的SOCKET数据传输是一种特殊的 I/O。 SOCKET也是一种文件描述符,socket具 有一个类似于打开文件的函数调用 socket(),该函数返回一个整型的socket 描述符,随后的连接建立,数据传输等 操作都是通过该socket实现的。

预备知识-套接字(2/2)
常用的socket类型有三种: 流式socket(SOCK_STREAM)-面向连接的socket,针对 于面向连接的TCP服务; 数据报式socket(SOCK_DGRAM)-无连接的socket,对 应于无连接的UDP服务。 原始套接字(raw socket)-保存数据包中的完整IP 头,前面两种套接字只能收到用户数据。因此可以通 过原始套接字对IP层数据进行分析
7.3 相关知识-报头标长(IHL)字段

计算机网络课程设计_IP数据包解析实验报告

计算机网络课程设计_IP数据包解析实验报告

计算机网络工程课程设计报告题目:解析IP数据包学生姓名:李明学号: 201017010218专业班级:计科10102班同组姓名: 张禄、陈子英、李迅指导教师:李若兰设计时间: 2013年下学期第16周目录目录 (2)1、课程设计目的 (3)2、课程设计要求 (3)3、相关知识 (3)4、课程设计分析 (7)4.1 网卡设置 (7)4.2 使用套接字 (7)4.2.2 接收数据包 (8)4.3 定义IP头部的数据结构 (8)4.4 IP包的解析 (10)4.5 协议的定义 (10)4.6捕获处理 (10)5、运行结果 (11)6、总结 (11)7、课程设计参考资料 (12)8、源程序代码 (12)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数据包解析(共5篇)

计算机网络课程设计IP数据包解析(共5篇)

计算机网络课程设计IP数据包解析(共5篇)第一篇:计算机网络课程设计 IP数据包解析课设名称:IP数据包解析班级:学号:姓名:指导老师:日期: 2012.6.15计算机网络课程设计报告目录1.课程设计目的 (1)2.课程设计要求 (1)3.程序设计分析 (1)3.1 网卡设置 (1)3.2 使用套接字 (2)3.2.2 接收数据包 (2)3.3 定义IP头部的数据结构 (3)3.4 IP包的解析 (3)3.5 协议的定义 (4)3.6捕获处理 (4)4.运行结果 (5)5.总结 (5)6.源程序代码 (6)Ip数据包解析1.课程设计目的本课程设计的目的就是设计一个捕获并解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP 层的工作原理有更好的理解和认识。

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

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

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

3)当程序接收到键盘输入Ctrl+C时退出3.程序设计分析3.1 网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。

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

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

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

解析IP数据包

解析IP数据包

解析IP数据包IP数据包是在互联网传输中扮演重要角色的一种数据格式。

它包含了源IP地址和目标IP地址,以及其他与网络通信相关的信息。

解析IP数据包是对这些信息进行分析和解读的过程,以便理解数据包的来源、目的和内容。

在解析IP数据包时,我们可以从以下几个方面进行详细的分析:1. 版本号:IP数据包的版本号指示了所使用的IP协议的版本。

常见的版本有IPv4和IPv6。

IPv4是目前广泛使用的版本,而IPv6是为了解决IPv4地址不足的问题而推出的新版本。

2. 头部长度:IP数据包的头部长度指示了IP头部的长度,以字节为单位。

头部长度可以通过该字段的值乘以4来计算得到实际长度。

3. 服务类型:IP数据包的服务类型字段用于指示对数据包的处理优先级和要求。

这个字段可以用于区分不同类型的流量,如语音、视频或者普通数据。

4. 总长度:IP数据包的总长度字段指示了整个IP数据包的长度,包括头部和数据部份。

这个字段的值以字节为单位。

5. 标识、标志和片偏移:IP数据包的标识字段用于惟一标识一个IP数据包。

标志字段用于指示是否还有后续的分片数据包,以及是否允许分片。

片偏移字段用于指示当前数据包在原始数据中的位置。

6. 生存时间:生存时间字段指示了IP数据包在网络中的最大生存时间。

每经过一个路由器,生存时间字段的值就会减少1。

当生存时间字段的值为0时,数据包将被丢弃。

7. 协议:协议字段指示了IP数据包中封装的上层协议类型。

常见的协议有TCP、UDP和ICMP等。

8. 校验和:校验和字段用于检测IP数据包在传输过程中是否发生了错误。

发送端会计算校验和,并将其添加到IP头部中。

接收端在接收到数据包后会重新计算校验和,并将其与接收到的校验和进行比较,以检测数据包是否有损坏。

9. 源IP地址和目标IP地址:源IP地址字段指示了数据包的发送者的IP地址,而目标IP地址字段指示了数据包的接收者的IP地址。

通过解析IP数据包,我们可以获得有关网络通信的重要信息,如数据包的源地址、目标地址、协议类型等。

ip数据报解析程序课程设计

ip数据报解析程序课程设计

ip数据报解析程序课程设计一、课程目标知识目标:1. 学生理解IP数据报的基本结构,掌握各字段的作用及含义。

2. 学生掌握IP数据报的解析过程,包括头部解析和数据部分处理。

3. 学生了解IP数据报在不同网络环境下的传输过程及路由选择。

技能目标:1. 学生能够运用编程语言实现IP数据报的解析程序,提取关键信息。

2. 学生能够分析实际网络数据包,解读IP数据报内容,提高网络故障排查能力。

3. 学生通过小组合作,提高团队协作能力和问题解决能力。

情感态度价值观目标:1. 学生培养对计算机网络知识的兴趣,激发自主学习欲望。

2. 学生认识到网络通信在现代社会中的重要性,增强信息安全意识。

3. 学生在学习过程中,培养严谨、细致、负责的学习态度,提高自信心。

课程性质:本课程为计算机网络基础知识,旨在让学生通过实践操作,掌握IP 数据报的解析方法。

学生特点:学生具备一定的计算机网络基础,对编程有一定了解,喜欢动手实践。

教学要求:结合学生特点,注重理论与实践相结合,鼓励学生自主探究和小组合作,提高实际操作能力。

在教学过程中,关注学生的个体差异,给予个性化指导,确保学生能够达到预定的学习目标。

通过本课程的学习,使学生能够更好地理解和应用计算机网络知识,为后续学习打下坚实基础。

二、教学内容本课程教学内容主要包括以下三个方面:1. IP数据报基本概念与结构- 介绍IP数据报的定义、作用及其在网络通信中的重要性。

- 详细讲解IP数据报的头部结构,包括版本、头长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、头部校验和、源IP地址和目的IP地址等字段。

2. IP数据报解析过程及编程实现- 分析IP数据报的解析流程,包括捕获数据包、解析头部字段和提取数据部分。

- 结合教材章节,教授使用Python等编程语言实现IP数据报解析程序,并提供示例代码进行讲解。

3. 实践操作与案例分析- 布置实践任务,要求学生分组完成IP数据报解析程序的设计与实现。

高三计算机课件 网络课程设计-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数据包的组成和工作原理,培养学生分析问题和解决问题的能力。

具体分为以下三个部分:1.知识目标:使学生能够描述IP数据包的结构,理解IP地址的概念及其分类,掌握IP数据包的传输过程。

2.技能目标:培养学生运用网络协议分析工具分析IP数据包的能力,能够通过实际案例分析网络故障。

3.情感态度价值观目标:培养学生对计算机网络技术的兴趣,增强其对网络安全的意识,使其认识到计算机网络技术在现代社会中的重要作用。

二、教学内容本节课的教学内容主要包括以下几个部分:1.IP数据包的结构:介绍IP数据包的基本组成,包括头部和数据部分,以及各字段的含义。

2.IP地址:讲解IP地址的概念、分类及其表示方法,让学生了解不同类型的IP地址的使用场景。

3.IP数据包的传输:讲解IP数据包在网络中的传输过程,包括路由选择、分片与重组等。

4.案例分析:分析实际网络故障案例,让学生学会运用IP数据包分析工具进行问题排查。

三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用多种教学方法:1.讲授法:讲解IP数据包的结构、IP地址的分类等基本概念。

2.案例分析法:分析实际网络故障案例,让学生学会运用IP数据包分析工具进行问题排查。

3.实验法:安排课堂实验,让学生亲自动手配置IP地址,分析IP数据包,增强实践操作能力。

4.讨论法:学生分组讨论,分享学习心得,培养团队合作精神。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选用权威、实用的计算机网络教材,为学生提供系统的理论知识。

2.参考书:提供相关网络技术参考书籍,方便学生课后拓展学习。

3.多媒体资料:制作精美的PPT课件,直观展示IP数据包的结构和传输过程。

4.实验设备:准备网络实验设备,让学生能够亲自动手实践,提高实际操作能力。

五、教学评估为了全面、客观地评估学生的学习成果,本节课的教学评估将采用多种方式:1.平时表现:关注学生在课堂上的参与程度、提问回答等情况,给予及时的反馈和鼓励。

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

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

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

计算机网络课程设计(第七章)解析IP数据包(完整程序代码)

计算机网络课程设计——机械工业出版社第7章:解析IP数据包课程设计目的:本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP 数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。

完整程序代码:#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>#pragma comment(lib,"ws2_32.lib")typedef struct _IP_HEADER{union{BYTE Version;BYTE HdrLen;};BYTE ServiceType;WORD TotalLen;WORD ID;union{WORD Flags;WORD FragOff;};BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;} IP_HEADER;#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535void getVersion(BYTE b,BYTE &version){version=b>>4;}void getIHL(BYTE b,BYTE &length){length=(b&0x0f)*4;}char* parseServiceType_getProcedence(BYTE b) {switch(b>>5){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 "Flash";break;case 2:return "Immediate";break;case 1:return "Priority";break;case 0:return "Routine";break;default:return "Unknown";}}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 "Unknown";}}void getFlags(WORD w,BYTE &DF,BYTE &MF) {DF=(w>>14)&0x01;MF=(w>>13)&0x01;}void getFragOff(WORD w,WORD &fragOff) {fragOff=w&0x1fff;}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 "UNKNOWN";}}void ipparse(FILE* file,char* buffer){IP_HEADER ip=*(IP_HEADER*)buffer;fseek(file,0,SEEK_END);fprintf(file,"----------------------------------\n");BYTE version;getVersion(ip.Version,version);fprintf(file,"Version:%d\n",version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"HdrLen:%d(Bytes)\n",headerLen);fprintf(file,"ServiceType: %s,%s\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"TotalLen: %d(Bytes)\n",ip.TotalLen);fprintf(file,"ID: %d\n",ip.ID);BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"Flags:DF=%d,MF=%d\n",DF,MF);WORD fragOff;getFragOff(ip.FragOff,fragOff);fprintf(file,"FragOff: %d\n",fragOff);fprintf(file,"FragOff: %d\n",fragOff);fprintf(file,"TimeToLive: %d(Hops)\n",ip.TimeToLive);fprintf(file,"Protocol: %s\n",getProtocol(ip.Protocol));fprintf(file,"HdrChksum: 0x%0x\n",ip.HdrChksum);fprintf(file,"SrcAddr: %s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"DstAddr: %s\n",inet_ntoa(*(in_addr*)&ip.DstAddr)); }void main(int argc,char*argv[]){if(argc!=2){printf("Please input command: ParseArp output_file");return;}FILE* file;if((file=fopen(argv[1],"wb+"))==NULL){printf("Fail to open file %s",argv[1]);return;}WSADATA wsData;if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){printf("WSAStartup failed!");return;}SOCKET sock;if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCK ET){printf("Creat socket failed");return;}BOOL flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)) ==SOCKET_ERROR){printf("Setsockopt failed!");return;}char hostName[128];if(gethostname(hostName,100)==SOCKET_ERROR){printf("Gethostname failed!");return;}hostent* pHostIP;if((pHostIP=gethostbyname(hostName))==NULL){printf("Gethostbyname failed!");return;}sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERRO R){printf("Bind failed!");return;}DWORD dwValue=1;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){printf("Ioctlsocket failed!");return;}char buffer[BUFFER_SIZE];printf("Listening on local host...\n");while(true){int size=recv(sock,buffer,BUFFER_SIZE,0);if(size>0){ipparse(stdout,buffer);ipparse(file,buffer);}}fclose(file);return;}结果截图。

IP数据包解析.doc

解析IP数据包一、课题内容和要求本课程设计的目的是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构以及IP协议的相关问题。

课题要求捕获网络中的IP数据包,解析数据包的。

从而对IP层的工作原理有更好的理解和认识。

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

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

(3)程序设计的原理请用流程图描述;程序要求模块结构清晰规范,程序关键代码的注释详细;程序操作友好、界面美观。

(4)程序对于错误输入的处理,设计和编程中遇到问题的归纳总结。

二、需求和思路分析要求捕获网络中的IP数据包,并解析,要求先进行IP数据包的捕获,先捕获再分析,这就要求用到套接字。

套接字编程要求先创建原始套接字,创建原始套接字后,IP头就会包含在接收的数据中,然后对IP头进行操作,接着获取主机名和获取IP地址,并SOCKADDR_IN的结构内容进行填充,再绑定socket到本地网卡上,这就完成了IP数据包得捕获。

捕获后,接收数据包,并进行分析,最后得到结果。

要求以命令行形式运行:ipparse logfile ,其中ipparse是程序名,而logfile则代表记录结果的日志文件,要求先用ofstream outfile打开文件再用outfile将运行结果记录到日志文件中。

三、概要设计四、详细设计为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们使用套接字(socket)进行编程。

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

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

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

课程设计——解析IP数据包长沙理工大学目录1、课程设计目的 (2)2、课程设计要求 (2)3、程序设计分析 (2)3.1 网卡设置 (2)3.2.1 使用套接字 (3)3.2.2接收数据包 (3)3.3 定义IP头部的数据结构 (4)3.4 IP包的解析 (4)3.5 协议的定义 (5)3.6捕获处理 (5)4、运行结果 (6)5、总结 (6)6、课程设计参考资料 (7)7、源程序代码 (7)1、课程设计目的本章课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。

严格要求自己,要独立思考,按时、独立完成能力拓展训练任务。

设计报告:要求层次清楚,整洁,规范,不得相互抄袭。

2、课程设计要求1、用两个线程a和b来模拟Ethernet上的两台主机。

2、用一个双字类型变量Bus来模拟总线(将其初始化为“\0”,并且总线等于“\0”时表示总线空闲)。

3、两个子线程向总线发送自己的数据。

数据用该线程的线程号进行模拟,发送数据用线程号和Bus的“或”操作进行模拟(即Bus=Bus|ID,ID为该线程的线程号)。

4、每台主机需向总线上成功发送10次数据,如果其中某次数据发送失败,则该线程结束。

5、发送流程必须遵循CSMA/CD。

随即延迟算法中的冲突窗口取0.005。

在数据发送成功3、程序设计分析3.1 网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。

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

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

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

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

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

创建原始套接字的代码如下:Socket sock:Sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_TP,NULL,0,WSA_FLAG_OVE RLAPPED);本设计不用考虑超时情况。

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

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

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

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

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

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

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

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

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

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

3.3 定义IP头部的数据结构程序需要定义一个数据结构表示IP头部。

其代码如下:int i=0; //发送成功次数int CollisionCounter=16; //冲突计数器初始值为16 double CollisionWindow=0.005; //冲突窗口值取值0.005 int randNum=rand()%3; //随机数loop: if(Bus==0) //总线空闲{Bus=Bus|ID1; //模拟发送包Sleep(12);if (Bus==ID1) //无冲突 {printf("%d Send Success\n\n",ID1); //发送成功Bus=0; //内存清零CollisionCounter=16; //复原冲突计数器Sleep(rand()%10); //随即延时i++;printf("主机a发送成功次数=%d\n\n",i);if(i<10)goto loop; //发送次数不够10次,开始下一次发送 }else{printf("%d Send Collision\n\n",ID1); //发生冲突CollisionCounter-- ;Bus=0 ; 3.4 IP包的解析解析IP包的字段有两种策略。

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

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

3.5 协议的定义(包含相应的头文件#include #include):DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/dwProtocol=IPPROTO_IP; /*协议类型为IP*/3.6捕获处理1.加载 Winsock;2.创建一个接收原始IP包的socket连接;3.绑定到一个接口;4.进行WSAIoctl设置,接收所有的IP数据包。

代码如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR)5.接着设定一个线程进行捕获:(1)创建一个接收IP包的链表头;(2)设置一个标识,为真,则不断进行IP包的捕获;(3)建立一个新的结点,将捕获的数据包加入到该结点;(4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;(5)为下一个IP包链表创建一个链表头。

6.建立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。

4、运行结果截获IP数据包程序运行结果如下:5、总结这次计算机网络课程设计是解析IP数据包,通过这次上机充分应用了所学的计算机网络和C语言的知识,并上网搜索一部分相当资料,粗略设计出该程序。

通过本次课程设计,首先认识到了自己的不足。

在编码的过程中认识到了自己细节方面的不足,在以后计算机网络的学习过程中在理解的同时还要做到对细节的注重;当然在本次课设中最终还是实现了题目要求。

同时,觉得本次课设是十分有意义的,使自己所学的只是有了实践的地方。

6、课程设计参考资料《计算机网络(第四版)》主编:谢希仁出版社:电子工业出版社出版时间:2004年7月《计算机网络课程设计》主编:吴功宜胡晓英张仁何云王宁出版社:机械工业出版社出版或修订时间:2005年9月《计算机网络设计》主编:易建勋出版社:人民邮电出版社出版或修订时间:2007年10月7、源程序代码#include "winsock2.h"#include "ws2tcpip.h"#include "iostream"#include "stdio.h"#pragma comment(lib,"ws2_32.lib")typedef struct _IP_HEADER //定义IP头{union{BYTE Version; //版本(前4位)BYTE HdrLen; //IHL(后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; //右移4位,获取版本字段}void getIHL(BYTE b,BYTE & result){result=(b&0x0f)*4; //获取头部长度字段}char * parseServiceType_getProcedence(BYTE b){switch(b>>5) //获取服务类型字段中优先级子域{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;}}char * parseServiceType_getTOS(BYTE b){b=(b>>1)&0x0f; //获取服务类型字段中的TOS子域switch(b){case 0:return "Normal service";break;case 1:return "Minimize monetary cost";break;case 2:return "Maximize reliability";break;#include <unistd.h>#include <stdio.h>#include <sys/wait.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <error.h>#include<time.h>#include<stdlib.h>#define ERROR_SHMGET -1#define ERROR_SHMAT -2#define ERROR_WAIT -3#define ERROR_FORK -4#define SLOT_TIME 0.005/*截止二进制指数退避算法的实现该算法可以表示为:t=2*τ*r为结点重新发送需要的后退延迟时间;2*τ为冲突窗口值;r为随机数,r的取值范围为[0,2^k-1],k=Min[重传次数,10];当重传16次仍不成功时,则丢弃该帧.*/static unsigned long get_backoff(const int n)//计算重传推迟时间{int k=n;k=16-k;if(k>10)//如果重传次数大于10时,重传次数置为10k=10;return (random()%(1<<k))*SLOT_TIME;//返回重传推迟时间}/*发送数据流程*/static void send_msg(const void *addr, const pid_t pid,char ch){pid_t *bus=(pid_t *)addr;int collision; //冲突计数器int k=0;//发送成功的次数for(int i=0;i<10;i++){collision=16;do{while(*bus!=0);//总线不空闲,循环等待直到总线空闲.usleep(SLOT_TIME/2);//检测到总线为空闲时就开始发送数据,因为线程A和B共享总线变量bus,所以在τ时间以内,另一个线程收不到数据,所以要进行此操作*bus|=pid; //表示另一个进程受收到模拟数据.usleep(SLOT_TIME/2);//从模拟数据发送后经过2τ时间之后进行判断.//判断是否冲突,共享内存与写入内存比较,若相同则无冲突,否则发生冲突.if(*bus!=pid){*bus=0; //复原总线为0collision--;if(collision>0){printf("%d send collision.\n", pid);usleep(get_backoff(collision)); //随机延时}else{printf("%d send failure.\n", pid); //发送失败break;}}else{*bus=0;break;}}while(1);if(collision>0){k++;printf("%d send success.\n", pid);printf("%c send success=%d.\n",ch,k);}usleep(random()%1024);}} /*主函数*/int main(){pid_t pid=0;int bus=0; /*共享内存的ID,用来模拟总线*/void *addr=0; /*指向模拟总线的首地址*/bus=shmget(IPC_PRIVATE, sizeof(pid_t), SHM_R|SHM_W);//获取共享内存if(bus==-1) /*如果申请内存失败*/{perror("shmget error.");return ERROR_SHMGET;}if((pid=fork())<0)//创建子进程a{perror("fork error.");return ERROR_FORK;}else if(pid==0){pid=getpid(); //获取子进程IDaddr=shmat(bus,0,0); //初始化共享内存为\0if(addr==(void*) -1){perror("shmat error");/*shmctl(shmid,IPC_RMID,0)是释放共享内存区,这只有在所有进程中的shmid都已经无效化后才会进行,如果shmid的引用计数没有变为0,就已经调用了shmctl(shmid,IPC_RMID,0),则该函数什么也不做,一直等到最后一个shmdt()调用时,就执行释放共享内存的任务。

相关文档
最新文档