备忘:
这里涉及到两个概念: NAT和PPPoE
借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个) 即可实现私有地址网络内所有计算机与Internet的通信需求。
udp打孔技术,是两个内网间的计算机A、B需要通信,但却都没有对方的公网IP地址,无法直接进行通信,
这时需要一个具有公网IP的服务器作为中转站,获取到两台计算机的公网IP、端口号(经过NAT变换)。
(接下来就可以进行打洞操作,打洞成功后两机之间即可建立连接。)
0.连接服务器前, A、B应已各自建立UDP监听
listenSocket = new DatagramSocket(listenPort);//必须传入listenPort
listenSocket.receive(packet...);
1. A向服务器请求和B(B的ID)通信,服务器查找地址表
listenSocket.send(cmd_packet...);
2.服务器发打洞命令给B,
3. B从打洞命令得到A的IP和端口号,B 发送一段message到A的IP、端口(路由器记录此次NAT会话),
4. B通知服务器,已发message给A,
5. 服务器通知A, A得到B的IP、端口号,
6.A向B的IP、端口发送message ,这样A、B之间建立了一个临时session(session由NAT记录, 超时后会删除此session),
7.打洞完成,两机可互相发送message。
(经测试,使用域名转换工具,如花生壳,使内部计算机做服务器也可以,关键是在路由器上做一个端口映射到内部计算机服务器的监 听端口)
打洞不一定能够成功,原因可能如下:
1 、NAT变换失败(具体需查询交换机支持哪种NAT变换)
2、现在普遍使用的ADSL,分配过来的IP是动态变化的(但在连网期间不应改变,所以A、B连接后应该定时发送连接包,保持连接)