Skip to content

CustomSockopt#5740

Closed
LjhAUMEM wants to merge 2 commits intoXTLS:mainfrom
LjhAUMEM:CustomSockopt
Closed

CustomSockopt#5740
LjhAUMEM wants to merge 2 commits intoXTLS:mainfrom
LjhAUMEM:CustomSockopt

Conversation

@LjhAUMEM
Copy link
Contributor

此 pr 为 #5727 替代方案,且不影响后续添加通过 mux 协商速率的版本

tcpAfterConn 为 true 则该 custom socket 只在入站的 tcp 连接确认后进行设置

下面的示例等同于 5727 的无协商设置 brutal rate 150mbps cwnd 15,可选 xhttp 传输层启用 mux

"sockopt": {
  "tcpCongestion": "brutal",
  "customSockopt": [
    {
      "tcpAfterConn": true,
      "level":"6",
      "opt": "23301",
      "type": "array",
      "value": [0,0,44,1,0,0,0,0,15,0,0,0] // with padding: [0,0,44,1,0,0,0,0,15,0,0,0,0,0,0,0]
    }
  ]
}

使用 customSockopt 应该清楚自己在做什么,至于命名可以先不入文档,可以随时 break

@Fangliding
Copy link
Member

Fangliding commented Feb 28, 2026

首先这个叫 connected socket 不叫什么 tcp after conn
为了 tcp brutal 强加这么一坨有点饺子醋了 这样的调用我找不到另一个合适的用途

@Fangliding Fangliding closed this Feb 28, 2026
@Fangliding
Copy link
Member

Fangliding commented Feb 28, 2026

你实在要加这个brutal的话有一个办法 丢tcp mask里 反正里面看到的是conn可以正常call这个调用
不过我也不咋喜欢这样服务端写死 容易出事

@LjhAUMEM
Copy link
Contributor Author

LjhAUMEM commented Mar 1, 2026

首先这个叫 connected socket 不叫什么 tcp after conn

我不是很在乎叫什么,所以说可以随时 break

为了 tcp brutal 强加这么一坨有点饺子醋了 这样的调用我找不到另一个合适的用途

