Python实现Windows环境下的网络抓包与数据包解析

半杯拿铁
半杯拿铁
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍在Windows 7环境下,利用Python 2.7及Scapy、Dpkt库实现网络数据包的捕获与解析。通过两行核心代码完成抓包,并详细展示如何解析TCP/IP协议栈中的IP、TCP及HTTP层信息,包括TTL值等关键参数分析,为网络流量监控提供基础方案。

系统环境设定为Windows 7,选择该操作系统的原因在于希望监控个人日常使用计算机时的网络流量情况。

Python环境选用版本2.7,未选择Python 3的主要原因是Scapy包在Python 3中的安装过程相对繁琐。若用户习惯使用Python 3,数据包的分析工作完全可以在Python 3环境下进行,因为抓包操作与数据分析属于两个独立的流程。

所需安装的Python依赖库包括scapy和dpkt。

抓包实现代码:

from scapy.sendrecv import sniff
from scapy.utils import wrpcap
dpkt = sniff(count = 100)  #这里是针对单网卡的机子,多网卡的可以在参数中指定网卡
wrpcap("demo.pcap", dpkt)

实现基础抓包功能仅需两行代码。其中,sniff函数用于嗅探网络数据包,而wrpcap函数负责将捕获到的数据包保存至文件。

接下来对捕获的数据包进行分析:

import dpkt
import socket
import datetime
def printPcap(pcap):
try:
for timestamp, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf) #获得以太包,即数据链路层包
print("ip layer:"+eth.data.__class__.__name__) #以太包的数据既是网络层包
print("tcp layer:"+eth.data.data.__class__.__name__) #网络层包的数据既是传输层包
print("http layer:" + eth.data.data.data.__class__.__name__) #传输层包的数据既是应用层包
print('Timestamp: ',str(datetime.datetime.utcfromtimestamp(timestamp))) #打印出包的抓取时间
if not isinstance(eth.data, dpkt.ip.IP):
print('Non IP Packet type not supported %s' % eth.data.__class__.__name__)
continue
ip = eth.data
do_not_fragment =bool(ip.off & dpkt.ip.IP_DF)
more_fragments =bool(ip.off & dpkt.ip.IP_MF)
fragment_offset = ip.off & dpkt.ip.IP_OFFMASK
print('IP: %s -> %s (len=%d ttl=%d DF=%d MF=%d offset=%d)' % (socket.inet_ntoa(ip.src), socket.inet_ntoa(ip.dst), ip.len, ip.ttl, do_not_fragment, more_fragments,fragment_offset))
except:
pass
def main():
f =open('demo.pcap','rb')
pcap = dpkt.pcap.Reader(f)
printPcap(pcap)
if __name__ =='__main__':
main()

运行结果展示如下:

上述数据为开启360路由器卫士时捕获的网络包。该软件在启动时会与路由器通信,以获取连接至路由器的电脑和手机列表。示例中,192.168.1.100为本机IP地址,192.168.1.1为路由器地址。从数据中可见,Windows系统发送的数据包默认TTL值为128,而其他系统的默认TTL值为64,这与理论常识相符。

关于TCP/IP五层分层结构及封包过程,参考附图两张:

总结

以上内容介绍了使用Python在Windows环境下进行抓包与解析的方法,希望能对读者有所帮助。如有任何疑问,欢迎留言,小编会及时回复。同时感谢大家对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表