使用ICMP协议来判断UDP端口的存活状态

这篇具有很好参考价值的文章主要介绍了使用ICMP协议来判断UDP端口的存活状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        我们使用了原始套接字(socket.SOCK_RAW)来发送和接收ICMP消息,也就是通过模拟ICMP协议来进行UDP端口的探测。我们构造了一个简单的ICMP数据包,并将其发送到目标主机的特定端口。然后,我们等待接收目标主机返回的ICMP消息,并判断其类型和代码是否为端口不可达消息。如果是,则推断目标端口关闭;如果不是,则认为目标端口开放。

import socket
import os
import struct
import time
 
def udp_port_scan(target_ip, port):
    icmp = socket.getprotobyname("icmp")
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    sock.settimeout(1)  # 设置超时时间为1秒
    
    # 构造ICMP消息
    data = b'abcdefghijklmnopqrstuvwabcdefghi'
    icmp_packet = struct.pack("!BBHHH32s", 8, 0, 0, 0, 0, data)
    
    try:
        sock.sendto(icmp_packet, (target_ip, port))
        start_time = time.time()
        while True:
            try:
                recv_packet, addr = sock.recvfrom(1024)
                end_time = time.time()
                elapsed_time = (end_time - start_time) * 1000  # 计算往返时间
                icmp_header = recv_packet[20:28]
                icmp_type, code, checksum, packet_id, sequence = struct.unpack("!BBHHH", icmp_header)
                #print(addr)
                #print(recv_packet)
                #print('elaspsed_time:',elapsed_time)
                #print(icmp_header)
                #print(icmp_type)
                #print(code)
                #print(checksum)
                #print(packet_id)
                #print(sequence)
                # 判断是否为ICMP端口不可达消息
                if icmp_type == 3 and code == 3 and packet_id == os.getpid() & 0xFFFF:
                    print(f"Port {port} is closed")
                    break
                
                # 此时可以认为端口开放
                print(f"Port {port} is open")
                break
            except socket.timeout:
                print(f"Port {port} is closed.Timeout!")
                break
    finally:
        sock.close()
 
target_ip = '10.233.76.44'
target_ip = '115.236.153.177'
target_ip = '8.8.8.8'
ports_to_scan = [80, 443, 22, 53]  # 要探测的端口列表
 
for port in ports_to_scan:
    udp_port_scan(target_ip, port)

请注意,在使用原始套接字和ICMP协议进行UDP端口探测时,可能需要使用管理员权限运行脚本。同时,由于涉及到底层协议和操作系统的原因,代码在不同的平台和环境中可能会有所调整。文章来源地址https://www.toymoban.com/news/detail-694920.html

到了这里,关于使用ICMP协议来判断UDP端口的存活状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

    TCP/IP网络通信协议最早是由 罗伯特·卡恩 (Robert E. Kahn)和 文顿·瑟夫 (Vinton G. Cerf)于1972年提出的,它是一个实际的协议栈。 OSI七层网络通信协议最早是 由国际标准化组织 (ISO)于1977年提出的,它是一个理论模型。TCP/IP网络通信协议由于其简单性和实用性,成为 事实上

    2024年01月22日
    浏览(74)
  • 对象存活判断

    对象存活判断 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC 才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶

    2024年02月15日
    浏览(51)
  • 安全开发实战(3)--存活探测与端口扫描

    目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3  Three 1.3.4 扫描ip地址,提取出开放端口和协议  ​编辑 1.3.5 批量扫描(最终完成版) 总结                                                              安全开

    2024年04月22日
    浏览(32)
  • socket概述 python中如何使用TCP/UDP协议实现通信-教程

    很多编程语言中,都 使用scoket套接字实现网络通信。 Socket是对TCP/IP协议的封装,Socket本身就是一个调用接口(API),方便程序员用Socket使用TCP/IP协议簇,实现网络通信。 不同编程语言,shiyongSocket通信的语法有所区别,但基本原理类型相似。 它的两种方式,分别是TCP和UDP协

    2024年02月13日
    浏览(42)
  • 《深入理解Java虚拟机》读书笔记:判断对象是否存活

    本节内容的概要如下; 对象已死吗?   给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 客观地说,引用计数算法(Reference Counting)的实现简单,判定效率也很高,在

    2024年02月14日
    浏览(94)
  • Java中网络的基本介绍。网络通信,网络,ip地址,域名,端口,网络通信协议,TCP/IP传输过程,网络通信协议模型,TCP协议,UDP协议

    - 网络通信 概念:网络通信是指 通过计算机网络进行信息传输的过程 ,包括数据传输、语音通话、视频会议等。在网络通信中,数据被分成一系列的数据包,并通过网络传输到目的地。在数据传输过程中,需要确保数据的完整性、准确性和安全性。常见的网络通信协议有T

    2024年02月10日
    浏览(71)
  • JVM 内存分哪几个区,如和判断一个对象是否存活

    JVM 内存分哪几个区,每个区的作用是什么 ? java 虚拟机主要分为以下一个区 : 方法区: 1. 有时候也成为 永久代 ,在该区内很少发生垃圾回收,但是并不代表不发生  GC ,在这里进行的  GC 主要是对方法区里的常量池和对类型的卸载 2. 方法区主要用来存储已被虚拟机加载的类

    2024年02月05日
    浏览(41)
  • 计算机网络——Wireshark软件使用与协议分析(ARP协议、IP与ICMP分析)

            一、实验目的   学习 Wireshark 的基本操作,抓取和分析有线局域网的数据包;掌握以太网 MAC帧的基本结构,掌握 ARP 协议的特点及工作过程。  二、实验内容 使用 Wireshark 抓取局域网的数据包并进行分析: 1. 学习 Wireshark 基本操作:重点掌握捕获过滤器和显示过滤器

    2024年02月05日
    浏览(46)
  • 基于xilinx k7 325t实现的千兆网udp协议,只需要设置好IP,端口,就可以直接给数据

    基于xilinx k7 325t实现的千兆网udp协议,只需要设置好IP,端口,就可以直接给数据,基本等同于透传,可以不用管底层协议。 可以 # FPGA 实现udp模块说明 ## udp_protocol_top gig_ethernet_pcs_pma有脚本生成,任何版本vivado都可以支持,注释里面有对重要信号的说明,默认是1000M,100M需要改内部

    2024年01月16日
    浏览(44)
  • Java Springboot SSE 解决永久存活 判断客户端离线问题

            在生产环境下,服务端的SseEmitter对象在初始化时可以填入参数,以保证其存活时间,一旦超时,客户端会自动断线重连,在这个过程中如果没有做消息队列等缓存手段,就可能会丢数据。         但是如果设置SseEmitter存活时间为永久(参数填0),就会导致服务

    2024年02月01日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包