1. 背景
目前很多电脑都在NAT之后,那么两个在nat之后的电脑可能无法正常的通信,即使进行了nat打洞。
为此可以实现一种机制,可以协助两客户端可以互相通信。
2. 主流程
stun协议说明:datatracker.ietf.org/doc/html/rfc3489
stun协议扩展:datatracker.ietf.org/doc/html/rfc5389
turn协议说明:datatracker.ietf.org/doc/html/rfc5766
c实现:github.com/coturn/coturn
go实现:github.com/pion
2.1. 主要的使用场景及现实的网络模型:
这里有三种角色,turnclient、turnserver、peer
turnclient:使用中继服务的客户端
turnserver:提供中继服务的服务端,需具备公网ip
peerA、peerB:对端客户端,无需安装相关软件,提供基本的udp发包和收包即可
目标:turnclient 与 peerA、peerB通知进行通信
2.2. turnclient与peerA通信建立的主要步骤
两个在NAT网络内的客户端基于turnserver想进行通信,主要有如下三步:
1.turnclient主动请求turnserver,发送allocate request请求,获取relay地址
2.peerA主动连接relay地址,获取出网ip&port
3.turnclient主动请求turnserver,将对端peerA的出网ip&port 添加进relay地址许可中
4.turnclient封装stun协议消息,将消息传给turnserver 3478端口,turnserver将消息从relay地址发送给对应的peerA
5.peerA与turnclient通信,则直接将消息发送给relay地址,turnclient内部进行中转,将消息从3478端口发送给turnclient
此时如果peerB想与turnclient通信
1.peerB主动连接relay地址,获取出网ip&port
2.重复上面3-5步即可
核心点:
turnclient的relay端口可以接受任何peer端的消息,进而收到消息,turnclient发送给peer端的消息会通过turnserver relay端口转发给对应的peer端