关于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和端口通信
------解决方案--------------------原理是这样的 但是实现起来好难!
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------熟读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主机!和映射了端口!