如何区分 DTLS 数据包与 TCP、UDP 数据包
How to distinguish a DTLS packet from TCP, UDP packet
来自RFC 5764:
+----------------+
| 127 < B < 192 -+--> forward to RTP
| |
packet --> | 19 < B < 64 -+--> forward to DTLS
| |
| B < 2 -+--> forward to STUN
+----------------+
其中 B 是数据包的第一个字节。因此,对于 DTLS 数据包识别,我们在将数据转换为无符号字符*后执行以下操作,
if(packet[0] > 19 && packet[0] < 64)
这仅适用于 RTP、DTLS 和 STUN 数据包。但对于UDP,TCP等失败。如果我发送的第一个字节在 20 到 63 之间的 UDP 数据包,则上述条件将其视为 DTLS 数据包。从谷歌的源代码DTLS数据包识别是这样完成的,
static bool IsDtlsPacket(const char* data, size_t len) {
const uint8* u = reinterpret_cast<const uint8*>(data);
return (len >= 13 && (u[0] > 19 && u[0] < 64));
}
但这也不能正确识别 DTLS 数据包。在wireshark中,我可以看到它可以正确地区分DTLS数据包和UDP/TCP数据包。我该怎么做?
RFC 5764 只关心 RTP、STUN 和 DTLS,而不关心其他数据。在这种情况下,区分这些格式的算法就足够了。如果你想区分DTLS和一般的UDP/TCP,你必须知道
- DTLS 是一种数据报协议,因此通常根本不用于 TCP 之上。在TCP上,您通常会找到TLS。 由于DTLS
- 通常用于UDP之上,因此任何DTLS数据包都是有效的UDP数据包,但不是其他方式。
要将 DTLS 数据包与其他 UDP 数据包区分开来,您应该查看 RC 6347 中所述的数据包格式。检测的质量取决于所使用的检测技术,也就是说,如果您限制自己仅匹配某些字节(如版本或类型字段),如果您获得更多上下文(长度是否有意义),或者您甚至拥有用于其他协议的检测引擎,以便您可以更加确定它是 DTLS 而不是其他东西。
相关文章:
- TCP/IP - 以 C/C++ 格式发送十六进制数据包以控制中继板
- TOS字段从Linux的TCP插座上接收到的数据包获取
- 了解 UDP 数据包大小限制的 TCP 数据包大小限制以及它在 boost::asio 编程级别的含义
- TCP-Server以数据包结构(非Java客户端)发送文件
- 可视化 将 TCP 服务器数据包保存到 C++ 中的文件
- TCP 数据包有时会被组合(并延迟?
- C# TCP 数据包结构
- TCP数据包通常会重新排序吗
- 为什么TCP套接字在接收到不正确的ACK时发送RST数据包而不是重新发送数据
- Winsock2 tcp/ip-一些数据包被忽略,可能是由于前一个数据包的null终止符
- 获取tcp数据包的序列号
- C++TCP Winsock服务器多次接收相同的数据包
- tcp套接字数据以xml数据包的形式发送
- TCP数据包丢失的部分
- 使用c++套接字编程的最大TCP数据包大小
- 使用SFML TCP套接字和数据包破坏文件
- 在应用程序级别调整 TCP 数据包大小以实现最大吞吐量
- 如何区分 DTLS 数据包与 TCP、UDP 数据包
- TCP数据包大小
- 如何查找重新传输的TCP数据包