计算机网络课程设计
《计算机网络》教学设计

《计算机网络》教学设计一、教学目标1、知识与技能目标(1)学生能够理解计算机网络的定义、组成和功能。
(2)掌握网络拓扑结构的类型及其特点。
(3)了解网络协议的概念和常见的网络协议。
2、过程与方法目标(1)通过实际案例分析,培养学生解决网络问题的能力。
(2)通过小组讨论和实验,提高学生的团队合作和实践操作能力。
3、情感态度与价值观目标(1)激发学生对计算机网络的兴趣,培养学生的创新意识和探索精神。
(2)培养学生正确使用网络的观念,提高网络安全意识。
二、教学重难点1、教学重点(1)计算机网络的组成和功能。
(2)网络拓扑结构的类型和特点。
2、教学难点(1)网络协议的理解和应用。
(2)网络故障的排查和解决。
三、教学方法1、讲授法讲解计算机网络的基本概念、原理和技术,使学生对网络有初步的了解。
2、案例分析法通过实际案例分析,引导学生将理论知识应用到实际问题中,提高学生的分析和解决问题的能力。
3、小组讨论法组织学生进行小组讨论,促进学生之间的交流与合作,培养学生的团队精神和创新思维。
4、实验法安排学生进行网络实验,让学生亲身体验网络的搭建和配置,加深对网络知识的理解和掌握。
四、教学过程1、导入(5 分钟)通过展示一些与计算机网络相关的图片和视频,如互联网购物、在线教育、远程医疗等,引导学生思考计算机网络在日常生活中的应用,从而引出本节课的主题——计算机网络。
2、知识讲解(30 分钟)(1)计算机网络的定义和组成①讲解计算机网络的定义:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
②介绍计算机网络的组成:包括计算机、通信线路、网络设备(如路由器、交换机等)和网络软件(如操作系统、通信协议等)。
(2)计算机网络的功能①资源共享:包括硬件资源共享(如打印机、存储设备等)、软件资源共享(如应用软件、数据库等)和数据资源共享(如文件、数据库等)。
计算机网络教学设计(精选10篇)

计算机网络教学设计(精选10篇)计算机网络教学设计(精选10篇)作为一名无私奉献的老师,时常需要准备好教学设计,教学设计是一个系统化规划教学系统的过程。
教学设计应该怎么写才好呢?下面是小编精心整理的计算机网络教学设计,仅供参考,希望能够帮助到大家。
计算机网络教学设计篇1教学目标1、探究过程和方法:培养学生阅读科学资料的能力、动手操作能力和语言表达能力2、知识与技能:知道什么是信息指导学生通过阅读、讨论,了解传递和信息方法的发展过程初步认识现代通信网知道保存信息方法的变革促进了人们生活水平的提高3、情感态度:培养学习科学的世界观,正确、科学的探究方法激发学生对现代技术发展为人类生活带来的便捷提出希望,并为此努力教学重难点及解决方法人类信息的传递经过了一个漫长的发展过程,冲“鸿雁传书”“狼烟滚滚”到现在的信息数字化,可以说人类的信息传递方式有了质的飞跃。
特别是近几十年来网络的飞速发展使人类真正实现了沟通的零距离。
本课正是在此基础上,使学生通过对网络的学习了解人类在信息传递方式上的飞速发展。
本课的教学重点是引导学生认识信息保存方法的变革对人类生活的影响课时安排一课时教学准备相关录象资料、挂图、几条新闻录象、磁带、磁盘、光盘、竹简、木简教学流程一、导入1、在我们这个世界里经常有很多事情发生。
就像美国对伊拉克动武这件事情,你是怎么知道的?你知道信息是怎样传递和保存的吗?我们一起来研究板书课题二、教授新课1、介绍信息的传递方法(1)我们先来解决一个问题:什么是“信息”?你认为什么是“信息”?(新闻、消息、知识等)(2)信息是人们生活中不可缺少的一部分,为了能看的远、听的远,人们很早就渴望“千里眼、顺风耳”,于是,人们想出了很多办法来传递信息。
(3)阅读P32第一段2、讨论保存信息的方法和变革给生活带来的影响(1)随着信息的传递向更快、更远、更准的方向发展,人们保存信息的方法也发生了重大变革。
从古到今,聪明的人类想出了什么方法呢?你能不能按照时间的顺序排列出?(2)究竟你列出的顺序对吗?我们一起来揭示答案。
计算机网络技术课程设计

