sockets - DTLS-Server 在第二个 ClientHello 之后没有正确回答

标签 sockets networking udp dtls mbedtls

我正在使用与 UDP 不同的网络传输协议(protocol)构建 DTLS 服务器和客户端设置。但是这个协议(protocol)也是不可靠的,所以需要 DTLS。该协议(protocol)使用 radio 网络将数据从客户端传输到服务器,反之亦然。为了使其与 DTLS 兼容,接收到的数据随后通过 UDP-Client 转发到服务器端的 DTLS-Server,并通过 UDP-Server 转发到客户端的 DTLS-Client,两者都在 localhost 上工作。

作为基础,我使用了 mbedTLS 的程序/ssl 目录中给出的 DTLS 示例实现。由于在传输的情况下使用的协议(protocol)不是 fastet,我通过使用 mbedtls_ssl_conf_handshake_timeout 函数调整了握手超时,这样就不会有任何可能干扰实际数据传输的早期重传。这是根据需要工作的。

大约 2 分钟后,服务器收到第一个握手消息(ClientHello)。服务器以 VerifyRequest 应答,再过 3 分钟后,服务器收到客户端的应答 (ClientHello+Cookie)。但是,服务器没有发送 ServerHello,而是使用另一个 VerifyRequest 来回答,例如他忘记了第一次初始化 ClientHello。

我将收到的 ClientHello 消息与使用相同设置但 UDP 作为网络协议(protocol)的 DTLS-Handshake 生成的一些消息进行了比较,它们几乎是等效的(除了随机部分和 cookie)。

我是否需要调整另一个超时计时器,以便服务器等待第二个 ClientHello 的时间更长?还是我忽略了另一件事?

如果您需要对问题的任何进一步描述,我会尽力提供。

我将不胜感激任何想法或提示。

最佳答案

我为延迟回复道歉
code 可以看出,如果cookie验证失败,则发送验证请求消息:

if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
    ssl->handshake->verify_cookie_len != 0 )
{
    MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) );
    MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );

    return( ssl_write_hello_verify_request( ssl ) );
}

你应该检查你的f_cookie_check mbedtls_ssl_conf_dtls_cookies() 中的实现集.
根据您的描述,我假设您使用的是默认 cookie 检查,因此您应该检查 mbedtls_ssl_cookie_check() 的原因。
问候,
Mbed TLS 团队成员
罗恩

关于sockets - DTLS-Server 在第二个 ClientHello 之后没有正确回答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42530836/

相关文章:

java - Socket是否开启另一个线程?它会返回一些东西吗?

ruby - Ruby 中的缓冲多部分表单帖子

python - 同时处理 TCP 和 UDP 的 Twisted 协议(protocol)

C : UDP socket programing

linux - 不能同时监听 IPv4 和 IPv6(地址已被使用)

c - 可靠地将相同的数据广播到 C 中的多个套接字

c - 在 TCP 的 nanomsg 中使用哪种类型的套接字

linux - 在进程退出时自动清理 PF_UNIX 套接字?

sql-server - 无法远程连接到 Windows Server 2012 R2 上的 SQL Server 2014

c# - 严肃的高性能服务器的 Tcp 可靠性与 Udp 负担