Scrapy IP()类 编程指南(基础)

Scrapy IP()类 编程指南(基础)

IP简介

工欲善其事,必先利其器,在聊Scapy IP类时,我们先要了解IP是什么。

R-C

IP指的是Internet Protocol(互联网协议)的数据包。Internet Protocol是互联网上用于在网络中传输数据的一种协议。在TCP/IP协议族中,IP层负责数据包的路由和寻址,确保数据能够在网络中正确传递。

IP协议定义了一种在网络中唯一标识设备(主机或路由器)的方式,并提供了一种将数据分割成小的数据包进行传输的机制。每个数据包都包含源和目标设备的IP地址,以便路由器能够正确地将数据包从源传输到目标。

IP协议又分为IPv4IPv6,两个版本,IPv6可以理解为IPv4的升级版,但它们又有所不同,它的出现,是为了解决IPv4地址即将耗尽的问题,日后也会详细说明IPv6,今天我们主要的对象就是IPv4

在IPv4协议中,IP地址主要被分为五个类别,通常称为IP地址的分类。这些分类是基于地址的网络部分的位数,以及主机部分的位数。这五个主要的IP地址分类是:A类、B类、C类、D类和E类。

  1. 类A地址
    • 范围:1.0.0.0 到 126.255.255.255
    • 特点:第一个字节(8位)用于网络部分,剩余的三个字节(24位)用于主机部分。
    • 可用网络:2^7 - 2 = 126,因为0和127保留作为特殊用途。
  2. 类B地址
    • 范围:128.0.0.0 到 191.255.255.255
    • 特点:前两个字节(16位)用于网络部分,后两个字节(16位)用于主机部分。
    • 可用网络:2^14 - 2 = 16,382
  3. 类C地址
    • 范围:192.0.0.0 到 223.255.255.255
    • 特点:前三个字节(24位)用于网络部分,最后一个字节(8位)用于主机部分。
    • 可用网络:2^21 - 2 = 2,097,150
  4. 类D地址
    • 范围:224.0.0.0 到 239.255.255.255
    • 特点:用于多播(Multicast)通信,不分配给单个主机或网络。
  5. 类E地址
    • 范围:240.0.0.0 到 255.255.255.255
    • 特点:保留作为将来使用的实验和开发。

IP报文头

在Scapy中,IP报文头与IP()类直接相关。IP()类用于创建和处理IPv4报文头,它是Scapy中用于构建IPv4数据包的类。使用IP()类,我们可以轻松地定义IPv4数据包的各种属性,如源地址、目标地址、协议类型等。

在这里插入图片描述

版本(Version)

  • 占4位。
  • 指定IP协议的版本,IPv4的版本号为4。

头部长度(IHL - Internet Header Length)

  • 占4位。
  • 指定IPv4头部的长度,以32位字(4字节)为单位。由于IPv4头部中最少有20字节,因此该字段的值至少为5(表示20字节)。

服务类型(Type of Service - TOS)

  • 占8位。
  • 用于指定服务质量,包括优先级、延迟、吞吐量和可靠性。

总长度(Total Length)

  • 占16位。
  • 指定整个IPv4数据包的长度,包括头部和数据。最大长度为65,535字节。

标识(Identification)

  • 占16位。
  • 用于将相关的数据包片段组合成完整的数据包。

标志位(Flags)

  • 占3位。
  • 包含“不分片(Don’t Fragment)”和“更多片段(More Fragments)”标志。

片偏移(Fragment Offset)

  • 占13位。
  • 指定数据包片段在原始数据包中的偏移量。

生存时间(Time to Live - TTL)

  • 占8位。
  • 限制数据包在网络中的生存时间,每经过一个路由器,该字段值减一。当TTL为0时,数据包被丢弃。

协议(Protocol)

  • 占8位。
  • 指定上层协议,例如TCP(6)、UDP(17)、ICMP(1)等。

头部校验和(Header Checksum)

占16位。

用于检测IPv4头部的错误,主要是检测在传输过程中头部信息是否损坏。

源地址(Source Address)

占32位。

指定数据包的源IP地址。

目标地址(Destination Address)

占32位。

指定数据包的目标IP地址。

选项(Options)

可选字段,用于提供一些额外的信息。通常很少被使用,因为IPv4头部本身已经包含了足够的信息。

Scapy IP()使用

而在Scapy中,IP报文头与IP()类直接相关。IP()类用于创建和处理IPv4报文头,它是Scapy中用于构建IPv4数据包的类。

以下是IP()类的一些常用属性:

  1. src:指定源IP地址。
#两种方式指定
IP(src="x.x.x.x")#构造函数指定ip_packet = IP() #构造空参数
ip_packet.src = "x.x.x.x" #成员属性指定
  1. dst:指定目标IP地址
