Python / dpkt:如何判断数据包是TCP数据包还是UDP数据包

10

我有一个使用dpkt捕获以太网数据包的Python脚本,但是如何区分哪些数据包是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()

我找到了答案,也许我应该在这里发布给其他人。以下代码可以完成任务:ip=eth.data if (ip.__dict).has_key('tcp'): #那么这就是一个TCP数据包... - ConfusedAboutCPP
2个回答

10

使用dpkt的Python脚本捕获以太网适配器eth0上的数据包,并区分IPTCPUDP数据包。

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。

编辑: 我已经检查过这个问题了,并且如我所述,dpkg 提供了 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接