计算机网络技术课程设计一、课程目标知识目标:1. 理解计算机网络的基本概念,掌握网络体系结构、网络协议、网络设备等基本知识;2. 学会使用网络通信协议,了解不同类型的网络拓扑结构及其特点;3. 了解网络信息安全的基本原理,掌握常用的网络防护措施。
技能目标:1. 能够独立搭建简单的网络环境,进行网络设备的配置与调试;2. 学会使用网络诊断工具,分析并解决网络故障;3. 提高信息检索、分析、处理的能力,运用网络资源进行自主学习。
情感态度价值观目标:1. 培养学生的团队协作精神,提高沟通与协作能力;2. 增强网络安全意识,遵循网络道德规范,养成文明上网的良好习惯;3. 激发学生对计算机网络技术的兴趣,培养其探索精神和创新意识。
课程性质:本课程为计算机网络技术的基础课程,旨在让学生掌握计算机网络的基本知识和技能,培养具备实际操作能力及网络素养的人才。
学生特点:本课程面向初中生,学生对计算机网络有一定的好奇心,但知识基础和操作能力有限,需要结合实际案例和实践活动进行教学。
教学要求:注重理论与实践相结合,采用案例教学、任务驱动等方法,提高学生的实际操作能力和解决问题的能力。
同时,关注学生的情感态度价值观的培养,使他们在学习过程中形成良好的网络素养。
通过分解课程目标,为后续的教学设计和评估提供明确的方向。
二、教学内容1. 计算机网络基础知识- 网络体系结构及OSI七层模型- 常用网络协议(TCP/IP、HTTP、FTP等)- 网络设备(交换机、路由器、防火墙等)2. 网络拓扑结构- 星型、总线型、环型、网状等拓扑结构的特点与应用- 网络设备在不同拓扑结构中的配置与调试3. 网络通信协议- IP地址、子网划分、路由选择等概念- 常用网络诊断工具(如ping、tracert等)的使用4. 网络信息安全- 网络攻击手段及防护措施- 加密技术、数字签名等安全机制5. 实践操作- 搭建简单网络环境,进行设备配置与调试- 分析网络故障,排除问题- 网络安全防护实践教学内容安排与进度:第一周:计算机网络基础知识第二周:网络拓扑结构与设备配置第三周:网络通信协议第四周:网络信息安全第五周:实践操作(含总结与评价)教材章节及内容列举:第一章:计算机网络基础第二章:网络拓扑结构与设备第三章:网络通信协议第四章:网络信息安全第五章:实践操作与案例分析教学内容根据课程目标进行科学性和系统性的组织,注重理论与实践相结合,使学生在掌握计算机网络基础知识的同时,提高实际操作能力。
计算机网络课程教案(优质)

计算机网络课程教案(优质)一、教学内容本节课的教学内容来自于教材《计算机网络》的第四章,主要内容包括:网络层服务、路由算法、分组转发与拥塞控制。
本节课将围绕这些内容展开,使学生了解网络层的基本概念,理解路由算法的原理,掌握分组转发与拥塞控制的技术。
二、教学目标1. 让学生掌握网络层的基本服务,理解网络层在计算机网络中的作用。
2. 使学生了解路由算法的种类及原理,提高他们在实际应用中选择合适路由算法的能力。
3. 让学生掌握分组转发与拥塞控制的技术,提高网络传输效率。
三、教学难点与重点重点:网络层服务、路由算法、分组转发与拥塞控制。
难点:路由算法的设计原理、拥塞控制的实现方法。
四、教具与学具准备教具:多媒体教学设备、网络拓扑图、PPT。
学具:笔记本电脑、网络实验设备。
五、教学过程1. 实践情景引入:通过一个网络故障案例,引导学生思考网络层的作用。
2. 教材讲解:详细讲解网络层的服务、路由算法、分组转发与拥塞控制的概念和原理。
3. 例题讲解:分析典型例题,让学生理解路由算法和拥塞控制的应用。
4. 随堂练习:让学生根据所学内容,完成一些相关的练习题,巩固所学知识。
5. 课堂讨论:组织学生就网络层服务、路由算法、分组转发与拥塞控制的技术展开讨论,提高他们的实际应用能力。
6. 网络实验:让学生动手进行网络实验,验证所学知识。
六、板书设计板书内容主要包括网络层服务、路由算法、分组转发与拥塞控制的概念、原理和流程。
通过板书,帮助学生清晰地理解所学知识。
七、作业设计1. 题目:请简述网络层的服务。
答案:网络层的服务主要包括数据传输、路由选择、拥塞控制等。
2. 题目:请解释什么是路由算法。
答案:路由算法是一种用于确定数据包从源节点到目的节点最优路径的算法。
3. 题目:请阐述分组转发与拥塞控制的技术。
答案:分组转发是指网络设备根据数据包的目的地址,将其从一个网络接口转发到另一个网络接口。
拥塞控制是指通过调整网络中的数据流量,防止网络拥塞的发生。
计算机网络课程设计(完整版)

校园网络设计一、设计目的1.通过对网络的具体规划和组建,掌握网络互连设备的使用及工作原理,增加对计算机网络软、硬件组成的感性认识,初步学会典型局域网络的操作和使用技能;2.加深理解网络分层结构概念,尤其是对话层、表示层、应用层等高层协议软件的通信功能、实现方法,掌握网络互连设备的使用及工作原理,掌握IP地址的配置;3.初步掌握局域网的设计技术和技巧培养开发网络应用的独立工作能力,掌握IP 地址的配置及数据传输过程道贺路由的选择。
二、设计方案校园网络设计拓扑图如下所示:网络中心路由器网络配置如下图:中心服务器IP及网关配置如下图:高级管理用户IP及网关配置如下图:一号楼普通用户1的IP及网关配置如下图:三、设计结果与分析1.方案达到目的(1)内网络能够高速访问电子阅览室现实现资源共享功能,不同权限的用户通过网络邻居,电子阅览室或者通过电子阅览室的内网IP地址连接,可以下载和上传资料文件,访问速度完全可以达到客户要求。
同时在外网用户通过通过学校的网站的资料下载链接匿名访问电子阅览室下载课件、软件、资料等,电子阅览室授权用户通过域名,用户名和密码登陆 FTP服务器,使用不同的权限来访问服务器资源。
(2)内建设多媒体教室对外实现实现信息发布,对内实现教学教务管理。
网站发布学校新闻、通知、学校的活动等相关内容,同时提供相关学校教务教学管理,老师、学生、学校领导等相关人员在外网和内网通过不同的域名和授权用户登陆教学教务管理系统,通过网络完成相关工作,缩短工作时间和提高工作效率。
(3)内部用户管理,实现用户的分级管理功能,通过路由器对用户下载和上传做相应的带宽限制。
通过路由器管理功能实现针对老师、学生、领导上网做不同的设置,满足他们的相关要求同时对其访问的网站、使用的上网软件、下载和上传等做不同的限制。
网络内同一IP段内的PC机可以通过网上邻居实现高速互访,传送资料文件等,解决不同楼宇,不同楼层之间通过移动存储设备传送数据费时、费力的问题。
计算机网络的课程设计

