首先测试端口库复用技术。
就是一个socket 同时进行listen和 connect 是否可行。答案是可以的。而且此socket还需要bind同一个本机ip port,同时,需要进行设置:
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (void *) &value, sizeof (value));
测试tcp穿透。
遇到的问题:公网服务器读到我的内网客户端发来的请求时,发现映射地址值改变了ip。即nat没有映射我的port,只映射了ip。。并且打洞失败,两个内网客户端无法连接。
测试UDP穿透。
测试UDP穿透有两个原因 一个是简单 一个是技术应该已经比较成熟了。但是不幸的是 我还是失败了,两个内网客户端互相发送公网请求,无法收到对方的数据。
于是我开始研究为什么会失败,首先怀疑是硬件不支持。
nat类型检测
网上下了检测工具,检测 是对称型nat,而且还提示UDP BLOCK。所以就失败了,原因是我这种方式无法穿透对称型nat。手动检测,客户端不断连接公网服务器,结果端口是递增+2的,证实了是对称型。
我查资料,网上说对称型nat很少,大部分都是锥型的nat,但是万万没想到,我这里就是个特殊的,比较麻烦。
于是我寻找别的方法。
STUN
1、接受客户端的请求,并且把客户端的公网IP、Port封装到ICE Candidate中。
2、通过一个复杂的机制,得到客户端的NAT类型。
这就是STUN做的事情,和我手动写的程序是一样的。同样,STUN只支持UDP,但是最新的资料显示好像也是支持TCP了,但是同理的,STUN是无法穿透对称型nat的(或者说可能性较低、比较麻烦)()
TURN
TURN Server也主做了两件事:
1为NAT打洞:
如果A和B要互相通信,那么TURN Server,会命令A和B互相发一条信息,这样各自的NAT就留下了对方的洞,下次他们就可以之间进行通信了。
2为对称NAT提供消息转发:
当A或者B其中一方是对称NAT时,那么给这一方发信息,就只能通过TURN Server来转发了。
最后补充一下,为什么对称NAT无法打洞:
假如A、B进行通信,而B处于对称NAT之下,那么A与B通信,STUN拿到A,B的公网地址和端口号都为10000,然后去协调TURN打洞,那么TURN去命令A发信息给B,则A就在NAT打了个B的洞,但是这个B的洞是端口号为10000的洞,但是下次B如果给A发信息,因为B是对称NAT,它给每个新的IP发送信息时,都重新对应一个公网端口,所以给A发送请求可能是公网10001端口,但是A只有B的10000端口被打洞过,所以B的请求就被丢弃了。
显然Server是无法协调客户端打洞的,因为协调客户端打得洞仅仅是上次对端为Server发送端口的洞,并不适用于另一个请求。
最后的最后再补充一点,就是NAT打的洞也是具有时效性的,如果NAT超时了,那么还是需要重新打洞的。
资料显示 还有一种方式,叫做ICE
ICE
ICE还在研究中。初步的了解来看,就是整合了上面两种方式,自动判断用哪一种(STUN或者TURN),不需要判断NAT类型,并将中转方式的优先级置为最低。
https://wenku.baidu.com/view/298aff020740be1e650e9a89.html
https://www.cnblogs.com/rayfloyd/p/7206815.html
https://blog.csdn.net/u010810750/article/details/55048385
https://blog.csdn.net/voipmaker/article/details/8453702
https://wenku.baidu.com/view/6cdda27e5acfa1c7aa00cc90.html?sxts=1562919825198
总结
无论是那种穿透方式,都是需要一个公网服务器的。即让客户端可以直接连接的服务器,只不过通过TCP/UDP直连穿透的(STUN)方式,对服务器压力小,只需要转发映射的公网ip port即可,但是不能穿透对称型NAT,通过中继中转方式(TURN)方式的,需要进行转发操作,对服务器压力大,但是可以穿透对称型NAT。总之,到目前为止,穿透对称型NAT是一个难点,我觉得QQ这类的可能也是转发,毕竟大部分的路由器都是锥型,只有公司之类的安全严格型对称型比较少吧。
此外,穿透对称型NAT还有一种基于端口预测的方法,
https://blog.csdn.net/bd_zengxinxin/article/details/80991689
这种方法从安全的角度来说是利用了目前路由器实现对称NAT的方法中存在端口可以预测的漏洞,利用这个漏洞来实现打洞。加上一次发送大量的包,来增加命中的概率。
但是也有不成功的可能性。
资料截图:
相关:
VOIP/SIP
1、VOIP:是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行通信。VoIP可用于包括VoIP电话、智能手机、个人计算机在内的诸多互联网接入设备,通过蜂窝网络、Wi-Fi进行通话及发送短信。
2、SIP:是一个应用层的信令控制协议。用于和一个或多个参与者创建、修改和终止会话。SIP的结构与HTTP(客户-服务器协议)相似。客户机发出请求,并发送给服务器,服务器处理这些请求后给客户机发送一个响应,该请求与响应形成一次事务。SIP 是一种源于互联网的IP 语音会话控制协议,具有灵活、易于实现、便于扩展等特点。 [1] 会。