#两种方式指定
IP(dst="x.x.x.x")#构造函数指定ip_packet = IP() #构造空参数
ip_packet.dst = "x.x.x.x" #成员属性指定
  1. proto:指定上层协议,例如TCP、UDP等。
#两种方式指定
IP(proto="TCP")#构造函数指定ip_packet = IP() #构造空参数
ip_packet.proto = "TCP" #成员属性指定
  1. ttl:设置Time-to-Live值。
#两种方式指定
IP(ttl="5")#构造函数指定ip_packet = IP() #构造空参数
ip_packet.ttl = 5 #成员属性指定
  1. tos:设置Type of Service值。
#两种方式指定
IP(tos=0b10101010)#构造函数指定ip_packet = IP() #构造空参数
ip_packet.tos = 0b10101010 #成员属性指定
  1. ihl:设置IP报文头长度(通常不需要手动设置)。
#两种方式指定
IP(ihl=5)#构造函数指定ip_packet = IP() #构造空参数
ip_packet.ihl = 20 #成员属性指定
  1. flags:设置IP标志位。
#两种方式指定
IP(flags="MF")#构造函数指定ip_packet = IP() #构造空参数
ip_packet.src ="MF"#成员属性指定
  1. options:设置IP报文头的选项字段。
#两种方式指定
IP(options=[(1, 1, b'\x01')])#构造函数指定ip_packet = IP() #构造空参数
ip_packet.src = [(1, 1, b'\x01')] #成员属性指定

Scapy IP() 实战使用

IP有这么多头部字节,我们用的最多也就是src源地址和dst目的地址,它们决定着,我们的数据包,由谁发起,又要发送到哪里。现在我们使用Scapy来构造一个IP头。

from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr1# 创建一个包含IP和ICMP协议的数据包,也就是ping包
ip_packet = IP(dst="192.168.30.55") / ICMP()# 发送数据包并等待响应
response = sr1(ip_packet)# 打印响应信息
response.show()

image-20240126220522919

如果我将src源IP地址,修改在发送,再来查看结果

from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr1ip_packet.src = '123.123.222.111'send_ip = sr1(ip_packet)

image-20240126223609023

这里可能有人就有疑问了,源IP我明明已经修改为123.123.222.111,为什么还会有响应包?这里就牵扯到交换机的原理以及ARP的知识了。

交换机是一个二层设备,为什么说它是二层设备呢,因为交换机的基础功能就是处理OSI网络模型中的第二层(数据链路层),在数据链路层来说,它更关心是MAC物理地址的交换,它在工作过程中维护一张关键的表格。

MAC地址表:

  • 它是一个用于存储设备MAC地址与物理端口对应关系的表格。当交换机收到一个帧(数据包)时,它会查看帧中的目标MAC地址,并将这个MAC地址与接收到帧的端口进行关联,更新MAC地址表。这样,交换机就知道将数据帧发送到哪个端口,以便正确地转发数据。

MAC地址就是设备的独特标签,IP地址是用于在网络中找该设备的逻辑地址,而怎么通过设备的逻辑地址去找到这台设备呢,这就要通过ARP协议来解决了。ARP协议可以帮助你根据一个逻辑地址找到具体设备的物理设备,以便进行直接通信。在主机系统一般都会存在一个ARP表作用如下:

ARP表:

  • 它用于存储IP地址与对应的MAC地址之间的映射关系。当设备需要与网络中的其他设备通信时,它首先会查看自己的ARP表。如果在ARP表中找不到目标设备的IP地址对应的MAC地址,设备就会发起ARP请求,请求网络中其他设备告知它目标设备的MAC地址。

因为我们没有构造二层Ether包,所以这个数据包的mac地址会以默认接口的MAC地址认作缺省值(默认属性)进行发送,当这个包经过交换机时,交换机会读取该数据包的目的MAC信息,发现目的MAC信息全为F就为广播包,他就会向所有端口发送ARP广播报文,询问谁是192.168.30.55,,找到相应的接口进行二层转发,当数据包到达目的后,目标主机会先检查数据包的源MAC地址,并在本机的ARP表中查找对应的MAC与IP绑定关系,完成接收后,目标主机会根据请求包中的源IP、源MAC构造一个响应包发给源主机

这就解释了,为什么我随便设置的Ip还能得到响应报文的问题。

image-20240126234635509

最后给出一个由ScapyIP()类编写的超级Ping工具:

