最近忙项目,有点累,无暇顾急博客,4月份本来想写写流媒体的文章,结果回家休了两个月回深圳后,接了P2P的项目,那就开始P2P吧。

P2P起源于美国大学生Shawn Fanning 写的一个分享软件Napster:

--------

看到这张图,我们不禁会想起今天的电驴,的确很像,功能也相似,下载的同时也能分享自己电脑上的多媒体。
napster, 电驴是一代产品,迅雷,快播是二代产品,支持边下边播。
题外话扯多了,咱们步入正题。
P2P全称是 peer to peer,国内有被翻译成点对点协议,顾名思议,即客户端与客户端直连。
但是,问题是只有极少数情况下,客户端之间才能直连。
为什么呢,现在大家的PC大部分是“躲”在路由后面,路由设备保护大家,免受黑客的攻击。
试想一下,如果别人可以任意直连你的电脑,经常上传重口味艳照的你岂不是整天生活在恐惧之中。

路由设备通过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,尼玛也是分很多种的。

未完待续。。。。。先洗洗睡了。。。

[置顶] P2P之我见,关于打洞的学问-------开篇的更多相关文章

  1. [置顶] P2P网贷对推动社会发展的影响

    P2P网贷对推动社会发展的影响 1 真正的支持了实体经济,一般借款人就在几万或者50万以下 2 关照小微经济,新型行业.一般小微经济的创新更高,对社会的发展最大化. 3盘活存量 放到银行.保险.国债一 ...

  2. About me & 一些置顶的博文

    About me 一只历史上最弱的 \(\text{hnoier}\) ... 身在 \(\text{hn}\) 弱校,除了在四大名校夹缝中生存,还要受到同校 \(\text{Julao}\) 的鄙视 ...

  3. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  4. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  5. winform窗体置顶

    winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...

  6. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  7. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  8. Qt中让Qwidget置顶的方法

    一般来是说窗体置顶和取消只要        setWindowFlags(Qt::WindowStaysOnTopHint);        setWindowFlags(Qt::Widget); 要 ...

  9. js之滚动置顶效果

    0.js获取高度 ? 1 2 3 4 5 6 document.all   // 只有ie认识   document.body.clientHeight              // 文档的高,屏幕 ...

随机推荐

  1. QCombobox设置下拉框的宽度

    这几天写一个项目,里面用到qcombobox组件,其中下拉框含有129个子项,所以在点击的时候,一个下拉框就将整个电脑屏幕给占满了,很不好看并且在使用中会造成很大的苦恼.其实我就是想设置一个下拉框最大 ...

  2. file_get_contents post数据

    //默认模拟的header头 private function _defaultHeader() { $header = "User-Agent:Mozilla/5.0 (Windows; ...

  3. 多线程中Local Store Slot(本地存储槽)

    在Java中有一种ThreadLocal机制,为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线程的角度看,就好像每一个线程都完全 ...

  4. Linux下smi/mdio总线驱动

    Linux下smi/mdio总线驱动 韩大卫@吉林师范大学 MII(媒体独立接口), 是IEEE802.3定义的以太网行业标准接口, smi是mii中的标准管理接口, 有两跟管脚, mdio 和mdc ...

  5. Android二维码开源项目zxing用例简化和生成二维码、条形码

    上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...

  6. Android UI设计

    Android UI设计--PopupWindow显示位置设置 摘要: 当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的 ...

  7. OpenStack里的浮动ip

    缺省情况下实例会被赋予固定ip,这时并不能保证实例会马上可以从外面访问到,一般来说需要配置防火墙来允许公共ip,然后建立一条NAT规则从公共ip到私有ip的映射.OpenStack引入了一个叫浮动ip ...

  8. [Swust OJ 581]--彩色的石子(状压dp)

    题目链接:http://acm.swust.edu.cn/problem/0581/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  9. BestCoder Round #38

    1001 Four Inages Strategy 题意:给定空间的四个点,判断这四个点是否能形成正方形 思路:判断空间上4个点是否形成一个正方形方法有很多,这里给出一种方法,在p2,p3,p4中枚举 ...

  10. BZOJ 2821: 作诗(Poetize)( 分块 )

    分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...