Skip to content

Conversation

Fangliding
Copy link
Member

@Fangliding Fangliding commented Jul 25, 2025

from #4927
重写了一下 tcp keepalive 的逻辑 删除了 sockopt_linux 里的操作 移到了 listener/dialer 中 这样可以跨平台
现在的逻辑
客户端 打开 TCP 连接使用和 Chrome 相同的 idle 和 interval (45秒) sockopt中两个数字任一为负则禁用 为正则覆盖默认值
服务端 监听默认不启用 任一大于 0 的 idle 或 interval 启用keepalive 并把相关数字设置成对应值 如果没设置 则为系统默认(而不是golang默认)
由于两个参数任一大于0启用和任一小于0禁用 一个正一个负会逻辑错误 如果发生这样的事直接返回错误

@xqzr
Copy link
Contributor

xqzr commented Jul 25, 2025

Linux 以外的系统,无需更改?

@Fangliding
Copy link
Member Author

从不认那两个sockopt参数变成了可以认 至于默认行为的改动是全都一起改动

@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

我研究下,@Fangliding 你看看 #4915 (comment)

@xqzr
Copy link
Contributor

xqzr commented Jul 25, 2025

尝试了在”出站“使用 "TcpKeepAliveIdle": 3"TcpKeepAliveIdle": -1 ,”TCP KeepAlive 探针“都在空闲 45 秒后,发出。
相当于 "TcpKeepAliveIdle" 配置,不起作用。
在 Windows

@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

@Fangliding 你俩快点把这个弄好吧,准备发 v25.7.25 了

@Fangliding
Copy link
Member Author

我在linux测试没有任何问题 证明参数已经正确传进去了
image

@Fangliding
Copy link
Member Author

windows也没问题 包括禁用也是正常的

@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

那大概过十分钟我先合并这个 PR 吧,有问题的话以后的版本再改

@xqzr
Copy link
Contributor

xqzr commented Jul 25, 2025

我同意。
即是有问题,也没关系。至少,不会出现 1 秒一个“探针”这种 DoS 行为😇

@Fangliding
Copy link
Member Author

是不是你config写错了

{
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks"
    }
  ],
  "log": {
    "loglevel": "debug"
  },
  "outbounds": [
    {
      "protocol": "freedom",
      "streamSettings": {
        "sockopt": {
          "tcpKeepAliveIdle": 15,
          "tcpKeepAliveInterval": 15
        }
      }
    }
  ]
}

@xqzr
Copy link
Contributor

xqzr commented Jul 25, 2025

是不是你config写错了

应该是,我配置 Idle
另外,注意到:如果 TcpKeepAliveInterval > TcpKeepAliveIdle 只会发送一次“探针”。考虑添加“警告”输出

@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

@Fangliding 你要改还是

@Fangliding
Copy link
Member Author

Fangliding commented Jul 25, 2025

要是两个数值不一样操作系统似乎会自行根据一些逻辑对这两个值进行修改 跟xray没有关系 比如 Windows上 tcpKeepAliveIdle = 15 的话 里面默认的 interval 的45也会被盖成15 这是操作系统行为 跟xray没关系

@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

那没事了,先合了

@RPRX RPRX changed the title inbounds & outbounds: TCP KeepAlive better default value Inbounds & Outbounds: TCP KeepAlive better default value Jul 25, 2025
@RPRX RPRX merged commit eb433d9 into main Jul 25, 2025
78 checks passed
@Fangliding
Copy link
Member Author

只设置"tcpKeepAliveIdle": 15
(加上默认的 interval 45)
在windows上会变成 等待挂起15秒 每15秒发一次
在Linux上是 等待挂起15秒 45秒发一次
不过默认的 45+45 是没问题的

@RPRX RPRX deleted the keepalive branch July 25, 2025 12:14
@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

@Fangliding 不是大问题,要改的话再开个 PR 吧

@Fangliding
Copy link
Member Author

这也没得改(

@RPRX
Copy link
Member

RPRX commented Jul 25, 2025

终于发了个 latest 版本

maoxikun pushed a commit to maoxikun/Xray-core that referenced this pull request Aug 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants