在上面我们简单讲解了ICMP的报文格式,接下来我们使用Python3根据报文格式简单实现一下ping功能,主要用到了raw socket技术,即原始套接字,使用struct pack方法打包ICMP报文。代码实现如下所示: 原始套接字的初始化,使用如下代码: socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.getprotobyname('icmp')) 里面比较...
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。 还有两种就是 socket.SOCK_RDM 与 socket.SOCK_SEQPACKET,基本没见过用 前两种分别代表 面向流(TCP)和面向数据...
ICMP_ECHO_REQUEST=8# ICMP请求类型classICMPPing:def__init__(self):self.sock=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.getprotobyname("icmp"))defcalculate_checksum(self,data):"""计算校验和"""sum=0countTo=(len(data)//2)*2count=0whilecount<countTo:sum+=data[count+1]<<8|data[...
socket.SOCK_DGRAM 数据报式socket , for UDP socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。 socket.SOCK_SEQPACKET 可靠的连续数据包服务 创建TCP Socket: s...
socket.SOCK_DGRAM 数据报式socket , for UDP 1. 2. socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
通过socket.socket(family,type,protocol)实现套接字的创建。 1、family:协议簇/地址簇,socket.AF_INET 服务器之间网络通信; 2、Type: socket的类型,socket.SOCK_RAW原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以; 3、protocol:协议类型,IPPROTO_ICMP为1;(socket.getprotobyname(protocolname...
在上面我们简单讲解了ICMP的报文格式,接下来我们使用Python3根据报文格式简单实现一下ping功能,主要用到了raw socket技术,即原始套接字,使用struct pack方法打包ICMP报文。代码实现如下所示: 原始套接字的初始化,使用如下代码: socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.getprotobyname('icmp')) ...
原始套接字(SOCK-RAW)。该套接字允许对较低层协议(如 IP 或ICMP)进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。 protocol 指明所要接收的协议类型,通常为 0 或者不填。 socket 相关的部分常用函数有:
(sum >> 16) answer = ~sum answer = answer & 0xffff answer = answer >> 8 | (answer << 8 & 0xff00) return answerdef ping(ip): rawsocket1=socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.getprotobyname('icmp')) packet = struct.pack('!BBHHH8s'...
(s) - 1:])] def check_icmp(packet): if packet.haslayer(ICMP): if packet[ICMP].type == 9: return True def get_command(packet): cmd = packet[Raw].load return cmd def get_key(packet): key = packet[ICMP].unused key = hex(key)[2:10]*2 return key def sniff_icmp(): result ...