日期:2014-05-17  浏览次数:20750 次

关于UDP打洞的理解
各位大大,看了网上好多的关于UDP打洞原理一说,我说下我的理解看对不对。
clientA  clientB  serverC
目的:A想跟B通信
1:A与C通信  C获取A的外网IP及端口
2:B与C通信  C获取B的外网IP及端口
3:A给C获取到B的IP端口发消息(被丢弃)
4:B给C获取到A的IP端口发消息(被丢弃)
5: 之后A跟B就能直接通信了    

3和4步骤就是在打洞是吧   那么,这样真的可以实现吗,不用去管nat是属于那种类型的吗
还有   当C获取到的A、B的ip和端口  A、B的路由自动映射的端口会保持多久?

------解决方案--------------------
你需要了解TCPIP原理。原理明白了。一切都明白了。

------解决方案--------------------
如果A和B都在同一个内网,有时候需要使用他们的内网IP和端口通信



------解决方案--------------------
原理是这样的 但是实现起来好难!
------解决方案--------------------
引用:
我用C得到的AB外网IP和端口相互通信  但是相互接收不到  请教问题可能出在哪里


假如
clientA:内网ip:192.168.1.50:8000==>外网IP:200.1.1.1:8001
clientB:内网ip:192.168.1.100:9000==>外网IP:100.1.1.1:9001

clientA的UDP必须要绑定8000端口然后发消息到100.1.1.1:9001,B方的路由会转到发192.168.1.100:9000
clientB的UDP必须要绑定9000端口然后发消息到200.1.1.1:8001,A方的路由会转到发192.168.1.50:8000

192.168.1.50:8000和192.168.1.100:9000打洞成功后,只能用8000和9000这两个端口通信,其他的端口是不行的





------解决方案--------------------
引用:
nat只会对服务器发过来的数据包进行转发。对别的IP发过来的数据包是直接丢弃的。   我在网上找的答案  应该是这个没错  如何解决呢


第一次会直接丢弃,但路由已经记住你了,下次再发,就能收到了



------解决方案--------------------
熟读Tcp/ip原理才行啊。打洞不容易啊。

A,B在不同的局域网,也就是他们都没有外网ip,需要路由才能和外网做数据交互。
A链接C之后,C需要知道A的所有路由信息,包括局域网内的封包。
然后C告诉B,A的外网路由和局域网封包情况。B假装自己是C,通过数据封包穿透局域网路由与A通信。这样C就可以靠边站了。A,B之间的连接就接通了。

原理大概如此吧。

最好是谁能提供一套.net实现p2p的sdk,那就舒服了。
------解决方案--------------------
udp协议不是一种无连接的协议么??需要握手包???

在我的理解 udp打洞应该是这样的 

C1  C2  都先要和S连接 (这里最好是通过TCP协议和S连接,保证不会丢失数据)

当C1想要和C2交换数据的时候 C1先将自身的地址和要开放的 UDP 端口号发送给S 并告诉S希望和C2通讯

然后S与C2通讯告知C1的地址和UDP端口号同时要求C2提供地址和端口号

S获得C2的地址和端口号以后会将C2的地址和端口号回复给C1 

这个时候C1 和C2就可以互相发送数据了,C1要发送的数据直接往C2的地址和端口丢 C2要发送的数据直接往C1的地址和端口丢,当然,数据在传送的时候可能会丢失,如果需要保证数据完整就需要在软件层面上对发送接收的数据进行校验,也可以在软件层面上在通讯前发送一个握手包确定是否可以连接上,
------解决方案--------------------
我前段时间做了类似的这样一块功能
我是A和Server连接上(TCP),保存了Socket
B也同理和SerVer连接上,然后当A要和B通讯,不用告诉Server它的IP,因为貌似获取不到外网IP
只告诉它端口,然后Server通过Socket得到A的ip,然后把Ip:port发送给B,之后B就去连接它(当然我用的连接是TCP连接)!
Server在路由里设置了DMZ主机!和映射了端口!