本文面向接入我们 RTC 服务的合作方(服务端应用层),说明 RTC 授权接口channel/grant中net参数的含义,以及如何在你们自己的服务端判断用户应走内网还是外网线路。
一、net 参数说明
net定义在我们(RTC 层)已部署的 RTC 服务上,一般情况下支持两个取值:内网、外网(可根据使用场景按需配置一个或多个网络线路)。- 调用授权接口 不传
net时,默认按内网处理。 - 我们(RTC)根据该参数,决定返回给客户端 SDK 的实际服务地址,包括:API服务、会控消息服务、流媒体服务等。
- 也就是说:客户端最终连内网地址还是公网地址,完全由
net这一个字段决定。传错,客户端就会拿到错误的地址而连不上或走错线路。
二、你们(接入方)需要做的
你们在调用我们 RTC 的授权接口channel/grant 时,必须在请求中带上约定好的 net(内网 或 外网)。
核心问题只有一句:你们的服务端怎么知道这一次请求该填 内网 还是 外网?
三、确定 net 的两种方式(任选其一)
方式 A:用户手动选择
- 优点:最准确,不依赖任何网络判断。
- 缺点:每次需用户选择,体验稍重,且存在用户选错的可能。
方式 B:你们的服务端智能判断(推荐,可参考我们的 Demo 实现)
- 优点:对用户无感,自动分流。
- 缺点:需在你们服务端实现一小段判断逻辑(逻辑很简单,见下文伪代码)。
说明:本项目中的 Demo 是一个服务端应用层的参考实现,它内部正是采用方式 B 来判断net。你们不必使用 Demo,只需在自己的服务端照同样的判断逻辑算出net,再调用我们的channel/grant即可。
四、线路判断流程图
匹配规则说明:判断节点中的”按请求域名匹配到线路”,指请求 Host 包含该线路所配置的域名串(子串包含匹配,而非完全相等)。例如线路配置了example.com,则meeting.example.com也会命中该线路。
五、matchNetwork 判断逻辑(伪代码)
方式 B 的判断逻辑如下,可直接翻译到任意语言:
- 优先用访问域名匹配——你们给不同线路配置不同入口域名,用户从哪个域名进来就判为哪条线路,最准。
- 域名没配置或没匹配上,再用客户端 IP 兜底:内网 IP →
内网,公网 IP →外网。 - 最终传给我们的
net只能是内网或外网之一。
说明:上面伪代码里的线路名 / 域名只是格式示例,真实取值来自你们自己的配置文件,且配置文件可能为空(为空则走第 3 步 IP 兜底)。
六、对齐与注意事项
- 传给我们的
net必须是内网或外网,不传则默认内网;请勿传未约定的其他值。 - 若你们网络环境简单、用户来源清晰,方式 B(域名匹配 + IP 兜底) 最省事,照上方伪代码实现即可。
- 若你们内网 / 外网边界复杂、自动判断容易误判,建议用方式 A(用户手动选择),最不容易出错。
- 建议上线前用内网、外网两类用户分别验证一次,确认实际拿到的
mqtt、流媒体地址符合预期。
七、反向代理(Nginx)注意事项
上文的线路判断依赖两个关键信息:请求域名Host(用于域名匹配)和客户端真实 IP(用于内网/外网兜底)。如果你们的服务前面有 Nginx 等反向代理,必须正确转发这两类信息,否则域名匹配会拿到代理机域名、IP 兜底会误判为代理机的内网 IP。
Nginx 关键配置示例:
Host $host:把用户实际访问的域名透给后端,保证域名匹配逻辑拿到的是真实入口域名。X-Real-IP $remote_addr:传递客户端真实 IP。X-Forwarded-For $proxy_add_x_forwarded_for:追加客户端 IP 到转发链,便于后端按可信头取真实 IP。X-Forwarded-Proto $scheme:传递原始访问协议(http/https),如你们有协议相关判断可据此识别。
提示:后端取客户端 IP 时,应优先读取X-Real-IP/X-Forwarded-For等可信头(并限制仅信任代理机来源),而不是取 TCP 对端地址,否则拿到的是 Nginx 的 IP 而非用户 IP。