在 Delphi 中从缓冲区检测QUIC协议?

2mbi3lxu  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(171)

我在 Delphi 中有一个监控UDP流量的应用程序。当使用QUIC协议时,什么是检测的正确方法?我在TB缓冲区中有数据。
QUIC参考编号:https://datatracker.ietf.org/doc/html/rfc9000

e3bfsja2

e3bfsja21#

根据你所寻找的积极匹配程度的不同,所付出的努力在“公园散步”和“有点噩梦”之间变化。
QUIC有一个复杂的握手过程,在此过程中会导出加密密钥,然后进入完全加密的应用数据阶段。除此之外,该协议还允许在交换过程中迁移端点(例如移动的设备在wifi和移动数据之间跳转),因此简单地跟踪IP地址和端口并不能捕获所有信息。
如果您想要的只是对正在发起的QUIC连接进行基本检测,那么您所需要做的就是查找初始数据包,这些数据包具有清晰的格式,并且只是经过了模糊处理(未加密)。
来自RFC9000:

17.2.2.  Initial Packet

   An Initial packet uses long headers with a type value of 0x00.  It
   carries the first CRYPTO frames sent by the client and server to
   perform key exchange, and it carries ACK frames in either direction.

   Initial Packet {
     Header Form (1) = 1,
     Fixed Bit (1) = 1,
     Long Packet Type (2) = 0,
     Reserved Bits (2),
     Packet Number Length (2),
     Version (32),
     Destination Connection ID Length (8),
     Destination Connection ID (0..160),
     Source Connection ID Length (8),
     Source Connection ID (0..160),
     Token Length (i),
     Token (..),
     Length (i),
     Packet Number (8..32),
     Packet Payload (8..),
   }

因此,检测QUIC版本1初始数据包的一种快速且不太好的方法是检查以下内容(伪代码):

( packet[ 0 ] & 0xf0 ) == 0xc0
packet[ 1 ] == 0x00
packet[ 2 ] == 0x00
packet[ 3 ] == 0x00
packet[ 4 ] == 0x01

如果你想超越这一点,它很快就会变得指数级地复杂。
我强烈建议您下载并运行wireshark,亲自看看它在网络上的样子。

相关问题