计算机网络的课程设计一、课程目标知识目标:1. 让学生理解计算机网络的基本概念,掌握网络的结构、分类及工作原理。
2. 使学生掌握TCP/IP协议的基本原理,了解不同层级的网络协议及其功能。
3. 帮助学生了解网络设备的基本功能,如交换机、路由器等,并掌握其配置方法。
技能目标:1. 培养学生运用所学知识构建小型网络的能力,提高实际操作技能。
2. 培养学生运用网络命令和软件分析网络故障,具备一定的网络维护能力。
3. 提高学生的团队协作能力,通过分组讨论和实践,共同解决问题。
情感态度价值观目标:1. 培养学生对计算机网络技术的兴趣,激发他们探索网络世界的热情。
2. 培养学生具备网络安全意识,遵守网络道德规范,合理使用网络资源。
3. 通过学习计算机网络,使学生认识到科技对社会发展的作用,增强社会责任感。
课程性质分析:本课程旨在让学生深入了解计算机网络的原理和应用,结合实践操作,提高学生的网络技能。
学生特点分析:高中生具有一定的逻辑思维能力和动手操作能力,对新鲜事物充满好奇心,但需引导他们将理论知识与实际应用相结合。
教学要求:1. 注重理论与实践相结合,提高学生的实际操作能力。
2. 创设情境,激发学生的学习兴趣,引导他们主动探究。
3. 强调团队协作,培养学生的沟通能力和协作精神。
二、教学内容1. 计算机网络基本概念:包括网络定义、功能、分类及拓扑结构。
教材章节:第一章 计算机网络概述2. 网络体系结构:学习OSI七层模型和TCP/IP四层模型,了解各层功能及协议。
教材章节:第二章 网络体系结构及协议3. 网络设备与传输介质:介绍常用的网络设备(如交换机、路由器等)及传输介质(如双绞线、光纤等)。
教材章节:第三章 网络设备与传输介质4. 网络协议详解:深入学习TCP/IP协议族,包括IP、TCP、UDP、ICMP等协议。
教材章节:第四章 网络协议5. 网络配置与管理:学习网络设备的配置方法,了解网络管理的基本知识。
计算机网络教学设计精选3篇

计算机网络教学设计精选第一篇:计算机网络教学设计——网络协议一、教学目标1.理解网络协议的概念、作用和分类。
2.掌握TCP/IP协议族的基本结构和特点。
3.熟悉常用的网络协议和其功能。
二、教学内容1.网络协议的概念和作用2.网络协议的分类3.TCP/IP协议族的基本结构和特点4.常用的网络协议和其功能三、教学方法1.理论讲解结合案例2.实验演示3.小组讨论四、教学过程1.引入部分在讲解网络协议之前,先让学生了解网络协议的概念。
并通过案例,引入网络协议的重要性。
2.主体部分(1)网络协议的概念和作用网络协议是指计算机在进行互联网通信时,必须遵守的规则和标准。
它可以定义传输数据的格式、传输速率、传输控制过程、错误处理方法、应用程序接口等多方面的内容,使不同厂商生产的计算机系统能够互相通信。
(2)网络协议的分类网络协议根据不同的分类标准可分为多种,如层次结构、功能分类、应用类型等。
其中,在层次结构上最为常用的是OSI参考模型和TCP/IP参考模型。
(3)TCP/IP协议族的基本结构和特点TCP/IP协议族是互联网的核心协议,由四层组成,分别为应用层、传输层、网络层和数据链路层。
其特点包括:端到端通信、面向连接和独立于传输媒介。
(4)常用的网络协议和其功能常用的网络协议有很多,如HTTP、FTP、SMTP、DNS、TELNET等。
它们分别用于网页浏览、文件传输、电子邮件、域名解析和远程登录等功能。
3.实验部分让学生通过实验,掌握网络协议的具体应用。
4.总结部分在讲解完网络协议的基本知识后,对学生进行总结和归纳。
可以组织小组讨论,让学生发表个人看法和收获。
五、教学评价1.教学效果评价:通过考试或实验,测评学生对网络协议的掌握程度。
2.教学过程评价:通过教学反馈,检查教学过程中存在的问题,并进行改进。
3.教学质量评价:从教学效果和教学过程两个方面综合评价教学质量。
计算机网课程设计

