python / dpkt:如何判断数据包是TCP还是UDP包
我有一个用Python写的脚本,它可以通过dpkt捕获以太网的数据包。但是我该怎么区分哪些数据包是TCP的,哪些是UDP的呢?
最后,我希望能得到一个在特定时间段内建立的每个TCP连接的数据包列表。
我的代码是:
import dpkt
import pcapy
cap=pcap.open_live('eth0',100000,1,0)
(header,payload)=cap.next()
while header:
eth=dpkt.ethernet.Ethernet(str(payload))
ip=eth.data
tcp=ip.data
# i need to know whether it is a tcp or a udp packet here!!!
(header,payload)=cap.next()
2 个回答
10
这是一个用Python写的脚本,它可以抓取在以太网适配器eth0
上流动的数据包。这个脚本使用了一个叫做dpkt的工具,并且能够区分TCP和UDP这两种类型的IP数据包。
import dpkt
import pcapy
cap=pcapy.open_live('eth0',100000,1,0)
(header,payload)=cap.next()
while header:
eth=dpkt.ethernet.Ethernet(str(payload))
# Check whether IP packets: to consider only IP packets
if eth.type!=dpkt.ethernet.ETH_TYPE_IP:
continue
# Skip if it is not an IP packet
ip=eth.data
if ip.p==dpkt.ip.IP_PROTO_TCP: # Check for TCP packets
TCP=ip.data
# ADD TCP packets Analysis code here
elif ip.p==dpkt.ip.IP_PROTO_UDP: # Check for UDP packets
UDP=ip.data
# UDP packets Analysis code here
(header,payload)=cap.next()
10
IP头里面有一个叫做协议的字段。使用dpkt这个工具,你可以获取这个值,然后根据这个值来猜测IP上面使用的是什么协议。这里有一个有效协议编号的列表,链接是http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml。比如,UDP的编号是17,而TCP的编号是6。
补充说明:我检查过这个问题,正如我提到的,dpkt提供了p
属性来访问IP的协议字段。所以你可以根据这个来检查。但它还会自动解析数据包,并将data
属性设置为一个类的实例,这个类代表了上层协议,比如UDP或TCP。因此,你可以检查data
属性的类型,从而识别出这个协议。
from dpkt.ip import IP, IP_PROTO_UDP
from dpkt.udp import UDP
ip = IP('E\x00\x00"\x00\x00\x00\x00@\x11r\xc0\x01\x02\x03\x04\x01\x02\x03\x04\x00o\x00\xde\x00\x0e\xbf5foobar')
#if ip.p == IP_PROTO_UDP: # checking for protocol field in ip header
if type(ip.data) == UDP : # checking of type of data that was recognized by dpkg
udp = ip.data
print udp.sport
else:
print "Not UDP"