服务器如何接受请求?
扫描二维码
随时随地手机看文章
服务器应当能够接收任何IP地址、端口和协议的请求,通过对该服务器的SIP或者SIPS URI的DNS进行查找,得到这个服务器的地址然后进行连接和请求发送。
Handing out包括在Register请求、转发应答的Contact头域中的添加URI、应答的Record-Route头域中添加一个URI字段,URI字段可用通过放在网页上被handing out读取。
对于服务器监听UDP的任何端口和界面,需要在TCP上同时进行监听;如果服务器在TCP上进行监听,那么不一定需要在UDP上同时进行监听。
当服务端事务从任意一个通讯层上接收到一个请求时,必须检查Via字段的sent-by参数;sent-by参数的主机部分包含一个主机名或者包含的IP地址和包的源地址不一致时,服务端需要添加received参数到Via字段中;received参数包含收到包的源地址。由于服务端一定要把应答信息发送给收到请求的源地址,received参数用于帮助服务端通讯层发送应答。
1. 安全与绑定策略补充
(1) 接口绑定限制
安全实践:虽然理论上服务器可监听所有接口(0.0.0.0或::),但生产环境中通常仅绑定特定 IP(如内网/公网接口),以减少攻击面。
防火墙规则:需开放 SIP 标准端口(UDP/TCP 5060,TLS 5061),并限制来源 IP 范围(如仅允许运营商或合作伙伴 IP)。
(2) 协议优先级
传输层选择:
UDP:适用于低延迟场景,但需处理丢包重传(需实现应用层重传逻辑)。
TCP:确保可靠传输,适合大消息(如携带 SDP 的 INVITE)。
TLS(SIPS):强制加密,需管理证书链(如 Let's Encrypt 或私有 CA)。
2. DNS 解析的深入要求
(1) NAPTR 与 SRV 记录
SIP 服务发现:客户端通过 DNS NAPTR 记录确定支持的传输协议(如 _sip._udp, _sips._tcp),再通过 SRV 记录解析服务器地址和端口。
负载均衡:SRV 记录的权重(priority/weight)支持多服务器流量分配,需配合健康检查实现故障转移。
(2) 多宿主与地理路由
Anycast DNS:全球部署的服务器可使用 Anycast IP,通过 BGP 路由将请求导向最近节点。
DNS TTL 管理:设置合理的 TTL(如 300 秒),平衡故障恢复速度与 DNS 查询开销。
3.Via 字段处理的完整规则
(1) received 与 rport 参数
NAT 穿透:当客户端位于 NAT 后时,Via 的 sent-by IP 可能与实际源 IP 不同。
received:记录请求的实际源 IP。
rport:记录请求的实际源端口(若与 sent-by 端口不符)。
响应路由:服务器发送响应时,优先使用 received:rport 作为目标地址,而非 sent-by。
(2) Via 栈操作
代理服务器行为:每经过一个代理,Via 头添加当前节点信息,形成“栈”结构。
响应回传:响应按 Via 栈逆序逐跳返回,确保路径一致性。