一、NAT的四种类型
简单来说,IPV4地址不够,出现了NAT。
1、完全锥型
私网内的主机向公网主机发起一个请求,期间会在NAT服务上打洞(留下发起方公网的IP地址和端口)。外网的所有主机都可以通过这个IP地址和端口来访问。
2、地址限制型
私网内的主机向公网内的某台主机发起一个请求,会在NAT服务上开启类似访问权限的功能,就是说对于私网主机请求过的所有公网主机,都可以通过私网内主机的公网IP+端口访问私网内的主机;而未被请求过的公网主机则无法访问。
3、端口限制型
私网内的主机向公网内的某台主机的某个端口发起一个请求,会在NAT服务上开启类似访问权限的功能,就是说对于私网主机请求过的所有公网主机的特定端口,都可以通过私网内主机的公网IP+端口访问私网内的主机;而未被请求过的公网主机的特定端口则无法访问。
4、对称型
会在NAT服务的映射表中添上一组映射信息(每次请求都会往上添)----------六元组(私网内主机的内网IP+端口,私网内主机的公网IP+端口,公网内主机的IP+端口),其中前两元是不变的,而后面的四元都有唯一的对应关系,也就是说公网内某个IP地址特定端口的主机只能通过映射表上与之相对应的第三、四元来访问私网主机,其他都不能访问。
二、STUN服务
服务器有两个公网的IP地址和端口。
1、STUN服务目的
1、判断通信双方是否在NAT后;
2、判断双方NAT的类型;
3、交换各自公网的地址和端口(在NAT后就交换NAT转换后的地址和端口)。
2、STUN服务检测NAT类型的原理
1、客户端向STUN服务器的第一个IP地址端口1发起请求,通过服务器原路返回进行响应。如果这个响应的IP地址和客户端的相同,说明客户端在公网,不在NAT之后。
2、前提:客户端在NAT后。客户端向STUN服务器的第一个IP地址端口1发起请求,通过服务器的第二个IP地址端口1响应。如果客户端能收到响应,说明是完全锥型NAT。
3、如果第二步还不能收到响应,客户端再向STUN服务器的第二个IP地址端口1发起请求,通过服务器同一个IP地址的端口2响应。如果客户端能收到响应,说明是地址限制型NAT;
4、如果第三步收不到响应,客户端向STUN服务器的第二个IP地址端口1发起请求,由服务器原路返回进行响应。客户端不能收到请求,且返回的IP地址和第一步响应的I地址不相同,说明是对称型NAT;当客户端能收到请求,就是端口限制型NAT。
如果STUN提供的服务能够连通,那两端不走中继服务器,直接点对点传输媒体流了。
三、TURN服务
服务器分为turn_client端和turn_server端。
1、TURN服务目的
解决无法穿透的NAT。
2、TURN服务原理
假设A端和B端要通信。A发送请求给STUN/TURN服务器(限定必须是3478端口),turn_client向turn_server发送一个Allocate请求,turn_server收到Allocate请求之后会为A发的请求分配一个relay端口(中继端口),经过中继端口转发给B。相反,B要发送自己的数据就通过relay端口进行发送,之后经过服务器端口转发到3478,最后再到达A端。
每次A发送的数据先发到turn_client端(3478),turn_client发送Send到turn_server的时候会带上TURN的协议头,然后turn_server再去掉协议头,发给B端。B端发数据先到turn_server端(Allocate请求开通的relay端口),turn_server发Data给turn_client的时候也会带上TURN的协议头,然后turn_client再去掉协议头,发给A端。这样发数据会浪费带宽,可用Channel解决带宽损耗问题。
四、TURN/STUN服务搭建
1、修改配置文件
云服务器记得开放端口!
listening-port=3478
external-ip=公网IP
user=用户名:密码 //访问TURN服务的凭证
min-port=x
max-port=x //relay端口在min-max范围内
2、测试ICE
ICE测试网址百度就有。
不用管报错信息,只要relay和srflx就代表STUN/TURN服务搭建成功!