我正在编写一个可以检测网络数据包中使用的协议的程序。对于接收到的每个数据包,它将尝试检测网络和传输层中的协议。在这两层中检测协议非常容易,因为在数据包的某处我们有一些字节告诉我们协议。但是对于应用程序层,据我所知,这要困难得多。没有在 HTTP 数据包中没有提到协议(据我所知)。检测应用层协议的另一个困难是整个 HTTP 请求或响应可能需要多个数据包,并且连接多个数据包要困难得多。
我想从理论上知道如何检测这些协议。
我正在编写一个可以检测网络数据包中使用的协议的程序。对于接收到的每个数据包,它将尝试检测网络和传输层中的协议。在这两层中检测协议非常容易,因为在数据包的某处我们有一些字节告诉我们协议。但是对于应用程序层,据我所知,这要困难得多。没有在 HTTP 数据包中没有提到协议(据我所知)。检测应用层协议的另一个困难是整个 HTTP 请求或响应可能需要多个数据包,并且连接多个数据包要困难得多。
我想从理论上知道如何检测这些协议。
不幸的是,没有简单的答案。虽然网络和传输层协议并不多,而且现有的协议已经很好地标准化,但应用层却要混乱得多。
猜测应用程序协议的一种方法是查看各种“提示”,例如端口号、特定位置是否存在某些字符串(例如“HTTP”)、数据包长度等。但这并不是万无一失的。我可以轻松地在端口 80 上运行一些自定义协议,该协议恰好在有效负载中包含“HTTP”,但不是 HTTP。这就是为什么即使像wireshark这样的专用工具有时也无法检测到正确协议的原因。顺便说一句,您可以使用wireshark 的源代码来详细了解它如何剖析不同的协议。
关于在多个数据包中发送的协议 - 这更容易。您的解析器必须将 TCP 视为流协议。单个数据包在 TCP 中没有意义,您的解析器必须跨多个数据包跟踪流。