python - 检测应用层协议(protocol),python?

标签 python python-2.7 network-programming packet scapy

我有一个捕获并显示网络数据包的应用程序。数据包以 TableView 和 TreeView 两种形式表示。我正在使用 scapy 捕获网络数据包。

我希望显示数据包的最高协议(protocol)级别(任何数据包的最高协议(protocol)级别),我面临的问题是某些数据包的最终有效负载被命名为协议(protocol)本身(例如,DNS 有效负载是命名为 DNS),但有些负载只是命名为 Raw(例如 HTTP 负载命名为 Raw)。

所以我想知道他们有什么方法可以在 python 中检测这些协议(protocol)。

这是 DNS 数据包的输出。

enter image description here

这是 HTTP 数据包的输出。

enter image description here

这是生成 Tree 的代码。

def packet2Tree(self,pkt):
    if len(pkt.fields.keys()) == 0 or pkt.name == "":
        return
    self.rootNode = Node(pkt.name , self.RootNode ) 
    field = pkt.fields_desc
    for xfield in field:
        self.childNode = Node(xfield.name , self.rootNode , str(pkt.getfieldval(xfield.name)))
    self.packet2Tree(pkt.payload)
    return self.RootNode

猜猜如何解决这个问题

最佳答案

我不确定是否有内置方法可以做到这一点,但您可以查看端口号并猜测一下? Scapy 似乎理解大多数 TCP 数据包的端口号(即当你调用 repr(layer) 时),所以也许看看源代码?

编辑这个问题解释了socket模块可以为你做到这一点:

python-scapy: how to translate port numbers to service names?

>>> import socket
>>> socket.getservbyport(80)
'http'
>>> socket.getservbyport(21)
'ftp'
>>> socket.getservbyport(53, 'udp')
'domain'

关于python - 检测应用层协议(protocol),python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395557/

相关文章:

python - 如何将文本文件中的数字读取为列表中的数字?

python - django-admin 中的多模型版本

python - 使用python优化图中检测循环的算法

python - 如何使用 raw_input 在 python 2.7 中接收来自 stdin 的输入?

c - 为什么服务器套接字给出的端口号与绑定(bind)端口号不同?

python - 用于性能测试的多个同时 tcp 客户端连接

python - 用python删除文件中的最后一行

python - 代码从 python 2.7 到 3.5 (unicode)

python - PySpark(Python 2.7): How to flatten values after reduce

c - libnids 样本中从未调用过 tcp_callback