V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lovelylain
V2EX  ›  问与答

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

  •  
  •   lovelylain · 2023-02-27 14:06:06 +08:00 · 732 次点击
    这是一个创建于 425 天前的主题,其中的信息可能已经有所发展或是发生改变。

    家宽,拨号成功大约 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 的区别导致吗?

    第 1 条附言  ·  2023-03-01 08:04:21 +08:00
    改小 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 条回复    2023-02-28 09:51:55 +08:00
    ysc3839
        1
    ysc3839  
       2023-02-27 15:35:34 +08:00 via Android
    没有 keep alive ,导致断开后也不知道已经断开?直到 15 分钟可能有通信,才知道断开了?
    tairan2006
        2
    tairan2006  
       2023-02-28 09:02:07 +08:00
    你这 mqtts 的证书绑定的是公网 IP 地址么…

    如果服务端是你自己部署的,建议先看看服务端日志,或者抓个包。
    documentzhangx66
        3
    documentzhangx66  
       2023-02-28 09:23:38 +08:00
    两个 mqtt 都写入 trace 级别的日志,甚至有条件可以直接开 IDE 调试运行。大概率是程序 bug 。
    lovelylain
        4
    lovelylain  
    OP
       2023-02-28 09:49:16 +08:00 via Android
    @tairan2006 是的,自签名的,有效期可以很长,不用担心续期失败。
    @ysc3839 自己查了一下资料,区别可能是是否有数据传输导致的,nodered mqtt 本身实现了 60 秒 keepalive ,所以正常情况下没有数据就 60 秒断开,但是有数据时这个 60 秒就不生效了
    lovelylain
        5
    lovelylain  
    OP
       2023-02-28 09:51:55 +08:00 via Android
    要根据系统的 tcp_retries2 重试,重试 15 次就是差不多是 15 分钟,有时间验证下重拨不发数据和把
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2970 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:56 · PVG 20:56 · LAX 05:56 · JFK 08:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.