在dpkt中使用tcp.dport时出错

时间:2014-01-31 05:17:34

标签: python pcap

我试图使用python的dpkt解析录制的PCAP文件。当我试图过滤具有http(在端口80上)请求的tcp连接时,我收到如下错误::`

import dpkt
import socket
counter=0
ipcounter=0
tcpcounter=0
udpcounter=0
httpcounter=0

filename='sampledata.pcap'

for ts, pkt in dpkt.pcap.Reader(file(filename, "rb")):

    counter+=1
    eth=dpkt.ethernet.Ethernet(pkt) 
    if eth.type!=dpkt.ethernet.ETH_TYPE_IP:
       continue

    ip=eth.data
    tcp=ip.data
    ipcounter+=1

    if ip.p==dpkt.ip.IP_PROTO_TCP: 
       tcpcounter+=1

    if ip.p==dpkt.ip.IP_PROTO_UDP:
       udpcounter+=1

    if tcp.dport == 80 and tcp.flags & tcp.TH_SYN == 1 and tcp.flags & tcp.TH_SYN == 1 and tcp.flags & tcp.TH_ACK == 1 :
        src = socket.inet_ntoa(ip.src)
        dst = socket.inet_ntoa(ip.dst)
        print "%s -> %s" %(src,dst)`

错误::我收到一些OSPF错误如下

Traceback (most recent call last):
  File "test.py", line 72, in <module>
    if tcp.dport == 80 and tcp.flags & tcp.TH_SYN == 1 and tcp.flags & tcp.TH_SYN == 1 and tcp.flags & tcp.TH_ACK == 1 :
AttributeError: 'OSPF' object has no attribute 'dport'

1 个答案:

答案 0 :(得分:1)

您假设封装在IP数据包中的数据是tcp。但在这种情况下,它是一个OSPF数据包。 OSPF不使用TCP / IP传输协议(UDP,TCP),而是直接封装在协议号为89的IP数据报中。

您需要检查数据包中的协议类型,如果是tcp或udp,则使用dport。

# Include the following condition in your for loop
if ip.p not in (dpkt.ip.IP_PROTO_TCP, dpkt.ip.IP_PROTO_UDP):
    continue