抓包、python网络编程之tcp、udp例子

本文介绍了如何使用tcpdump进行网络抓包,包括常用参数如监听网卡、显示主机和端口等,并提到了Wireshark这一强大的抓包工具。接着,文章探讨了Python的网络编程,特别是套接字的使用,区分了面向连接和无连接的套接字类型,并列举了三个网络编程实例,涉及本机TCP通信、不同网段TCP通信以及UDP本地通信。

抓包

tcpdump

  • 可以将网络
  • -i:interface监听网卡

-

[root@server5 ~]# tcpdump -i ens33 
11:09:26.967399 IP server5.example.com.ssh > localhost.53420: Flags [P.], seq 3438092:3438272, ack 521, win 251, length 180

- - nn:以ip和port方式显示来源主机和目的主机

-

[root@server3 ~]# ping -c 5 192.168.109.138
PING 192.168.109.138 (192.168.109.138) 56(84) bytes of data.
64 bytes from 192.168.109.138: icmp_seq=1 ttl=64 time=1.50 ms
64 bytes from 192.168.109.138: icmp_seq=2 ttl=64 time=0.215 ms
64 bytes from 192.168.109.138: icmp_seq=3 ttl=64 time=0.584 ms
64 bytes from 192.168.109.138: icmp_seq=4 ttl=64 time=0.236 ms
64 bytes from 192.168.109.138: icmp_seq=5 ttl=64 time=0.226 ms
root@server5 ~]# tcpdump -i ens33 -nn 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
11:13:52.860920 IP 192.168.109.131 > 192.168.109.138: ICMP echo request, id 25157, seq 1, length 64
11:13:52.860972 IP 192.168.109.138 > 192.168.109.131: ICMP echo reply, id 25157, seq 1, length 64
11:13:53.862829 IP 192.168.109.131 > 192.168.109.138: ICMP echo request, id 25157, seq 2, length 64
11:13:53.862874 IP 192.168.109.138 > 192.168.109.131: ICMP echo reply, id 25157, seq 2, length 64
11:13:54.864056 IP 192.168.109.131 > 192.168.109.138: ICMP echo request, id 25157, seq 3, length 64
11:13:54.864115 IP 192.168.109.138 > 192.168.109.131: ICMP echo reply, id 25157, seq 3, length 64
11:13:55.864911 IP 192.168.109.131 > 192.168.109.138: ICMP echo request, id 25157, seq 4, length 64
11:13:55.864961 IP 192.168.109.138 > 192.168.109.131: ICMP echo reply, id 25157, seq 4, length 64
11:13:56.865994 IP 192.168.109.131 > 192.168.109.138: ICMP echo request, id 25157, seq 5, length 64
11:13:56.866044 IP 192.168.109.138 > 192.168.109.131: ICMP echo reply, id 25157, seq 5, length 64

-

<think>嗯,用户想用Python实现抓包30秒,并统计UDPTCP和ICMP的数量。首先,我需要确定如何进行抓包Python中常用的库是scapy,它支持数据包捕获和分析。不过scapy可能需要管理员权限,可能需要用户以root身份运行。另外,也可以考虑使用pyshark,它是Wireshark的Python绑定,但可能需要安装TShark。 接下来,用户需要抓包30秒,所以需要设置一个超时时间。在scapy中,可以用sniff函数的timeout参数,但可能需要注意这个参数的行为是否准确。或者,可能需要使用stop_filter来在指定时间后停止捕获。 然后,统计不同协议的数量。数据包的协议字段在IP层的proto字段中,或者根据各层的类型来判断。例如,TCP是6,UDP是17,ICMP是1。但可能需要处理IPv4和IPv6的情况,不过用户可能只需要IPv4的情况。 可能的代码结构是:导入scapy,定义一个包处理函数,每次捕获到包时检查其协议类型,并增加相应的计数器。然后设置一个开始时间,持续捕获30秒后停止。或者使用sniff的timeout参数,但需要测试是否准确。 另外,全局变量可能需要用来保存计数器,或者使用一个列表或字典来存储统计结果。需要注意线程安全,但因为是在单线程的sniff中,可能没问题。 可能的陷阱包括:权限问题,是否能够捕获到数据包;协议类型的正确判断;过滤不需要的包,比如ARP或其他协议;以及如何处理没有IP层的包,比如某些链路层数据包。 测试的时候,可能需要生成一些流量,比如ping(ICMP),发送UDPTCP流量,确保计数正确。另外,在代码中可能需要使用prn参数来处理每个包,并在其中更新计数器。 最后,用户可能需要输出三个协议的数量。可能需要考虑在捕获结束后打印结果,或者在停止捕获时自动汇总。 总结步骤: 1. 导入scapy模块。 2. 初始化三个计数器。 3. 定义处理每个包的函数,检查协议类型并增加计数器。 4. 使用sniff函数捕获包,设置超时为30秒。 5. 捕获结束后输出统计结果。 可能的代码示例如下: from scapy.all import sniff, IP import time count_tcp = 0 count_udp = 0 count_icmp = 0 def packet_callback(packet): global count_tcp, count_udp, count_icmp if IP in packet: proto = packet[IP].proto if proto == 6: # TCP count_tcp += 1 elif proto == 17: # UDP count_udp += 1 elif proto == 1: # ICMP count_icmp += 1 start_time = time.time() sniff(prn=packet_callback, timeout=30) print(f"TCP: {count_tcp}, UDP: {count_udp}, ICMP: {count_icmp}") 但需要注意,timeout参数是否在sniff中有效,可能需要测试。另外,scapy的sniff可能需要使用store=0来减少内存使用,但可能不影响统计。 可能的问题:用户可能没有安装scapy,或者需要管理员权限。此外,协议号是否正确处理,比如ICMPv6可能有不同的情况,但用户可能只关注IPv4的情况。 相关问题可能包括:如何安装scapy,如何处理权限问题,如何过滤特定协议,如何扩展统计其他协议,或者如何保存捕获的数据到文件。 </think>以下是使用Python和Scapy库实现抓包30秒并统计TCP/UDP/ICMP协议数量的代码: ```python from scapy.all import sniff, IP import time def packet_handler(pkt): global tcp_count, udp_count, icmp_count if IP in pkt: proto = pkt[IP].proto if proto == 6: # TCP协议 tcp_count += 1 elif proto == 17: # UDP协议 udp_count += 1 elif proto == 1: # ICMP协议 icmp_count += 1 # 初始化计数器 tcp_count = 0 udp_count = 0 icmp_count = 0 # 开始抓包(持续30秒) sniff(prn=packet_handler, store=0, timeout=30) # 输出统计结果 print(f"TCP数据包数量: {tcp_count}") print(f"UDP数据包数量: {udp_count}") print(f"ICMP数据包数量: {icmp_count}") ``` 注意事项: 1. 需要管理员权限运行(Linux/Mac需加sudo,Windows需以管理员身份运行) 2. 需提前安装Scapy库:`pip install scapy` 3. 协议号对应关系:TCP=6,UDP=17,ICMP=1(IPv4) 4. store=0参数表示不保存捕获的数据包 5. 实际环境中可能需要处理无IP头的包(如ARP包)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值