[listen 上设置不会自动继承 只对“已连接的 TCP socket" 服务端 accept() 后] 这类随便搜下都能出来,只是不常用?

你实在要加这个brutal的话有一个办法 丢tcp mask里

但这并不是 mask,更合适的 CustomSockopt 反而被你关了,而且 mask 并不保证拿到 fd,只是保证在 tls 之前,在监听之后,而监听的时候可能返回的是 proxyproto

@LjhAUMEM
Copy link
Contributor Author

LjhAUMEM commented Mar 1, 2026

至于只是加个 bool tcpAfterConn 要改动这么多那我也没办法,分了五个文件 darwin freebsd linux windows other,每个都有自己的 applyInboundSocketOptions applyOutboundSocketOptions,不像你从 sing 搬过来的那个 brutal 只分 linux 和 !linux

顺便这个 pr 其实修复了 windows 无法 CustomSockoptString 的问题,只是能不能用还不知道

@Fangliding
Copy link
Member

Fangliding commented Mar 1, 2026

[listen 上设置不会自动继承 只对“已连接的 TCP socket" 服务端 accept() 后] 这类随便搜下都能出来,只是不常用?

内核设计者不傻 其他大多数只对 connected 生效的 sockopt 大多数都是用于获得 peer 信息或者根据某条连接的具体需要实时对 socket 进行部分调整 真需要对一个 listening 都生效的参数他们会允许放到 listening socket 上然后继承 实际上 brutal 也属此列 估计是故意这么设计的 放开这个限制只用在模块代码改几行而已 如果是故意的这么做有点滥用 API 的感觉 通过一个 dirty 的 hook 来解决一个为了规范行为做出的限制

但这并不是 mask,更合适的 CustomSockopt 反而被你关了,而且 mask 并不保证拿到 fd,只是保证在 tls 之前,在监听之后,而监听的时候可能返回的是 proxyproto

有个 UnwrapRawConn 工具函数

顺便这个 pr 其实修复了 windows 无法 CustomSockoptString 的问题,只是能不能用还不知道

单纯只是因为 Windows 没有这个调用而已 而且也没有有意义的选项 我重新看了一下它还被后面的二进制选项用来传递字节数据 这个单开一个 type 就行了 当初设计 customSockopt 的时候就想过了 要一个hex或者base64过的字节输入就行了 一直没有做是因为到开 custom 之前那一连串的预制 sockopt 核心都没有用过需要传递原始字节的 sockopt 那时候的结果是等真有需要了再说

@LjhAUMEM
Copy link
Contributor Author

LjhAUMEM commented Mar 1, 2026

随便找了几个 listen 阶段无意义只对 ESTABLISHED 状态有意义

TCP_CORK TCP_QUICKACK TCP_USER_TIMEOUT

内核设计者不傻 其他大多数只对 connected 生效的 sockopt 大多数都是用于获得 peer 信息或者根据某条连接的具体需要实时对 socket 进行部分调整 真需要对一个 listening 都生效的参数他们会允许放到 listening socket 上然后继承 实际上 brutal 也属此列 估计是故意这么设计的 放开这个限制只用在模块代码改几行而已 如果是故意的这么做有点滥用 API 的感觉 通过一个 dirty 的 hook 来解决一个为了规范行为做出的限制

首先我没说过内核设计者傻,其次即使开放了 modprobe 的参数设置要修改也不如 core 中灵活,更何况不就是没开放才需要在 core 中设置

你看到的是我为 brutal 包了一顿饺子,我看到的是 customSockopt 并不够 custom,做一个能在 accepted 之后的设置才是真正的 custom,如果其他魔改的 bbr 也通过 inet_csk_ca 这类方式设置参数,core 里并没有办法能够设置

说回这个 pr,我又没有权限,甚至都等不到我回复直接 close 了,我看不到对 contributor 的基本尊重,即使有权限我也不会直接提交,更何况你说的 这样的调用我找不到另一个合适的用途 并不是不存在

@Fangliding
Copy link
Member

Fangliding commented Mar 1, 2026

随便找了几个 listen 阶段无意义只对 ESTABLISHED 状态有意义

TCP_CORK TCP_QUICKACK TCP_USER_TIMEOUT

TCP_CORK 和 TCP_USER_TIMEOUT 都是可以继承的 后者设置都已经写在 Xray 里了 而 TCP_QUICKACK 是个会被动态调整的状态

内核设计者不傻 其他大多数只对 connected 生效的 sockopt 大多数都是用于获得 peer 信息或者根据某条连接的具体需要实时对 socket 进行部分调整 真需要对一个 listening 都生效的参数他们会允许放到 listening socket 上然后继承 实际上 brutal 也属此列 估计是故意这么设计的 放开这个限制只用在模块代码改几行而已 如果是故意的这么做有点滥用 API 的感觉 通过一个 dirty 的 hook 来解决一个为了规范行为做出的限制

首先我没说过内核设计者傻,其次即使开放了 modprobe 的参数设置要修改也不如 core 中灵活,更何况不就是没开放才需要在 core 中设置

开放了就可以用现有的 infra 设置了 顶多加一个raw byte支持 很简单

你看到的是我为 brutal 包了一顿饺子,我看到的是 customSockopt 并不够 custom,做一个能在 accepted 之后的设置才是真正的 custom,如果其他魔改的 bbr 也通过 inet_csk_ca 这类方式设置参数,core 里并没有办法能够设置

必要性在上面已经说明了

说回这个 pr,我又没有权限,甚至都等不到我回复直接 close 了,我看不到对 contributor 的基本尊重,即使有权限我也不会直接提交,更何况你说的 这样的调用我找不到另一个合适的用途 并不是不存在

太 dirty 而且没刚需的东西我就直接关了 5727 我就没动 因为它相对没那么 dirty 尊不尊重我不是扫了一眼觉得这功能烂就直接关了 我要花很多时间去翻代码查资料去检查有没有必要的 比如很多参数能不能继承没个文档的 TCP_USER_TIMEOUT 是明显标了 TCP_CORK 是我去翻了内核 Linux代码 我甚至觉得话说太死后面又补了一句 tcp mask 是个可选的低侵入方便配置的实现

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.

2 participants