计算机网课程设计一、课程目标知识目标:1. 理解计算机网络的定义、功能及分类,掌握网络的基本工作原理;2. 学会使用网络通信协议,了解不同协议的特点与应用场景;3. 掌握网络拓扑结构,了解常见网络设备的类型及其功能;4. 了解网络安全的基本概念,提高网络安全意识。
技能目标:1. 能够运用所学知识构建简单的局域网,进行网络配置与管理;2. 学会使用网络诊断工具,分析并解决网络故障;3. 掌握网络编程基础,实现简单的网络通信程序;4. 提高信息检索与筛选能力,利用网络资源进行自主学习。
情感态度价值观目标:1. 培养学生对计算机网络技术的兴趣,激发学习热情;2. 增强学生的团队协作意识,培养合作解决问题的能力;3. 培养学生遵守网络道德规范,具备良好的网络素养;4. 增强学生的网络安全意识,提高个人信息保护能力。
课程性质:本课程为计算机科学领域的专业课程,旨在帮助学生掌握计算机网络的基本原理、技术和应用,提高实际操作能力。
学生特点:学生为高中年级,具有一定的计算机操作基础,对计算机网络有一定了解,但缺乏深入的知识和实际操作经验。
教学要求:结合学生特点,注重理论与实践相结合,以实例为主线,引导学生主动参与,培养实际操作能力和解决问题的能力。
通过课程学习,使学生能够达到上述课程目标,为未来进一步学习计算机网络相关知识打下坚实基础。
二、教学内容1. 计算机网络的定义、发展历程、功能与分类;- 课本章节:第一章 计算机网络概述2. 网络通信协议,包括TCP/IP协议、HTTP协议等;- 课本章节:第二章 网络通信协议3. 网络拓扑结构,包括星型、环型、总线型等;- 课本章节:第三章 网络拓扑结构与设备4. 常见网络设备,如交换机、路由器、防火墙等;- 课本章节:第三章 网络拓扑结构与设备5. 局域网的构建与配置;- 课本章节:第四章 局域网技术6. 网络故障分析与诊断;- 课本章节:第五章 网络管理与维护7. 网络编程基础,如Socket编程;- 课本章节:第六章 网络编程8. 网络安全,包括加密技术、认证技术等;- 课本章节:第七章 网络安全9. 网络道德规范与个人信息保护;- 课本章节:第八章 网络道德与法律教学进度安排:- 第1周:计算机网络概述- 第2周:网络通信协议- 第3周:网络拓扑结构与设备- 第4周:局域网技术- 第5周:网络管理与维护- 第6周:网络编程- 第7周:网络安全- 第8周:网络道德与法律三、教学方法针对本课程的教学目标和内容,采用以下教学方法:1. 讲授法:用于讲解计算机网络的基本概念、原理和关键技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学计算机网络原理课程设计报告学生姓名奚培指导教师张士庚学院信息科学与工程学院专业班级计算机科学与技术1303班学号 0902130325 实验日期 2015年11月目录第一章概要设计 (2)第二章详细设计 (3)第三章调试与操作说明 (4)第四章总结 (4)参考文献 (4)第一章概要设计一、过程图1.1 libpcap捕包过程图本程序设计libpcap捕包程序包含以下五个过程,如下图:图1.libpcap 捕包过程1.2 数据包处理过程图图2.数据包处理过程二、主要数据结构2.1 Ether头10Mb/s ethernet headerstruct ether_header{u_int8_t ether_dhost[ETH_ALEN]; // destination eth addr u_int8_t ether_shost[ETH_ALEN]; // source ether addru_int16_t ether_type; // packet type ID field} __attribute__ ((__packed__));2.2 ARP/RARP协议头/* ARP header */class sniff_arp{unsigned short int ar_hrd; /* Format of hardware address. */unsigned short int ar_pro; /* Format of protocol address. */unsigned char ar_hln; /* Length of hardware address. */unsigned char ar_pln; /* Length of protocol address. */unsigned short int ar_op; /* ARP opcode (command). */#if 0/* Ethernet looks like this : This bit is variable sizedhowever... */unsigned char __ar_sha[ETH_ALEN]; /* Sender hardware address. */unsigned char __ar_sip[4]; /* Sender IP address. */unsigned char __ar_tha[ETH_ALEN]; /* Target hardware address. */unsigned char __ar_tip[4]; /* Target IP address. */#endif}2.3 IP头/* IP header */class sniff_ip{u_char ip_vhl; /* version << 4 | header length >> 2 */ u_char ip_tos; /* type of service */u_short ip_len; /* total length */u_short ip_id; /* identification */u_short ip_off; /* fragment offset field */#define IP_RF 0x8000 /* reserved fragment flag */#define IP_DF 0x4000 /* dont fragment flag */#define IP_MF 0x2000 /* more fragments flag */#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */u_char ip_p; /* protocol */u_short ip_sum; /* checksum */struct in_addr ip_src,ip_dst; /* source and dest address */int ip_hl(){ return ip_vhl & 0x0f; }int ip_v(){ return ip_vhl >>4; }}2.4 TCP头/* TCP header */typedef u_int tcp_seq;class sniff_tcp{u_short th_sport; /* source port */u_short th_dport; /* destination port */tcp_seq th_seq; /* sequence number */tcp_seq th_ack; /* acknowledgement number */u_char th_offx2; /* data offset, rsvd *///#define TH_OFF (((th_offx2 & 0xf0) >> 4)u_char th_flags;#define TH_FIN 0x01#define TH_SYN 0x02#define TH_RST 0x04#define TH_PUSH 0x08#define TH_ACK 0x10#define TH_URG 0x20#define TH_ECE 0x40#define TH_CWR 0x80#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)u_short th_win; /* window */u_short th_sum; /* checksum */u_short th_urp; /* urgent pointer */int th_off(){ return ((th_offx2 & 0xf0) >> 4);}int dis_flag(int m){ return (th_flags & m)>>(m-1); }}2.5 UDP头class sniff_udp{u_int16_t uh_sport;u_int16_t uh_dport;u_int16_t uh_len;u_int16_t uh_sum;}三、方法和原理将pcap_open_live(dev,SNAP_LEN,1,1000,errbuf)的第三个参数设为1,即开启混杂模式。
对数据包的分析过程是先通过pcap_loop()传递给回调函数get_packet()一个包头指针packet。
对于10M 以太网来说,Ether header总是14个字节的长度,通过头指针转换成Eher_header类型,可获得Eher header信息。
在判断其负载协议的类型,如果是ARP,就取Apr=(sniff_arp*)(packet+14),来或APR头指针。
类似的,通过指针类型转换和加上偏移量可以获得IP,TCP,UDP的指针。
第二章详细设计一、主要函数说明char * pcap_lookupdev ( char * errbuf );查找本机上的网络接口设备,redhat linux上就返回"eth0"。
参数errbuf为存储出错信息的缓冲区地址。
int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);根据网络接口确定网络逻辑地址和子网掩码地址。
第一个参数就是pcap_lookupdev返回的接口名,二三参数都是32位无符号数, 分别是IP网段和掩码,参数ebuf为容错缓冲区地址。
pcap_t *pcap_open_live(const char *device, int snaplen,int promisc, int to_ms, char *errbuf)获得捕捉句柄。
第一个参数为网络接口,第二参数是捕捉的最大字节数,第三个参数为1表示设置混杂模式,为0非混杂模式,第四个参数包传送过程中的超时,第四个参数为容错缓冲区地址。
int pcap_datalink(pcap_t *p);返回你的网络类型,如DLT_EN10MB 就是10M以太网。
参数*p为pcap_t *pcap_open_live()获得的捕捉句柄。
i nt pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask);编译过滤规则,返回值-1表示出错。
第一个参数为捕捉句柄,第二个参数为过滤器指针,第三个参数为过滤器字符串表示,第三个参数标志是否优化,第四个参数为网络地址。
int pcap_setfilter(pcap_t *p, struct bpf_program *fp);设置过滤器。
第一个参数为捕捉句柄,第二个参数为过滤器结构。
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)循环捕包,并调用callback回调函数对包进行处理。
第一个参数为捕捉句柄,第二个参数为回调函数指针,第三个参数为传递给回调函数的参数,一般设置为NULL。
其中回调函数的格式为:void my_callback(u_char *args,const struct pcap_pkthdr* pkthdr,const u_char* packet);第一个参数为pcap_loop()传递过来的指针,第二参数为libpcap处理过后的数据头指针,第三个指针为包的数据指针。
它们其实都是在pcap_loop()隐含传递给my_callback()的。
二、关键代码1.程序主文件main.cpp#include "sniffer.h"#include <iostream>using namespace std;int main(int argv,char** argc){Sniffer sniff;//参数处理if( argv==2 ){if( *(argc[1])=='?' )cout<<"./sniff [key] [num] [filter]"<<endl;else{sniff.str_key=argc[1];}}else if( argv==3 ){sniff.str_key=argc[1];sniff.num_packets=atoi(argc[2]);}else if( argv>3 ){sniff.str_key=argc[1];sniff.num_packets=atoi(argc[2]);sniff.filter_exp="";for(int i=3;i<argv;i++){string str=argc[i];if( i != (argv-1) )str+=" ";sniff.filter_exp+=str;}}sniff.init();sniff.run();}2.协议文件protocol.h,包含ARP/RARP,IP,TCP,UDP等头部结构的定义#ifndef PROTOCOL_H#define PROTOCOL_H#include <netinet/in.h> //for struct in_addr#include <iostream>#include <cstdio>#include <arpa/inet.h>#include <netinet/in.h>using std::cout;using std::endl;/* ARP header */class sniff_arp{unsigned short int ar_hrd; /* Format of hardware address. */ unsigned short int ar_pro; /* Format of protocol address. */unsigned char ar_hln; /* Length of hardware address. */unsigned char ar_pln; /* Length of protocol address. */unsigned short int ar_op; /* ARP opcode (command). */#if 0/* Ethernet looks like this : This bit is variable sizedhowever... */unsigned char __ar_sha[ETH_ALEN];/* Sender hardware address. */ unsigned char __ar_sip[4]; /* Sender IP address. */unsigned char __ar_tha[ETH_ALEN]; /* Target hardware address. */ unsigned char __ar_tip[4]; /* Target IP address. */#endifpublic:void display(){cout<<"------ARP/RARP:"<<endl;cout<<" Format of hardware address = "<<ntohs(ar_hrd);if( ntohs(ar_hrd)==1 ) cout<<" (10Mb Ethernet)"<<endl;printf(" Format of protocol address = %x",ntohs(ar_pro));if( ntohs(ar_pro)==0x800 ) cout<<" (IP)"<<endl;cout<<" Length of hardware address = "<<int(ar_hln)<<endl;cout<<" Length of protocol address = "<<int(ar_pln)<<endl;cout<<" ARP opcode (comand) = "<<ntohs(ar_op);switch( ntohs(ar_op) ){case 1:cout<<" (ARP request)"<<endl;break;case 2:cout<<" (ARP reply)"<<endl;break;case 3:cout<<" (RARP request)"<<endl;break;case 4:cout<<" (RARP reply)"<<endl;break;default:cout<<" (ARP?)"<<endl;}}};/* IP header */class sniff_ip{u_char ip_vhl; /* version << 4 | header length >> 2 */u_char ip_tos; /* type of service */u_short ip_len; /* total length */u_short ip_id; /* identification */u_short ip_off; /* fragment offset field */#define IP_RF 0x8000 /* reserved fragment flag */#define IP_DF 0x4000 /* dont fragment flag */#define IP_MF 0x2000 /* more fragments flag */#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */u_char ip_p; /* protocol */u_short ip_sum; /* checksum */struct in_addr ip_src,ip_dst; /* source and dest address */int ip_hl(){ return ip_vhl & 0x0f; }int ip_v(){ return ip_vhl >>4; }public:u_short get_len(){ return ip_len; }int display(){cout<<" ----IP:"<<endl;int size_ip=ip_hl()*4;if( size_ip<20 ){cout<<" Invalid IP header length: "<<size_ip<<endl;exit(1);}cout<<" Version = "<<ip_v()<<", header length = "<<size_ip<<" bytes"<<endl;cout<<" Type of service = "<<ntohs(ip_tos)<<endl;cout<<" Total length = "<<ntohs(ip_len)<<endl;cout<<" Identification = "<<ntohs(ip_id)<<endl;cout<<" Flags = "<<ntohs(ip_off)<<endl;cout<<" Time to live = "<<ntohs(ip_ttl)<<endl;cout<<" Protocol = ";switch( ip_p ){case IPPROTO_TCP:cout<<"TCP"<<endl;break;case IPPROTO_UDP:cout<<"UDP"<<endl;break;case IPPROTO_ICMP:cout<<"ICMP"<<endl;break;case IPPROTO_IP:cout<<"IP"<<endl;break;default:cout<<"Unknown"<<endl;exit(1);}cout<<" Checksum = "<<ip_sum<<endl;cout<<" From = "<<inet_ntoa(ip_src)<<endl;cout<<" To = "<<inet_ntoa(ip_dst)<<endl;return size_ip;}u_char get_protocol(){ return ip_p; }};/* TCP header */typedef u_int tcp_seq;class sniff_tcp{u_short th_sport; /* source port */u_short th_dport; /* destination port */tcp_seq th_seq; /* sequence number */tcp_seq th_ack; /* acknowledgement number */ u_char th_offx2; /* data offset, rsvd *///#define TH_OFF (((th_offx2 & 0xf0) >> 4)u_char th_flags;#define TH_FIN 0x01#define TH_SYN 0x02#define TH_RST 0x04#define TH_PUSH 0x08#define TH_ACK 0x10#define TH_URG 0x20#define TH_ECE 0x40#define TH_CWR 0x80#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */u_short th_sum; /* checksum */u_short th_urp; /* urgent pointer */int th_off(){ return ((th_offx2 & 0xf0) >> 4);}int dis_flag(int m){ return (th_flags & m)>>(m-1); }public:int display(){cout<<" ----TCP:"<<endl;int size_tcp = th_off()*4;if (size_tcp < 20){printf(" * Invalid TCP header length: %u bytes\n", size_tcp);exit(1);}cout<<" Src port = "<<ntohs(th_sport)<<endl;cout<<" Dst port = "<<ntohs(th_dport)<<endl;cout<<" Sequence number = "<<ntohs(th_seq)<<endl;cout<<" Acknowledgement = "<<ntohs(th_ack)<<endl;cout<<" Data offset = "<<int(th_offx2)<<endl;cout<<" Flags = "<<int(th_flags)<<endl;cout<<" ......."<<dis_flag(TH_FIN)<<" = FIN"<<endl;cout<<" ......"<<dis_flag(TH_SYN)<<". = SYN"<<endl;cout<<" ....."<<dis_flag(TH_RST)<<".. = RST"<<endl;cout<<" ...."<<dis_flag(TH_PUSH)<<"... = PUSH"<<endl;cout<<" ..."<<dis_flag(TH_ACK)<<".... = ACK"<<endl;cout<<" .."<<dis_flag(TH_URG)<<"..... = URG"<<endl;cout<<" ."<<dis_flag(TH_ECE)<<"...... = ECE"<<endl;cout<<" "<<dis_flag(TH_CWR)<<"....... = CWR"<<endl;cout<<" Windows num = "<<ntohs(th_win)<<endl;cout<<" Checksum = "<<ntohs(th_sum)<<endl;cout<<" Urgent pointer = "<<ntohs(th_urp)<<endl;return size_tcp;}};/* UDP header */class sniff_udp{u_int16_t uh_sport;u_int16_t uh_dport;u_int16_t uh_len;u_int16_t uh_sum;public:int display(){cout<<" ----UDP:"<<endl;cout<<" Source port = "<<ntohs(uh_sport)<<endl;cout<<" Destination port= "<<ntohs(uh_dport)<<endl;cout<<" Udp length = "<<ntohs(uh_len)<<endl;cout<<" Check sum = "<<ntohs(uh_sum)<<endl;return uh_len;}};#endif //protocol.h3.嗅探器实现类的头文件,sniffer.h#ifndef SNIFFER_H#define SNIFFER_Hextern "C" {#include <pcap.h>}#include <iostream>#include <cstdlib>#include <string>#include <vector>#define EXP_LEN 20class Sniffer{private:char* dev;char errbuf[PCAP_ERRBUF_SIZE];bpf_u_int32 net;bpf_u_int32 mask;pcap_t* handle;struct bpf_program fp;void display_net();static void display_ether(const u_char*);static void display_arp(const u_char*);static void display_ip(const u_char*);static void display_tcp(const u_char*,int offset);static void display_udp(const u_char*,int offset);static void display_payload(const u_char*,int);static void print_hex_ascii_line(const u_char*,int,int);void get_input();std::vector<std::string> slip_str(std::string);public:static std::string str_key;int num_packets;std::string filter_exp;public:Sniffer();void init();void run();void err(const char* msg){std::cerr<<msg<<std::endl;exit(1);}static void getpacket(u_char* args,const struct pcap_pkthdr* header,const u_char* packet);};#endif //sinffer.h4.嗅探器实现,sniffer.cpp#include "sniffer.h"#include "protocol.h"#include <sys/socket.h>#include <arpa/inet.h> //for inet_ntoa(),inet_aton() #include <netinet/in.h> //for htons()#include <netinet/if_ether.h>#include <netinet/ether.h> //for ether_header#include <cstdio>#include <cstring>#include <fstream>using namespace std;const int SIZE_ETHER=14;const int CW=25;const int SNAP_LEN=1518;ofstream out("find.txt");//vector<string> keywords;string Sniffer::str_key="name";Sniffer::Sniffer():net(0),mask(0){filter_exp="ip";num_packets=-1;}void Sniffer::display_net(){struct in_addr a1;// struct in_addr a2;a1.s_addr=net;//a2.s_addr=mask;cout<<" Net device: "<<dev<<endl<<" Net: "<<inet_ntoa(a1)<<endl;a1.s_addr=mask;cout<<" Mask: "<<inet_ntoa(a1)<<endl;}void Sniffer::get_input(){cout<<"/*--------------------input values--------------------*/"<<endl;cout<<" Please set the follow values"<<endl<<" key: (the key word you want to get)"<<endl<<" num : (how many packets you want to grab,"<<endl <<" filter: (the packet filter,such as ip)"<<endl<<" such as -1,which means infinite."<<endl <<"-------------------------------------------------------"<<endl;// string str_key;cout<<" Find keyword: "<<str_key<<endl;cout<<"num of packets: "<<num_packets<<endl;cout<<" Filter: "<<filter_exp<<endl;// getline(cin,filter_exp);// cin>>num_packets;// cin>>str_key;//getline(cin,str_key);// keywords=slip_str(str_key);cout<<endl;vector<string> Sniffer::slip_str(string str){int i=0;vector<string> keywords;while( i<(int)str.length() ){int k=i;string temp;while( str.at(i)!=' ' && i<(int)str.length() ){++i;temp+=str.at(i);}if( k<i )keywords.push_back(temp);++i;}return keywords;}void Sniffer::init(){dev=pcap_lookupdev(errbuf);if( dev==NULL ){cout<<"Error:Couldn't find default device:"<<errbuf<<endl;exit(1);}if( pcap_lookupnet(dev,&net,&mask,errbuf)==-1 ){cout<<"Error:Couldn't get netmask:"<<errbuf<<endl;net=0;mask=0;exit(1);}display_net();get_input();}void Sniffer::run()handle=pcap_open_live(dev,SNAP_LEN,1,1000,errbuf);if( handle==NULL ){cout<<"Error:Couldn't open device: "<<dev<<endl;exit(1);}if( pcap_datalink(handle)!=DLT_EN10MB ){cout<<"Error:"<<dev<<" isn't an Ether"<<endl;exit(1);}//set filtersif( pcap_compile(handle,&fp,filter_exp.c_str(),0,net)==-1 ){cout<<"Error:Couldn't parse filter "<<filter_exp<<pcap_geterr(handle)<<endl;exit(1);}if( pcap_setfilter(handle,&fp)==-1 ){cout<<"Error:Couldn't install filter "<<filter_exp<<pcap_geterr(handle)<<endl;exit(1);}//get packets and post them to getpacket()pcap_loop(handle,num_packets,getpacket,NULL);//clean and closepcap_freecode(&fp);pcap_close(handle);}void Sniffer::getpacket(u_char* args,const struct pcap_pkthdr* header,const u_char* packet){static int count = 0; /* packet counter */ cout<<" Packet number: "<<++count<<endl;display_ether(packet);cout<<endl;}/* 10Mb/s ethernet header*struct ether_header*{* u_int8_t ether_dhost[ETH_ALEN]; // destination eth addr * u_int8_t ether_shost[ETH_ALEN]; // source ether addr* u_int16_t ether_type; // packet type ID field *} __attribute__ ((__packed__));*/void Sniffer::display_ether(const u_char* packet){cout<<"--DLC:"<<endl;struct ether_header* e_header;e_header=(struct ether_header*)packet;ether_addr addr;u_int8_t* p1=addr.ether_addr_octet;u_int8_t* p2=e_header->ether_shost;for(int i=0;i<ETH_ALEN;i++,p1++,p2++){*p1=*p2;}cout<<" Ether_shost = "<<ether_ntoa(&addr)<<endl;p1=addr.ether_addr_octet;p2=e_header->ether_dhost;for(int i=0;i<ETH_ALEN;i++,p1++,p2++){*p1=*p2;}cout<<" Ether_dhost = "<<ether_ntoa(&addr)<<endl;cout<<" Ether_type = ";switch( ntohs(e_header->ether_type) ){case ETHERTYPE_ARP:cout<<"ARP"<<endl;display_arp(packet);break;case ETHERTYPE_IP:cout<<"IP"<<endl;display_ip(packet);break;case ETHERTYPE_REV ARP:cout<<"RARP"<<endl;display_arp(packet);break;default:cout<<"Unknown"<<endl;exit(1);}}void Sniffer::display_arp(const u_char* packet){sniff_arp* arp_header;arp_header=(sniff_arp*)(packet+SIZE_ETHER);arp_header->display();}void Sniffer::display_ip(const u_char* packet){sniff_ip* ip_header;ip_header=(sniff_ip*)(packet+SIZE_ETHER);int size_ip=ip_header->display();switch( ip_header->get_protocol() ){case IPPROTO_TCP:display_tcp(packet,size_ip+SIZE_ETHER);break;case IPPROTO_UDP:display_udp(packet,size_ip+SIZE_ETHER);break;case IPPROTO_ICMP:cout<<" ----ICMP"<<endl;break;case IPPROTO_IP:cout<<" ----IP"<<endl;break;default:cout<<" ----Unknown"<<endl;exit(1);}}void Sniffer::display_tcp(const u_char* packet,int offset){sniff_tcp* tcp_header;tcp_header=(sniff_tcp*)(packet+offset);int size_tcp=tcp_header->display();u_char* payload=(u_char *)(packet+offset+size_tcp);sniff_ip* ip_header;ip_header=(sniff_ip*)(packet+SIZE_ETHER);int size_payload = ntohs(ip_header->get_len())-(offset-SIZE_ETHER); if( size_payload>0 ){cout<<"Payload length: "<<size_payload<<" bytes:"<<endl;display_payload(payload,size_payload);}}void Sniffer::display_udp(const u_char* packet,int offset){sniff_udp* udp_header;udp_header=(sniff_udp*)(packet+offset);udp_header->display();}void Sniffer::display_payload(const u_char* payload,int len){int len_rem = len;int line_width = 16; /* number of bytes per line */int line_len;int offset = 0; /* zero-based offset counter */const u_char *ch = payload;if (len <= 0)return;/* data fits on one line */if (len <= line_width) {print_hex_ascii_line(ch, len, offset);return;}/* data spans multiple lines */for ( ;; ) {/* compute current line length */line_len = line_width % len_rem;/* print line */print_hex_ascii_line(ch, line_len, offset);/* compute total remaining */len_rem = len_rem - line_len;/* shift pointer to remaining bytes to print */ch = ch + line_len;/* add offset */offset = offset + line_width;/* check if we have line width chars or less */if (len_rem <= line_width) {/* print last line and get out */print_hex_ascii_line(ch, len_rem, offset);break;}}}/** print data in rows of 16 bytes: offset hex ascii** 00000 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1..*/void Sniffer::print_hex_ascii_line(const u_char *payload, int len, int offset){int i;int gap;const u_char *ch;/* offset */printf("%05d ", offset);/* hex */ch = payload;for(i = 0; i < len; i++) {printf("%02x ", *ch);ch++;/* print extra space after 8th byte for visual aid */if (i == 7)printf(" ");}/* print space to handle line less than 8 bytes */if (len < 8)printf(" ");/* fill hex gap with spaces if not full line */if (len < 16) {gap = 16 - len;for (i = 0; i < gap; i++) {printf(" ");}}printf(" ");/* ascii (if printable) */ch = payload;for(i = 0; i < len; i++){if (isprint(*ch)){printf("%c", *ch);/* vector<string>::iterator it;for( it=keywords.begin();it!=keywords.end();it++ ){int k=0;u_char* p=(u_char*)ch;while( p && k<(int)it->length() && *p==it->at(k) ){p++;i++;}//whileif( k==(int)it->length() ){string f_str;while( *p<123 && *p>79 )f_str+=(*p);out<<(*it)<<f_str<<endl;}}*/int k=0;u_char* p=(u_char*)ch;while( p && k<(int)str_key.length() && (*p)==str_key.at(k) ) {p++;k++;}//whileif( k==(int)str_key.length() ){string f_str;while( p && (*p)>32 && (*p)<123 ){f_str+=(*p);p++;}out<<str_key<<f_str<<endl;}}elseprintf(".");ch++;}printf("\n");return;}第三章调试与操作说明一、调试说明代码修改后要用makefile重新编译连接。