V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lovelylain
V2EX  ›  问与答

有个 Linux socket 问题困扰我很久了,求大佬分析下

  •  
  •   lovelylain · Feb 27, 2023 · 1684 views
    This topic created in 1169 days ago, the information mentioned may be changed or developed.

    家宽,拨号成功大约 18 小时后,局端会自动踢下线,无公网 ip ,重拨号会得到新的内网 ip 。有个 nodered 连接了两个 mqtt 服务器,重拨号后一个可以在一分钟内重新连接,一个要 15 分钟才重新连接,这 15 分钟无法收发消息,谁知道是什么导致了这种差异?目前是设置了每天 4:15 强制重新拨号来避开日常使用时间,避免影响使用。

    2023-02-27 04:15:13 重新拨号成功
    27 Feb 04:15:45 - [info] [mqtt-broker:iobroker] Disconnected from broker: mqtt://domain:port
    27 Feb 04:16:00 - [info] [mqtt-broker:iobroker] Connected to broker: mqtt://domain:port
    27 Feb 04:30:50 - [info] [mqtt-broker:ifttt] Disconnected from broker: mqtts://ip:port
    27 Feb 04:31:05 - [info] [mqtt-broker:ifttt] Connected to broker: mqtts://ip:port
    

    mqtt://domain:port 是连的别人的,mqtts://ip:port 是我自己部署的,有试过改用域名,没区别。重新拨号后会走 mqtts://ip:port 发送通知,所以这个 15 分钟比较影响使用。会是 mqtts 与 mqtt 的区别导致吗?

    Supplement 1  ·  Mar 1, 2023
    改小 tcp_retries2 后效果立杆见影
    2023-03-01 04:15:14 重新拨号成功
    1 Mar 04:15:18 - [info] [mqtt-broker:ifttt] Disconnected from broker: mqtts://ip:port
    1 Mar 04:15:19 - [info] [mqtt-broker:iobroker] Disconnected from broker: mqtt://domain:port
    1 Mar 04:15:33 - [info] [mqtt-broker:ifttt] Connected to broker: mqtts://ip:port
    1 Mar 04:15:35 - [info] [mqtt-broker:iobroker] Connected to broker: mqtt://domain:port
    5 replies    2023-02-28 09:51:55 +08:00
    ysc3839
        1
    ysc3839  
       Feb 27, 2023 via Android
    没有 keep alive ,导致断开后也不知道已经断开?直到 15 分钟可能有通信,才知道断开了?
    tairan2006
        2
    tairan2006  
       Feb 28, 2023
    你这 mqtts 的证书绑定的是公网 IP 地址么…

    如果服务端是你自己部署的,建议先看看服务端日志,或者抓个包。
    documentzhangx66
        3
    documentzhangx66  
       Feb 28, 2023
    两个 mqtt 都写入 trace 级别的日志,甚至有条件可以直接开 IDE 调试运行。大概率是程序 bug 。
    lovelylain
        4
    lovelylain  
    OP
       Feb 28, 2023 via Android
    @tairan2006 是的,自签名的,有效期可以很长,不用担心续期失败。
    @ysc3839 自己查了一下资料,区别可能是是否有数据传输导致的,nodered mqtt 本身实现了 60 秒 keepalive ,所以正常情况下没有数据就 60 秒断开,但是有数据时这个 60 秒就不生效了
    lovelylain
        5
    lovelylain  
    OP
       Feb 28, 2023 via Android
    要根据系统的 tcp_retries2 重试,重试 15 次就是差不多是 15 分钟,有时间验证下重拨不发数据和把
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3286 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 13:02 · PVG 21:02 · LAX 06:02 · JFK 09:02
    ♥ Do have faith in what you're doing.