[置顶] P2P之我见,关于打洞的学问-------开篇
最近忙项目,有点累,无暇顾急博客,4月份本来想写写流媒体的文章,结果回家休了两个月回深圳后,接了P2P的项目,那就开始P2P吧。
P2P起源于美国大学生Shawn Fanning 写的一个分享软件Napster:
--------
路由设备通过NAT杜绝”陌生人“访问你的PC,NAT全称是Network Address Translation,翻译过来就叫地址转换协议,有了它,再也不用为艳照发愁了。
NAT的工作粗略的有两点:
1.在内网的地址端口与公网的地址端口间建立映射。
2.为内网的地址建立信任链表。
第一点很好理解,假设你的内网IP是192.168.1.2, 路由设备的外网地址是225.211.224.11,现在要上某度查“冠西哥艳照门”,首先浏览器得访问某度的地址,假设是202.96.134.33, 浏览器发送一个请求过去,ip 包头里包含目标地址和来源地址,这里目标地址就是202.96.134.33,你的PC没有直接外网,IP包头当然就是192.168.1.2,假设不经转换,某度就会把你的请求返回给它的员工了,因为192.168.1.2是个局域网地址,要想如愿以偿的看到冠西哥的艳照,就得把来源地址改成公网IP:225.211.224.11,于是便有了NAT。NAT将会将你丢出去的每个IP包的来源地址改成公网IP,并将为你的每一个传输层端口分配一个公网端口。
这有点不大明白了,为什么还要重新分配端口呢,比哪我的TCP内网使用8090端口,NAT上也用8090与之对应不就可以了么。
问题是如果有两台或者几百台内网机器会怎样呢,都对应同样的端口么,你不反NAT将返回的结果返回给你的同事么,呵呵。
第二点的理解其实也很容易,有些恶心的公司喜欢收集大家的口味,你懂的。万幸有NAT,将它们拒之门外,当然,有时候你愿意分享你那独到的口味,比如你愿意让某度知道你喜欢冠希哥,用192.168.1.2:8090 访问某度225.211.224.11:80 , 这时候某度就可以将结果发给你了,你又要把口味发到某博:180.149.134.17:80,这样某博也能发信息给你了,其实NAT已经为192.168.1.2:8090建立了一个信任链表,包括:225.211.224.11:80,180.149.134.17:80,意思是这两个地址发来的信息都会无条件的转发给你,别人发来的一概不收。
是不是在说我跑题了,这和P2P有啥关系。
正是有了NAT,P2P就难多了,随着NAT的推广,连企鹅的标杆软件QQ都改用TCP了,当然企鹅还有其他不得已的苦衷,比如某部规定聊天软件不准用P2P。
正是有了NAT,现在P2P在国内被一个粗的不能再粗的词替代了:打洞。
哪里有洞打哪里,但是NAT的洞从外面是打不开的,要从里面打,从刚才的例子中,你能会想到如果A要发信息给B,首先得让B发个消息给A,这样B那边的NAT将会将A的地址放在信任列表里,不错,孺子可教也。。。
但是。。。现实是很残酷的,NAT,尼玛也是分很多种的。
未完待续。。。。。先洗洗睡了。。。
最新文章
- Java图片处理 Thumbnails框架
- JS 设计模式
- js的scroll详解
- C#高级编程笔记 Day 2, 2016年8月 31日 构造函数
- 开放产品开发(OPD):开篇
- Linux 上网络监控工具 ntopng 的安装
- laravel 框架 开源的cms推荐
- uva 11151
- PHP和JAVASCRIPT判断访客终端是电脑还是手机
- linux LVM 逻辑卷
- 总结C++中取成员函数地址的几种方法
- MyEclipse 中 添加 js自动完成模版
- 第五章之S5PV210将u-boot.bin从SD卡中搬到DDR中
- Think with Google 京东如何玩转TensorFlow?
- window安装mysql5.7解压版(解决乱码问题)
- Mac anaconda安装 “conda command not found” 解决方法
- 从零学习Fluter(三):Flutter的路由跳转以及state的生命周期
- Spring 学习——Aware接口
- c++11 template 模板练习
- Python -- 多媒体编程 -- 音乐播放