如何检测使用http或其他应用层协议的数据包?

How to detect packets using http or other application layer protocols?

我正在编写一个程序,可以检测网络数据包中使用的协议。对于接收到的每个数据包,它将尝试检测网络和传输等层中的协议。在这两层中检测协议非常容易,因为在数据包的某处我们有一些字节可以告诉我们有关协议的信息。但是对于应用层,据我所知要难得多。 HTTP 数据包中的任何地方都没有提到协议(据我所知)。检测应用层协议的另一个难点是,一个HTTP请求或响应有可能需要多个数据包,多个数据包串联起来就更难了。

我想从理论上知道如何检测这些协议。

遗憾的是,没有简单的答案。虽然没有那么多网络和传输层协议,并且存在的协议也很标准化,但应用层要混乱得多。

猜测应用程序协议的一种方法是查看各种“提示”,例如端口号、特定位置是否存在某些字符串(例如“HTTP”)、数据包长度等。但这并非万无一失。我可以轻松 运行 端口 80 上的一些自定义协议,它恰好在有效负载中包含“HTTP”但不是 HTTP。这就是为什么甚至像 wireshark sometimes fail to detect the correct protocol. By the way, you could use wireshark's source code 这样的专用工具来详细说明它如何剖析不同协议的原因。

关于在多个数据包中发送的协议 - 这更容易。您的解析器必须将 TCP 视为 stream 协议。单个数据包在 TCP 中毫无意义,您的解析器必须跨多个数据包跟踪流。