如何实现p2p网络
序:学了几天的打洞,强烈推荐用UDP打洞,TCP打洞太麻烦了,而且问题很多。
NAT
具体就不过多累述了,上面链接写的很详细,现在使用的NAT方式大体都是一个私有IP和端口对应一个公网IP和端口
NAT打洞原理
NAT现在使用的基本都是只有当
- 消息从私有ip和端口从公网ip和端口流出
- 以后从公网来的这个公网ip和端口的包才能私网流入
也就是说,私网只能接受从它发出去到公网的ip和端口的包!(感觉有点绕口)
打洞
基于这个原理,就可以实现UDP打洞
- 当一个私有网络上线时,向目录服务器(也可以称为探索服务器等)发送上线的消息
- 目录服务器收到后,向该私有网络发送现在所在的所有网络的ip和端口(这些都是映射成公网的)并且向其他所有网络发送该私有网络的信息(也发送的是公网的消息)
- Then,连接成功
tcp打洞
同上,但是因为tcp不能直接发送报文,只能通过端口复用来先发送SYN报文,然后转为服务器的方式(很繁琐)
- A 发送 SYN 到 B (这个是公网ip和端口)
- B 发送 SYN 到 A
- 两个SYN中有一个会被对方的NAT丢弃,另一个成功通过NAT
- 通过NAT的SYN报文被其中一方收到,即返回SYNACK, 完成握手
- Then,连接成功