2012-01-13 39 views
9

Tôi có tập lệnh python chụp các gói trên ethernet bằng dpkt, nhưng làm cách nào để phân biệt giữa gói nào là tcp và gói nào udp.python/dpkt: Tìm hiểu xem gói có phải là gói tcp hay gói udp không,

Cuối cùng tôi muốn có danh sách các gói cho mỗi kết nối TCP được thiết lập trong khoảng thời gian.

mã của tôi là:

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() 
+0

Tôi tìm thấy câu trả lời để tôi cũng có thể đăng nó ở đây cho người khác. Mã sau đây thực hiện công việc: ip = eth.data nếu (ip .__ dict) .has_key ('tcp'): # thì đây là gói tcp ... – ConfusedAboutCPP

Trả lời

6

IP header chứa giao thức lĩnh vực. dpkt nên cho phép bạn để có được giá trị này và sử dụng nó, bạn có thể đoán những gì là trên đầu trang của IP. Dưới đây là danh sách các số giao thức hợp lệ http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml. UDP bằng 17 trong khi TCP là 6.

Edit: Tôi đã kiểm tra vấn đề này và như tôi đã đề cập dpkg cung cấp p tính để truy cập vào lĩnh vực giao thức IP. Vì vậy, bạn có thể kiểm tra lại nó. Nhưng nó cũng tự động phân tích cú pháp gói và đặt thuộc tính data thành thể hiện của lớp đại diện cho giao thức trên như UDP hoặc TCP. Vì vậy, bạn có thể kiểm tra loại tài sản data và bạn nhận ra giao thức này.

from dpkt.ip import IP, IP_PROTO_UDP 
from dpkt.udp import UDP 
ip = IP('E\x00\x00"\x00\x00\x00\[email protected]\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" 
6

Một kịch bản python để chụp các gói tin trên adapter ethernet eth0 sử dụng dpkt, và phân biệt giữa TCPUDP gói của 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() 
Các vấn đề liên quan