# coding=utf-8
"""
@Author: 迪奥布斯
@create time : 2024/1/27
@超级ping
"""
import re
import timefrom scapy.config import conf
from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr, sr1ips = []def order_ip(ip):ip_source, ip_num = ip.rsplit('.', 1)start, end = ip_num.split('-')if start > end:tmp = startstart = endend = tmpip_list = [ip_source + '.' + str(num) for num in range(int(start), int(end))]return ip_listdef num_ip(ip):b = ip.split(',')a = set(b)return list(a)def ip_run(ip):return [ip]def check_ip_format(ip):patterns = {"ipv4": (re.compile(r'^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$'), ip_run),"ip_range": (re.compile(r'^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}-(25[1-5]|2[0-4]\d|1\d\d|[1-9]?\d)$'),order_ip),"multiple_ips": (re.compile(r'(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}-(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)|(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})(?:,(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}-(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)|(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))*$'), num_ip),}matched = Falsefor pattern_type, (pattern, fun) in patterns.items():if pattern.match(ip):ips.append(fun(ip))matched = Truebreakif not matched:print("输入的IP无效,请重新输入!")exit()def send_icmp(ip, interface):# 构建 ICMP 请求包ping_pkt = IP(dst=ip) / ICMP(id=1000)try:# 发送 ICMP 请求并等待响应 ntime.sleep(0.5)start_time = time.time()ip_response = sr1(ping_pkt, timeout=1, verbose=False, iface=interface)end_time = time.time()if ip_response is not None:ttl_sys = {255: 'Ulinx系统(交换机、路由器)',128: 'Windos系统',64: 'MacOS/Linux'}for ttl_num, sys_name in ttl_sys.items():if ip_response[IP].ttl == ttl_num:sys = sys_nameprint(f'{ip_response[IP].src} ---> 可达,{ip_response[IP].ttl} ---> 跳数,它是{sys},花费 {(end_time - start_time) * 1000:0.1f} 毫秒')else:print(f'{ip} ---> 无响应')except Exception as e:print(f'发生错误: {e}')exit()def start_main(ip, num, interface):check_ip_format(ip)if len(ips[0]) < 2:a = num * len(ips[0])b = a - numwhile not a == b:send_icmp(ips[0][0], interface)a -= 1elif len(ips[0]) >= 2:a = num * len(ips[0])for ip_num in ips[0]:b = a - numwhile not a == b:send_icmp(ip_num, interface)a -= 1def tiShi():print("*" * 80)print("目前可以实现功能,多IP范围ping主机判断主机系统")print("IP输入格式为:")print("单个IP:192.168.0.1")print("范围IP:192.168.0.1-255")print("多个IP:192.168.0.1,192.168.0.2")print("ping的次数,默认为4次")print("指定网卡接口:不指定为默认网卡")print("指定接口为网卡名称,例如:windows的网卡名称“以太网”或“以太网1,linux的网卡名”eth0“或”ens0“")print("*" * 80)def user_input():tiShi()while True:target_ip = input('请输入你要ping的ip:')target_num = input('请输入要ping的次数:').strip()if not target_num or not target_num.isdigit():ai = 4print(f"输入为空,设置默认值为: {ai}", end='')else:try:ai = int(target_num)print(f"转换后的整数值为: {ai}", end='')except ValueError:print("输入无效,无法转换为整数。", end='')print(target_num)target_interface = input("请输入网卡名称:")if target_interface == '':target_interface = conf.ifaceprint('输入为空为默认网卡:', conf.iface.name)start_main(target_ip, ai, target_interface)if __name__ == '__main__':user_input()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot系列之JPA实现按年月日查询

SpringBoot系列之JPA实现按年月日查询 通过例子的方式介绍Springboot集成Spring Data JPA的方法&#xff0c;进行实验&#xff0c;要先创建一个Initializer工程&#xff0c;如图&#xff1a; 选择&#xff0c;需要的jdk版本&#xff0c;maven项目 选择需要的maven配置&#x…

pytest参数化

一、pytest.mark.parametrize介绍 pytest.mark.parametrize(argnames, argvalues, indirectFalse, idsNone)参数说明&#xff1a; argnames: 一个或多个参数名&#xff0c;用逗号分隔的字符串&#xff0c;如"arg1,arg2,arg3"&#xff0c;参数名与用例入参数一致。 a…

Android读写文件,适配Q以上

Android Q升级了文件系统&#xff0c;访问文件不仅仅是说动态权限了&#xff0c;有各种限制。权限什么的就不赘述了&#xff0c;下面介绍一下在10以上的系统中访问文件。 首先是打开文件管理器 /*** 打开文件管理器 存储卡和外接U盘都可以访问*/public void openFileManager()…

什么是JSON

什么是JSON JSON&#xff1a;JavaScript Object Notation 【JavaScript 对象表示法】 JSON 是存储和交换文本信息的语法。类似 XML。 JSON采用完全独立于任何程序语言的文本格式&#xff0c;使JSON成为理想的数据交换语言S 为什么需要JSON 提到JSON&#xff0c;我们就应该和…

