python 计算机网络课程设计(网络主机扫描程序)

我们的运行环境是pycharm

目录

背景

随着网络技术的发展,越来越多的计算机接入互联网上,网络安全逐渐成
为一个潜在的巨大问题,如何保障自身的网络安全,其中一个主要的方法就是
自查自纠,而在这个过程中,对自己的网络活动主机扫描成为一种较为快捷,
直观,简单的方法。本次课程设计就是对网络主机扫描技术的研究以及实现,
其中技术包括 ARP ICMP TCP UDP 网络协议的网络活动主机扫描。
利用 ARP 协议获取活动主机的 mac 地址,当获取的不为 ”00-00-00-00-00-00”
时,则是主机可达到,认为是活动主机;利用 ICMP 协议,使用系统自带的 ping
程序功能,当且 ping 通目标主机时,认为是活动主机;基于 TCP 的链接状态,
当判断连接成功,认为是主机活动主机; UDP 是不可靠传输,给目标主机发送
消息,能狗看得到返回的消息,则主机可达到,则认为是活动主机。通过四种
不同的协议,不同的方法都可以得到网络上的活动主机号;

需求分析

网络安全扫描技术是类 重要的网络安全技术。安全扫描技术与防火墙、入侵
检测系统互相配合,能够有效提高网络的安全性。安全扣描是一种主动的防范
措施,可以有效避免黑客攻击行为,做到防患于未然,网络安全扫描的首要任
务是发现网络中活动的主机。对活动主机扫描就是向主机发送特定的数据报,
若主机有响应消息返回则说明该主机处于活动状态,否则主机不存在或处于关
机状态。当主机安装的防火墙软件进行了访问控制时 ( 例如禁用了 Ping 响应或者
禁用了所有的 ICMP 响应 ) ,这时使用常用的扫描方法就不起作用了,就需要使
用其它的方法进行探测。网络扫描的基础是互联网的协议,通过对协议的分析
找到适合网络扫描的协议类型和消息类型。根据互联网的协议标准构造特定类
型的数据报,把这些数据报发送到日的主机,从响应消息中提取信息。整个扫
描过程都是基于这种请求一应答 - 分析机制进行的

扫描技术

主机打描的目的是确定在口标网络上的主机是否可达,现行主要技术
有:ICMP Echo 扫描、TCP connect()扫描、UDP 回馈和 ARP 获取适配器编号扫
描,并日通计多线程,提向了扫描效率

基于 ICMP 协议的活动主机扫描

1.ICMP Echo 扫描精度相对较高。通过简单地向目标主机发送 ICMP
Echo
Request 数据包、并等待回复的 ICMP
Eche Reply 包,如 Ping.
2.ICMP
Sweep
扫描: Swepp 这个词的动作很像机枪扎射,ICMP 进行扣射式
的打描,就是并发性扫描,使用 ICMP
Echo
Request 一次探测多台主机,通
常这种探测包会并行发送,以提高探测效率,适用于人范围的评估
3.Broadcast
ICMP 扫措:广播型 ICMP 扫描,利用了一些主机在 ICMP 实现上的差
异,设置 ICMP 请求包的口标地址为广播地址或网络地址,则可以探测广播域或
整个网络范国内的主机,子网内所有有活主机都会给以回应。
4.Non-Echo ICMP 扫描:在 ICMP 协议中不仅只有 ICMP-ECHO 的 ICMP 查询信息类
型,在 ICMP 扫描技术中也用到 Non-ECIO-ICMP 技术(不仅仅能探测主机,也可
以探测网络设备如路山)。利用了 ICMP 的服务类型(Timestamp 和 Timestamp
Reply Information Request 和 Information-Reply,Address-Mask-Requesl 和
Address-Mask-Reply)。

程序功能流程图

 函数的设计与程序

