ICE 客户端(交互式连接建立)

· 组件

自 sgcWebSockets 2022.6 起,库中新增了一个组件——实现了 RFC8445 的 ICE 客户端。ICE 是 WebRTC 中使用的协议之一(与 STUN、TURN、WebSockets 等已支持的协议配合使用)。交互式连接建立(ICE)是一种计算机网络技术,用于在对等网络中寻找两台计算机之间尽可能直接通信的方式。该技术最常用于交互式媒体,如 VoIP、点对点通信、视频和即时消息。在此类应用中,通过中央服务器通信速度慢且成本高,而由于 NAT、防火墙和其他网络障碍,互联网上客户端应用程序之间的直接通信非常复杂。

收集候选地址

ICE 开始收集候选地址,通常会获取本地 IP 地址、通过 STUN 协议获取自反地址,以及通过 TURN 协议获取中继地址。

调用 GatherCandidates 方法开始收集,这将启动一个内部计时器:首先获取本地 IP 地址,然后连接 STUN 服务器获取自反 IP 地址,最后连接 TURN 服务器获取中继 IP 地址。

每次获取到新的候选地址时,事件 OnICECandidate 将被异步调用;若收集候选地址时发生任何错误,将触发事件 OnICECandidateError

oICE := TsgcICEClient.Create(nil);
oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'www.esegece.com';
oTURN.Port := 3478;
oTURN.TURNOptions.Authentication.Credentials := stauLongTermCredential;
oTURN.TURNOptions.Authentication.Username := 'sgc';
oTURN.TURNOptions.Authentication.Password := 'secret';
oICE.GatherCandidates();
procedure OnICECandidate(Sender: TObject; const aCandidate: TsgcICE_Candidate);
begin
  DoLog('[#Candidate] ' + aCandidate.AsString);
end; 

配对候选地址

获取到本地和远端候选地址且设置了 SDP 描述后,ICE 发起方客户端可以开始处理所有候选地址对,以找到能够交换数据的地址对。调用 ProcessCandidates 方法启动此过程。

ProcessCandidates 方法通过发送 STUN 绑定数据包来评估所有候选地址对;若从另一对等端收到 STUN 绑定数据包作为应答,则表明这两个对等端之间可以建立连接,该地址对即被提名。

配对成功时,事件 OnICECandidatePairNominated 将被异步触发;若配对发生错误超时无法连接,则触发事件 OnICECandidatePairFailed