代码块(Java)

代码块是类的成分之一&#xff0c;分为静态代码块和实例代码块 1.静态代码块&#xff1a;static{} 类加载时会自动执行一次&#xff0c;可以完成类的初始化&#xff0c;比如初始化赋值 2.实例代码块&#xff1a;{} 每次创建对象时&#xff0c;执行实例代码块&#xff0c;会…

探索圆的面积计算器:神秘数学背后的无限魅力

导语&#xff1a;自古以来&#xff0c;圆形在人类文明中扮演着重要角色。从建筑、工程设计到日常生活&#xff0c;圆的面积都是一个不可或缺的元素。本文将带您深入了解圆的面积&#xff0c;从起源、应用场景到计算方法&#xff0c;让您领略数学的无穷魅力。 一、圆的面积是什…

java金额数字转中文

java金额数字转中文 运行结果&#xff1a; 会进行金额的四舍五入。 工具类源代码&#xff1a; /*** 金额数字转为中文*/ public class NumberToCN {/*** 汉语中数字大写*/private static final String[] CN_UPPER_NUMBER {"零", "壹", "贰",…

CMake构建Qt工程

在https://blog.csdn.net/fengbingchun/category_12172633.html 上有直接通过vs2022建的Console、Widgets、Quick三个工程&#xff0c;这里增加通过CMake构建。 build.sh内容如下&#xff1a; #! /bin/bashif [ $# ! 1 ]; thenecho "Error: requires one parameter: Rele…

基于springboot网上书城交易平台源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上书城管理系统的网络应用&#xff0c;在国外网上书城管理系统已经是很普遍的方式&#xff0c;不过国内的书城管理系统可能还处于起步阶段。网上书城管理系统具有网上书城信…

Spring扩展点在微服务应用(待完善)

ApplicationListener扩展 nacos注册服务&#xff0c; 监听容器发布事件 # 容器发布事件 AbstractAutoServiceRegistration#onApplicationEvent # 接收事件吗&#xff0c;注册服务到nacos NacosServiceRegistry#register Lifecycle扩展 #订阅服务实例更改的事件 NamingService#…

【开源】基于JAVA的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

【数据结构】栈、队列、数组、列表

数据结构是什么&#xff1f; 数据结构是计算机存储、组织数据的方式 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。一般情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者…

MongoDB日期存储与查询、@Query、嵌套字段查询实战总结

缘由 MongoDB数据库如下&#xff1a; 如上截图&#xff0c;使用MongoDB客户端工具DataGrip&#xff0c;在filter过滤框输入{ profiles.alias: 逆天子, profiles.channel: }&#xff0c;即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求&#xff1a;用Java代码来查询…

LeetCode.2861. 最大合金数

题目 题目链接 分析 这道题目一定要多读几遍&#xff0c;才能理解。 大意就是你有钱budget 和 库存stock的金属零件&#xff0c;让你从一堆机器里面选择一种机器可以合成最多金属的数量是多少&#xff0c;这些机器合成金属需要的零件数目是不一样的&#xff0c;composition…

程序员必备!10款实用便捷的Git可视化管理工具

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。我们在团队开发中统一某个开发工具的使用能够大大降低沟通成本&#xff0c;提高协作沟通效率。今天给大家分享10款实用便捷的Git可视化管理工…

(免费领源码)java#SSM#mysql疫情时期人员流调平台69124-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1研究意义 1.2开发现状 1.3系统开发技术的特色 1.4 ssm框架介绍 1.5论文结构与章节安排 2 疫情时期人员流调平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1…

VisionMaster图像拼接功能实现

由于硬件或安装环境限制&#xff0c;单个相机视野无法覆盖整个视野&#xff0c;但实际应用需要全视野图像时&#xff0c;可以拍摄物体的多个部分拼接成一张整图。VM提供图像拼接工具对图像进行拼接。 使用标定图进行标定建模是最重要的一步&#xff0c;成功标定后可以将图像无…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-帖子管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

【c++】高精度算法(洛谷刷题2024)扫雷游戏详解

系列文章目录 第二题&#xff1a;扫雷游戏 视频讲解&#xff1a;http://【洛谷题单 - 算法 - 高精度】https://www.bilibili.com/video/BV1Ym4y1s7BD?vd_source66a11ab493493f42b08b31246a932bbb 文章目录 目录 系列文章目录 文章目录 前言 一、题目分析以及思考 二、代…

多维时序 | Matlab实现CNN-BiGRU-Mutilhead-Attention卷积双向门控循环单元融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-BiGRU-Mutilhead-Attention卷积双向门控循环单元融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiGRU-Mutilhead-Attention卷积双向门控循环单元融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一…