2012-06-18
来源:互联网 发布:网络大电影如何申报 编辑:程序博客网 时间:2024/06/06 03:16
昨天了解到一个自己不知道的东西,毕竟游戏没有这种应用场景,所以看看资料,UDP如何实现打洞实现P2P?
关键词:UDP, NAT
应用场景:
第一种场景,我们假设两个客户端都处于不同的NAT之后;
第二种场景,我们假设两个客户端都处于同一个NAT之后,但是它们彼此都不知道(他们在同一个NAT中)。
NAT的类型:
1 -Full Cone ,这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.
对于这种模式的不需要做打洞就能直接通信了
2 -Restricted Cone,这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.
3 -Port Restricted Cone,这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.
4 -Symmetric,对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.
总结
对于第一种场景来说,工作原理大致为:
公网server作为P2P协调,交换A和B的ip和port,
A和B通过对方的地址信息,通过udp进行发送数据包(告知双方NAT数据包可转发到本机)
即打洞成功,可以开始通信
对于第二种场景来说,工作原理大致为:
如果有多层NAT,则无法使用比较外网IP和内网IP的方法来确认A和B是否在用一NAT下,难道只能判断可能在同一NAT,然后做“尝试握手”?
另外,还需要做的两点是,
1.判断主机是否处于NAT下
a)可比较主机和本地地址和公网地址来判断
2.判断NAT的类型,然后来处理业务
a)根据NAT的特性来握手判断
备注问题
a)当NAT为Symmetric,实现打洞很困难,基本不考虑
b)当NAT为Port Restricted Cone模式,会出现一个问题
不同的IPC使用的UDP port 可能为重复的,集中监控客户端将以相同的端口来和很多IPC通信,会不会出问题呢?测试一下吧,以前用UDP的时间比较少。
UPNP
终于搞通了,局域网组播地址依然是:239.255.255.250:1900
sniff只能检测本地网卡的数据包,所以必须要把IPC插到网卡上看,放在局域网没用。还有IPC的UPNP发布时间为3秒间隔
CALL
M-SEARCH * HTTP/1.1
HOST:239.255.255.250:1900
ST:upnp:rootdevice
Man:"ssdp:discover"
MX:3
BACK
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=100
DATE: Thu, 01 Jan 1970 02:27:17 GMT
EXT:
LOCATION: http://192.168.1.90:49152/iftcdevicedesc.xml
SERVER: Linux/2.6.28, UPnP/1.0, Portable SDK for UPnP devices/1.6.6
X-User-Agent: redsonic
ST: upnp:rootdevice
USN: uuid:Upnp-Camera-1_0-000C0CA07911::upnp:rootdevice
keyword:
iftcdevicedesc.xml,可分析次字段来获取ip地址
- 2012-06-18
- 【心灵鸡汤】@2012-06-18
- 项目中一些总结 2012-06-18
- 2012-06-06
- [转]Ubuntu 12.04 使用Eclipse搭建C/C++编译环境 2012-06-13 22:07:18
- 06-8-18
- 06/18/09
- 10 06 18 问题
- 3025-06-18 日志
- 2012-1-06
- 2012-01-06
- 2012-03-06
- 2012-04-06
- 2012-06-01
- 2012-06-02早上
- 2012-06-03
- 2012-06-04
- 2012-06-05
- PDB Files: What Every Developer Must Know
- 蒂姆-库克于2010年5月14日在奥本大学毕业典礼上发表的演讲全文
- 6.16开发者日:UC梁捷谈Web App的未来
- iptables 修改
- How to Make an HTML5 iPhone App
- 2012-06-18
- 使用GDI+保存BITMAP到文件
- android Camera 应用流程 --Camera
- linux常用命令合集(持续更新……)
- Android上蓝牙通信功能开发:BluetoothChat例程分析
- 浅谈互联网安全的问题以及解决方法
- 关于NavigationBar的返回按钮
- struts 2-001-简单struts2实例开发
- Android中使用ormlite实现持久化--HelloOrmLite