关于NAT穿越
看网上说的很玄呼,我不是很理解.谁能比较通俗的介绍一下.
比如 在公网有一个server S, 有两个client, A和B位于两个不同的内网, 假如单纯的A 与 S 通信,那么 A的connect 函数写的是 S的公网IP与端口吧? 而S收到的数据后, 得到与其连接的Socket的IP与端口 是 A的路由器的地址与端口吗? 如果是的话,那并
没有涉及到NAT转换呀? 这是路由器该干的事吧?!
假如 A要与B进行通信, 我的想法是这样: S返回B的路由的端口与IP 给A, A connect 这个地址与端口,与B进行通信. 而路由器自动将数据映射到各自相关的内网机器. 请大家说说我错在哪里了?
[解决办法]
"比如 在公网有一个server S, 有两个client, A和B位于两个不同的内网, 假如单纯的A 与 S 通信,那么 A的connect 函数写的是 S的公网IP与端口吧?"
对,没错!
"而S收到的数据后, 得到与其连接的Socket的IP与端口 是 A的路由器的地址与端口吗?"
主要看路由器是怎样实现NAT的,多数情况下,S获得的IP和端口是路由器的IP和路由器内的NAT表的一个索引
“假如 A要与B进行通信, 我的想法是这样: S返回B的路由的端口与IP 给A, A connect 这个地址与端口,与B进行通信. 而路由器自动将数据映射到各自相关的内网机器. 请大家说说我错在哪里了? ”
不清楚你是用TCP还是UDP实现,还是混合使用,对于不同协议,需要处理不同情况,例如对于TCP,需要设置端口重用。。
另外一个,B没有请求A的情况下,A自主来连接B,一般来说,B的防火墙认为A的数据是不请自来,会拒绝的。
关于NAT穿透,我现在也在研究中,有机会一起讨论,^_^
[解决办法]
按我个人的理解,你所说的就是所谓的打洞问题.
既:内网中的两个客户端A,B,连接到外网的服务器S,在S处都有相对应的A和B的ip地址和端口号.
假如 A要与B进行通信,
首先,A通知服务器S,让B向A发送udp包,S发报文给B,报文中报含将A对应的ip地址和端口号.
其次,A可以从服务器S处获取到B对应的Ip地址和端口号.A根据B的IP地址和端口号向B发送udp包.(肯定会失败,因为B的nat会丢弃)
再次,B根据S发送过来的报文请求,向A的Ip地址和端口号向A发送udp包.
至此,A与B之间就可以进行upd发送报文了.
最近也是在研究这个,还望指教.
[解决办法]