【问题标题】:C/C++: Client never recovers a DTLS connection when server restartsC/C++:当服务器重新启动时,客户端永远不会恢复 DTLS 连接
【发布时间】:2021-08-14 11:59:54
【问题描述】:

我设法用 DTLS 创建了一个安全连接(使用 PSK 或证书),我的客户端每 3 秒连续发送一次请求。 到目前为止的代码工作正常,但是,当我重新启动服务器时,连接丢失并且不会重新连接,我检查了日志文件并且连接是客户端/服务器握手中的堆栈。

我的问题是,如何让客户端和服务器在每次丢失时重新建立 dtls 连接。

注意:当我使用正常的 UDP 连接(无 DTLS(没有 psk 或证书))时,与服务器的连接会重新建立,我会继续接收数据。

这里是重启服务器后的日志文件

May 26 09:42:21.079 DEBG created UDP  endpoint [::]:5683
May 26 09:42:21.079 DEBG created DTLS endpoint [::]:5684
May 26 09:42:21.079 DEBG created TCP  endpoint [::]:5683
May 26 09:42:21.079 DEBG created TLS  endpoint [::]:5684
May 26 09:42:24.992 DEBG ***[::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:53057 (if1) DTLS: new incoming session
May 26 09:42:24.992 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:53057 (if1) DTLS: received 271 bytes
May 26 09:42:24.993 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:53057 (if1) DTLS: sent 60 bytes
May 26 09:42:29.995 DEBG ***[::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:43399 (if1) DTLS: new incoming session
May 26 09:42:29.995 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:43399 (if1) DTLS: received 271 bytes
May 26 09:42:29.995 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:43399 (if1) DTLS: sent 60 bytes
May 26 09:42:34.998 DEBG ***[::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:36123 (if1) DTLS: new incoming session
May 26 09:42:34.998 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:36123 (if1) DTLS: received 271 bytes
May 26 09:42:34.998 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:36123 (if1) DTLS: sent 60 bytes
May 26 09:42:39.999 DEBG ***[::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:53973 (if1) DTLS: new incoming session
May 26 09:42:39.999 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:53973 (if1) DTLS: received 271 bytes
May 26 09:42:39.999 DEBG *  [::ffff:127.0.0.1]:5684 <-> [::ffff:127.0.0.1]:53973 (if1) DTLS: sent 60 bytes

【问题讨论】:

    标签: c udp dtls


    【解决方案1】:

    UDP(以及 DTLS)倾向于将一些功能委托给下一层。这使得选择特定改进解决方案而不是通用解决方案成为可能。例如,如果您在 DTLS 之上使用 CoAP,则可以检测到这种情况,如果您即使在多次重传时也没有收到 CON 消息的 ACK。然后客户端可能会尝试恢复 dtls 会话或进行完整的握手。但触发因素来自上层。

    【讨论】:

    • 谢谢您的回答先生!是的,我正在将 coap 协议与 libcoap 库一起使用。你能详细说明一下客户端恢复 dtls 会话吗?
    • 你使用的是哪个 dtls 实现?
    • 我正在使用 openssl-1.1.1g
    • 我没找到,libcoap 是如何触发 dtls 来执行新的握手的。也许,您自己询问该项目,请参阅github.com/obgm/libcoap 上的“问题”。
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多