图形化界面库——tkinter 库
tkinter 库是 Python 里自带的图形化库,可以在大多数 Unix 平台以及 Windows
系统上使用。在 Tkinter 库中有着许多接口模块,而这些接口模块分别实现不
同的功能。
表格制作库——ttk.Treeview 库
在 ttk.Treeview 库是 Python GUI 里的一个基本表格输出库,它能够使开发人员
轻松构建表格,将数据以表格化的形式输出。
TreeView 组件是一个树状结构和表格的结合体。第一列是树状结构,后几列是列表。
每一行表示一个 item,树的 item 可以分级,每个 item 有子 item,名称对应 text 标签。
每一行的值用 values 元组里的值表示。
item 有 5 个标签,分别是:text,image,values,open,tags。
在该程序里,我使用 TreeView 组件构造了子网划分结果的表格,其主要代码如下所示:
table = ttk.Treeview(win, show="headings", ) # 定义表格
table['columns'] = ['序号', '主机活跃号', '主机活跃端口'] # 定义
表头
table.pack()
# 下面代码为设计每一列的宽度
table.column('序号', width=100, anchor='center')
table.column('主机活跃号', width=500, anchor='center')
table.column('主机活跃端口', width=300, anchor='center')
table.column('花费总时间', width=100, anchor='center')
# 定义表头内容
table.heading('序号', text='序号')
table.heading('主机活跃号', text='主机活跃号')
table.heading('主机活跃端口', text='主机活跃端口')
#下面代码为设计每一列表格的表头显示的文字
# 定义文本输入框
bin1 = Button(win, text='开始检测', command=run)
bin2 = Button(win, text='数据库保存', command=run2)
bin3 = Button(win, text='数据库查询', command=run3)
bin4 = Button(win, text='清空数据库', command=run4)
4.1.2 Button 函数
7 桂林航天工业学院本科课程设计报告
Button()函数常用于制作事件按钮,当用户点击 Button 按钮时,程序便
会根据预设来执行特定的事件,完成预期的事件。在此程序里,Button 按钮用
来触发 run()函数,以完成子网划分任务。其代码如下所示:
# 定义文本输入框
bin1 = Button(win, text='开始检测', command=run)
bin2 = Button(win, text='数据库保存', command=run2)
bin3 = Button(win, text='数据库查询', command=run3)
bin4 = Button(win, text='清空数据库', command=run4)
# 定义界面按钮,模块的位置及大小
bin1.place(relx=0.1, rely=0.8, relwidth=0.4, relheight=0.1)
bin2.place(relx=0.55, rely=0.8, relwidth=0.4, relheight=0.1)
bin3.place(relx=0.55, rely=0.6, relwidth=0.4, relheight=0.1)
bin4.place(relx=0.1, rely=0.6, relwidth=0.4, relheight=0.1)

数据库的应用和程序

SQLite 是一款轻量级的、基于文件的嵌入式数据库,实现自包容、零配置、
支持事务的 SQL 数据库引擎。与其他数据库管理系统不同,SQLite 的安装和运
行非常简单,在大多数情况下,只要确保 SQLite 的二进制文件存在即可开始创
建、连接和使用数据库。第一个 Alpha 版本诞生于 2000 年 5 月,直到今天已经
成为最流行的嵌入式数据库,包括 Google 在内的许多公司在其桌面软件中亦使
用 SQLite 存储用户数据,由此看来,其稳定性毋庸置疑。
实际应用中,SQLite 作为目前最为流行的开源嵌入式关系型数据库,在系
统的架构设计中正扮演着越来越重要的角色。和很多其它嵌入式 NoSQL 数据库
(如 BerkeleyDB、MemBASE 等)不同的是,SQLite 支持很多关系型数据库的基本
特征,如标准 SQL 语法、事务、数据表和索引等,这在数据移植、程序演示等
应用中有着不可替代的优势。从官方文档中我们可以获悉到,SQLite 支持的数
据量和运行效率都是非常骄人的,因此在海量数据的解决方案中,SQLite 可以
作为数据预计算的桥头堡,从而显著减少存储在关系型数据库服务器中的数据
数量,最终提高系统的查询效率和运行期效率,同时也可以显著的降低数据备
份的磁盘开销
#######################
###本程序只用于学习交流无用于其它用途
###有需要请联系博主QQ:2397746994
#######################

#部分代码如下

from tkinter import *
from tkinter import ttk
from multiprocessing.pool import ThreadPool
import subprocess
import socket
import sqlite3
import time
THREADING_NUM = 100 # 定义线程数

pool = ThreadPool(THREADING_NUM) # 定义线程池
Activity_IP = []
filename = 'ip.txt'
def get_host()

运行界面如下:

 

 

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值