﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-牵着老婆满街逛-随笔分类-P2P</title><link>http://www.cppblog.com/tx7do/category/2331.html</link><description>危机感是一种强大前进的动力！&lt;/br&gt;
GMail/GTalk: yanglinbo#google.com;&lt;/br&gt;
MSN/Email: tx7do#yahoo.com.cn;&lt;/br&gt;
QQ: 3 0 3 3 9 6 9 2 0 .</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 12:28:27 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 12:28:27 GMT</pubDate><ttl>60</ttl><item><title>P2P之UDP穿透NAT的原理与实现 - 增强篇</title><link>http://www.cppblog.com/tx7do/archive/2006/07/31/10723.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 31 Jul 2006 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/07/31/10723.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/10723.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/07/31/10723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/10723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/10723.html</trackback:ping><description><![CDATA[
		<p>关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone<br />原始作者: Hwycheng Leo(<a href="mailto:FlashBT@Hotmail.com">FlashBT@Hotmail.com</a>)<br />源码下载: <a href="http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar">http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar</a><br />参考：<a href="http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt">http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt</a><br />      P2P之UDP穿透NAT的原理与实现(shootingstars)</p>
		<p>文章说明:</p>
		<p>关于UDP穿透NAT的中文资料在网络上是很少的，仅有&lt;&lt;P2P之UDP穿透NAT的原理与实现(shootingstars)&gt;&gt;这篇文章有实际的参考价值。本人近两年来也一直从事P2P方面的开发工作，比较有代表性的是个人开发的BitTorrent下载软件 - FlashBT(变态快车). 对P2P下载或者P2P的开发感兴趣的朋友可以访问软件的官方主页: <a href="http://www.hwysoft.com/chs/">http://www.hwysoft.com/chs/</a> 下载看看，说不定有收获。写这篇文章的主要目的是懒的再每次单独回答一些网友的提问, 一次性写下来, 即节省了自己的时间，也方便了对于P2P的UDP穿透感兴趣的网友阅读和理解。对此有兴趣和经验的朋友可以给我发邮件或者访问我的个人Blog留言: <a href="http://hwycheng.blogchina.com/">http://hwycheng.blogchina.com</a>. <br />您可以自由转载此篇文章，但是请保留此说明。</p>
		<p>再次感谢shootingstars网友的早期贡献. 表示谢意。</p>
		<p>------------------------------------------------------------------------------------------------------------</p>
		<p>NAT(The IP Network Address Translator) 的概念和意义是什么?</p>
		<p>NAT, 中文翻译为网络地址转换。具体的详细信息可以访问RFC 1631 - <a href="http://www.faqs.org/rfcs/rfc1631.html">http://www.faqs.org/rfcs/rfc1631.html</a>, 这是对于NAT的定义和解释的最权威的描述。网络术语都是很抽象和艰涩的，除非是专业人士，否则很难从字面中来准确理解NAT的含义。</p>
		<p>要想完全明白NAT 的作用，我们必须理解IP地址的两大分类，一类是私有IP地址，在这里我们称作内网IP地址。一类是非私有的IP地址，在这里我们称作公网IP地址。关于IP地址的概念和作用的介绍参见我的另一篇文章: <a href="http://hwycheng.blogchina.com/2402121.html">http://hwycheng.blogchina.com/2402121.html</a></p>
		<p>内网IP地址: 是指使用A/B/C类中的私有地址, 分配的IP地址在全球不惧有唯一性，也因此无法被其它外网主机直接访问。<br />公网IP地址: 是指具有全球唯一的IP地址，能够直接被其它主机访问的。</p>
		<p>NAT 最初的目的是为使用内网IP地址的计算机提供通过少数几台具有公网的IP地址的计算机访问外部网络的功能。NAT 负责将某些内网IP地址的计算机向外部网络发出的IP数据包的源IP地址转换为NAT自己的公网的IP地址，目的IP地址不变, 并将IP数据包转发给路由器，最终到达外部的计算机。同时负责将外部的计算机返回的IP数据包的目的IP地址转换为内网的IP地址，源IP地址不变，并最终送达到内网中的计算机。<br />                                                 <br />        ----------------------                           ----------------------               <br />        | 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host<br />        ----------------------                           ----------------------               <br />                ^ port:2809                                      ^port: 1827                            <br />                |                                                |                            <br />                V                                                V                            <br />        ----------------------                           ----------------------               <br />        | 192.168.0.1        | NAT device                | 192.168.0.2        | NAT device    <br />        | 61.51.99.86        |                           | 61.51.77.66        |               <br />        ----------------------                           ----------------------               <br />                ^                                                ^                            <br />                |                                                |                            <br />                V port:80                                        V port: 80                           <br />        ----------------------                           ----------------------               <br />        | 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host <br />        ----------------------                           ----------------------               <br />                                                            <br />                              图一: NAT 实现了私有IP的计算机分享几个公网IP地址访问Internet的功能。<br />                              <br />随着网络的普及，IPv4的局限性暴露出来。公网IP地址成为一种稀缺的资源，此时NAT 的功能局限也暴露出来，同一个公网的IP地址，某个时间只能由一台私有IP地址的计算机使用。于是NAPT(The IP Network Address/Port Translator)应运而生，NAPT实现了多台私有IP地址的计算机可以同时通过一个公网IP地址来访问Internet的功能。这在很大程度上暂时缓解了IPv4地址资源的紧张。</p>
		<p>NAPT 负责将某些内网IP地址的计算机向外部网络发出的TCP/UDP数据包的源IP地址转换为NAPT自己的公网的IP地址，源端口转为NAPT自己的一个端口。目的IP地址和端口不变, 并将IP数据包发给路由器，最终到达外部的计算机。同时负责将外部的计算机返回的IP数据包的目的IP地址转换内网的IP地址，目的端口转为内网计算机的端口，源IP地址和源端口不变，并最终送达到内网中的计算机。</p>
		<p>                                                 <br />                ----------------------                           ----------------------               <br />                | 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host<br />                ----------------------                           ----------------------               <br />                        port: 2809      ^                   ^ port: 1827<br />                                         \                 /<br />                                          v               v                             <br />                                        ----------------------            <br />                                        | 192.168.0.1        | NAT device <br />                                        | 61.51.99.86        |            <br />                                        ----------------------                                  <br />        map port:9882 to 192.168.0.5:2809 ^              ^ map port: 9881 to 192.168.0.6:1827<br />                                         /                \<br />                             port:80    v                  v    port:80                         <br />                ----------------------                           ----------------------               <br />                | 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host <br />                ----------------------                           ----------------------                                 <br />                                <br />                              图二: NAPT 实现了私有IP的计算机分享一个公网IP地址访问Internet的功能。                                             <br /> <br />在我们的工作和生活中, NAPT的作用随处可见，绝大部分公司的网络架构，都是通过1至N台支持NAPT的路由器来实现公司的所有计算机连接外部的Internet网络的。包括本人在写这篇文章的时候，也是在家中使用一台IBM笔记本通过一台宽带连接的台式机来访问Internet的。我们本篇文章主要讨论的NAPT的问题。</p>
		<p>NAPT(The IP Network Address/Port Translator) 为何阻碍了P2P软件的应用?</p>
		<p>通过NAPT 上网的特点决定了只能由NAPT内的计算机主动向NAPT外部的主机发起连接，外部的主机想直接和NAPT内的计算机直接建立连接是不被允许的。IM(即时通讯)而言，这意味着由于NAPT内的计算机和NAPT外的计算机只能通过服务器中转数据来进行通讯。对于P2P方式的下载程序而言，意味着NAPT内的计算机不能接收到NAPT外部的连接，导致连接数用过少，下载速度很难上去。因此P2P软件必须要解决的一个问题就是要能够在一定的程度上解决NAPT内的计算机不能被外部连接的问题。</p>
		<p>NAT(The IP Network Address Translator) 进行UDP穿透的原理是什么?</p>
		<p>TCP/IP传输时主要用到TCP和UDP协议。TCP协议是可靠的，面向连接的传输协议。UDP是不可靠的，无连接的协议。根据TCP和UDP协议的实现原理，对于NAPT来进行穿透，主要是指的UDP协议。TCP协议也有可能，但是可行性非常小，要求更高，我们此处不作讨论，如果感兴趣可以到Google上搜索，有些文章对这个问题做了探讨性的描述。下面我们来看看利用UDP协议来穿透NAPT的原理是什么:</p>
		<p>                        ----------------------                           ----------------------               <br />                        | 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host<br />                        ----------------------                           ----------------------               <br />                          UDP port: 2809        ^                   ^ UDP port: 1827<br />                                                 \                 /<br />                                                  v               v                             <br />                                                ----------------------            <br />                                                | 192.168.0.1        | NAT device <br />                                                | 61.51.99.86        |            <br />                                                ----------------------                                  <br />  Session(192.168.0.6:1827 &lt;-&gt; 61.51.76.102:8098) ^              ^ Session(192.168.0.6:1827 &lt;-&gt; 61.51.76.102:8098)<br />               map port:9882 to 192.168.0.5:2809 /                \map port: 9881 to 192.168.0.6:1827<br />                                  UDP port:8098 v                  v    UDP port:8098                           <br />                        ----------------------                           ----------------------               <br />                        | 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host <br />                        ----------------------                           ----------------------                 <br />                                                        <br />                                        <br />                                      图三: NAPT 是如何将私有IP地址的UDP数据包与公网主机进行透明传输的。</p>
		<p>UDP协议包经NAPT透明传输的说明:</p>
		<p>NAPT为每一个Session分配一个NAPT自己的端口号，依据此端口号来判断将收到的公网IP主机返回的TCP/IP数据包转发给那台内网IP地址的计算机。在这里Session是虚拟的，UDP通讯并不需要建立连接，但是对于NAPT而言，的确要有一个Session的概念存在。NAPT对于UDP协议包的透明传输面临的一个重要的问题就是如何处理这个虚拟的Session。我们都知道TCP连接的Session以SYN包开始，以FIN包结束，NAPT可以很容易的获取到TCP Session的生命周期，并进行处理。但是对于UDP而言，就麻烦了，NAPT并不知道转发出去的UDP协议包是否到达了目的主机，也没有办法知道。而且鉴于UDP协议的特点，可靠很差，因此NAPT必须强制维持Session的存在，以便等待将外部送回来的数据并转发给曾经发起请求的内网IP地址的计算机。NAPT具体如何处理UDP Session的超时呢？不同的厂商提供的设备对于NAPT的实现不近相同，也许几分钟，也许几个小时，些NAPT的实现还会根据设备的忙碌状态进行智能计算超时时间的长短。</p>
		<p>                  [192.168.0.6:1827]<br />                            | UDP Packet[src ip:192.168.0.6 src port:1827 dst ip:61.51.76.102 dst port 8098]<br />                            v<br />        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]<br />                            | UDP Packet[src ip:61.51.99.86 src port:9881 dst ip:61.51.76.102 dst port 8098]<br />                            v                   <br />                  [61.51.76.102:8098]<br />                  <br />                                    图四: NAPT 将内部发出的UDP协议包的源地址和源端口改变传输给公网IP主机。<br />                                    <br />                                    <br />                  [192.168.0.6:1827]<br />                            ^<br />                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:192.168.0.6 dst port 1827]<br />        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]<br />                            ^   <br />                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:61.51.99.86 dst port 9881]    <br />                  [61.51.76.102:8098]<br />                  <br />                                    图五: NAPT 将收到的公网IP主机返回的UDP协议包的目的地址和目的端口改变传输给内网IP计算机。                                <br />现在我们大概明白了NAPT如何实现内网计算机和外网主机间的透明通讯。现在来看一下我们最关心的问题，就是NAPT是依据什么策略来判断是否要为一个请求发出的UDP数据包建立Session的呢？主要有一下几个策略: </p>
		<p>A. 源地址(内网IP地址)不同，忽略其它因素, 在NAPT上肯定对应不同的Session<br />B. 源地址(内网IP地址)相同，源端口不同，忽略其它的因素，则在NAPT上也肯定对应不同的Session<br />C. 源地址(内网IP地址)相同，源端口相同，目的地址(公网IP地址)相同，目的端口不同，则在NAPT上肯定对应同一个Session<br />D. 源地址(内网IP地址)相同，源端口相同，目的地址(公网IP地址)不同，忽略目的端口，则在NAPT上是如何处理Session的呢？</p>
		<p>D的情况正式我们关心和要讨论的问题。依据目的地址(公网IP地址)对于Session的建立的决定方式我们将NAPT设备划分为两大类:</p>
		<p>Symmetric NAPT:<br />对于到同一个IP地址，任意端口的连接分配使用同一个Session; 对于到不同的IP地址, 任意端口的连接使用不同的Session. <br />我们称此种NAPT为 Symmetric NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的IP地址不同，则会建立不同的Session.</p>
		<p>        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]<br />                ^               ^                       ^<br />                |               |                       |<br />                v               v                       v<br />               9883            9882                    9881<br />                                 |<br />                             \ [NAT] /<br />                                 ^<br />                                 |<br />                                 v                        <br />                          [192.168.0.6:1827]<br />                          <br />                          图六: Symmetric 的英文意思是对称。多个端口对应多个主机，平行的，对称的!<br />                  <br />Cone NAPT:<br />对于到同一个IP地址，任意端口的连接分配使用同一个Session; 对于到不同的IP地址，任意端口的连接也使用同一个Session.<br />我们称此种NAPT为 Cone NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的地址不管是否相同， 都使用同一个Session.</p>
		<p>        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]</p>
		<p>                        ^          ^         ^<br />                         \         |        /<br />                          v        v       v<br />                                 9881<br />                                 [NAT]<br />                                   ^<br />                                   |<br />                                   v                      <br />                          [192.168.0.6:1827]<br />                          <br />                          图七: Cone 的英文意思是锥。一个端口对应多个主机，是不是像个锥子?</p>
		<p>现在绝大多数的NAPT属于后者，即Cone NAT。本人在测试的过程中，只好使用了一台日本的Symmetric NAT。还好不是自己的买的，我从不买日货, 希望看这篇文章的朋友也自觉的不要购买日本的东西。Win9x/2K/XP/2003系统自带的NAPT也是属于 Cone NAT的。这是值的庆幸的，因为我们要做的UDP穿透只能在Cone NAT间进行，只要有一台不是Cone NAT，对不起，UDP穿透没有希望了，服务器转发吧。后面会做详细分析!</p>
		<p>下面我们再来分析一下NAPT 工作时的一些数据结构，在这里我们将真正说明UDP可以穿透Cone NAT的依据。这里描述的数据结构只是为了说明原理，不具有实际参考价值，真正感兴趣可以阅读Linux的中关于NAT实现部分的源码。真正的NAT实现也没有利用数据库的，呵呵，为了速度！</p>
		<p>Symmetric NAPT 工作时的端口映射数据结构如下:</p>
		<p>内网信息表:</p>
		<p>[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ 外网IP地址 ] [ SessionTime 开始时间 ]</p>
		<p>PRIMARY KEY( [NAPT 分配端口] ) -&gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找.<br />UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.<br />UNIQUE( [ 内网IP地址 ], [ 内网端口 ], [ 外网IP地址 ] ) -&gt; 表示这三个字段联合起来不能重复.</p>
		<p>映射表:</p>
		<p>[NAPT 分配端口] [ 外网端口 ]</p>
		<p>UNIQUE( [NAPT 分配端口], [ 外网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.</p>
		<p>Cone NAPT 工作时的端口映射数据结构如下:</p>
		<p>内网信息表:</p>
		<p>[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ SessionTime 开始时间 ]</p>
		<p>PRIMARY KEY( [NAPT 分配端口] ) -&gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找.<br />UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.</p>
		<p>外网信息表:</p>
		<p>[ wid 主键标识 ] [ 外网IP地址 ] [ 外网端口 ]</p>
		<p>PRIMARY KEY( [ wid 主键标识 ] ) -&gt; 表示依据[ wid 主键标识 ]建立主键，必须唯一且建立索引，加快查找.<br />UNIQUE( [ 外网IP地址 ], [ 外网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.</p>
		<p>映射表: 实现一对多，的</p>
		<p>[NAPT 分配端口] [ wid 主键标识 ]</p>
		<p>UNIQUE( [NAPT 分配端口], [ wid 主键标识 ] ) -&gt; 表示这两个字段联合起来不能重复.<br />UNIQUE( [ wid 主键标识 ] ) -&gt; 标识此字段不能重复.</p>
		<p>看完了上面的数据结构是更明白了还是更晕了？ 呵呵! 多想一会儿就会明白了。通过NAT,内网计算机计算机向外连结是很容易的，NAPT会自动处理，我们的应用程序根本不必关心它是如何处理的。那么外部的计算机想访问内网中的计算机如何实现呢？我们来看一下下面的流程：</p>
		<p>c 是一台在NAPT后面的内网计算机，s是一台有外网IP地址的计算机。c 主动向 s 发起连接请求，NAPT依据上面描述的规则在自己的数据结构中记录下来，建立一个Session. 然后 c 和 s 之间就可以实现双向的透明的数据传输了。如下面所示:</p>
		<p>   c[192.168.0.6:1827] &lt;-&gt; [priv ip: 192.168.0.1]NAPT[pub ip: 61.51.99.86:9881] &lt;-&gt; s[61.51.76.102:8098]</p>
		<p>由此可见，一台外网IP地址的计算机想和NAPT后面的内网计算机通讯的条件就是要求NAPT后面的内网计算机主动向外网IP地址的计算机发起一个UDP数据包。外网IP地址的计算机利用收到的UDP数据包获取到NAPT的外网IP地址和映射的端口，以后就可以和内网IP的计算机透明的进行通讯了。<br />    <br />现在我们再来分析一下我们最关心的两个NAPT后面的内网计算机如何实现直接通讯呢? 两者都无法主动发出连接请求，谁也不知道对方的NAPT的公网IP地址和NAPT上面映射的端口号。所以我们要靠一个公网IP地址的服务器帮助两者来建立连接。当两个NAPT后面的内网计算机分别连接了公网IP地址的服务器后，服务器可以从收到的UDP数据包中获取到这两个NAPT设备的公网IP地址和这两个连接建立的Session的映射端口。两个内网计算机可以从服务器上获取到对方的NAPT设备公网IP地址和映射的端口了。</p>
		<p>我们假设两个内网计算机分别为A和B，对应的NAPT分别为AN和BN， 如果A在获取到B对应的BN的IP地址和映射的端口后，迫不急待的向这个IP<br />地址和映射的端口发送了个UDP数据包，会有什么情况发生呢？依据上面的原理和数据结构我们会知道，AN会在自己的数据结构中生成一条记录，标识一个新Session的存在。BN在收到数据包后，从自己的数据结构中查询，没有找到相关记录，因此将包丢弃。B是个慢性子，此时才慢吞吞的向着AN的IP地址和映射的端口发送了一个UDP数据包，结果如何呢？当然是我们期望的结构了，AN在收到数据包后，从自己的数据结构中查找到了记录，所以将数据包进行处理发送给了A。A 再次向B发送数据包时，一切都时畅通无阻了。OK, 大工告成！且慢，这时对于Cone NAPT而言，对于Symmetric NAPT呢？呵呵，自己分析一下吧...</p>
		<p>NAPT(The IP Network Address/Port Translator) 进行UDP穿透的具体情况分析!</p>
		<p>首先明确的将NAPT设备按照上面的说明分为: Symmetric NAPT 和 Cone NAPT, Cone NAPT 是我们需要的。Win9x/2K/XP/2003 自带的NAPT也为Cone NAPT。</p>
		<p>第一种情况, 双方都是Symmetric NAPT:</p>
		<p>此情况应给不存在什么问题，肯定是不支持UDP穿透。</p>
		<p>第二种情况, 双方都是Cone NAPT:</p>
		<p>此情况是我们需要的，可以进行UDP穿透。</p>
		<p>第三种情况, 一个是Symmetric NAPT, 一个是Cone NAPT:</p>
		<p>此情况比较复杂，但我们按照上面的描述和数据机构进行一下分析也很容易就会明白了, 分析如下,</p>
		<p>假设: A -&gt; Symmetric NAT, B -&gt; Cone NAT</p>
		<p>1. A 想连接 B, A 从服务器那儿获取到 B 的NAT地址和映射端口, A 通知服务器，服务器告知 B A的NAT地址和映射端口, B 向 A 发起连接，A 肯定无法接收到。此时 A 向 B 发起连接， A 对应的NAT建立了一个新的Session，分配了一个新的映射端口， B 的 NAT 接收到UDP包后，在自己的映射表中查询，无法找到映射项，因此将包丢弃了。</p>
		<p>2. B 想连接 A, B 从服务器那儿获取到 A 的NAT地址和映射端口, B 通知服务器, 服务器告知 A B的NAT地址和映射端口,A 向 B 发起连接, A 对应的NAT建立了一个新的Session，分配了一个新的映射端口B肯定无法接收到。此时 B 向 A 发起连接, 由于 B 无法获取 A 建立的新的Session的映射端口，仍是使用服务器上获取的映射端口进行连接， 因此 A 的NAT在接收到UDP包后，在自己的映射表中查询，无法找到映射项, 因此将包丢弃了。</p>
		<p>根据以上分析，只有当连接的两端的NAT都为Cone NAT的情况下，才能进行UDP的内网穿透互联。</p>
		<p>
				<br />NAPT(The IP Network Address/Port Translator) 进行UDP穿透如何进行现实的验证和分析!</p>
		<p>需要的网络结构如下:</p>
		<p>三个NAT后面的内网机器，两个外网服务器。其中两台Cone NAPT，一台 Symmetric NAPT。</p>
		<p>验证方法:</p>
		<p>可以使用本程序提供的源码，编译，然后分别运行服务器程序和客户端。修改过后的源码增加了客户端之间直接通过IP地址和端口发送消息的命令，利用此命令，你可以手动的验证NAPT的穿透情况。为了方便操作，推荐你使用一个远程登陆软件，可以直接在一台机器上操作所有的相关的计算机，这样很方便，一个人就可以完成所有的工作了。呵呵，本人就是这么完成的。欢迎有兴趣和经验的朋友来信批评指正，共同进步。</p>
<img src ="http://www.cppblog.com/tx7do/aggbug/10723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-07-31 11:47 <a href="http://www.cppblog.com/tx7do/archive/2006/07/31/10723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>P2P 应用程序框架</title><link>http://www.cppblog.com/tx7do/archive/2006/07/31/10722.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 31 Jul 2006 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/07/31/10722.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/10722.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/07/31/10722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/10722.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/10722.html</trackback:ping><description><![CDATA[(来源：http://www-900.ibm.com/developerWorks/) <br /><br /><table cellspacing="0" cellpadding="0" width="168" align="right" border="0"><tbody><tr><!-- Sidebar Gutter --><td width="8"><img height="21" alt="" src="http://www.huihoo.com/developerWorks/i/c.gif" width="5" /></td><td width="160"><!-- Start TOC --><table cellspacing="0" cellpadding="0" width="160" border="0"><tbody><tr><td width="160" bgcolor="#000000" height="1"><img height="1" alt="" src="http://www.huihoo.com/developerWorks/i/c.gif" width="160" /></td></tr><tr><td align="middle" background="/developerWorks/i/bg-gold.gif" height="5"><b>内容：</b></td></tr><tr><td width="160" bgcolor="#666666" height="1"><img height="1" alt="" src="http://www.huihoo.com/developerWorks/i/c.gif" width="160" /></td></tr><tr><td align="right"><table cellspacing="0" cellpadding="3" width="98%" border="0"><tbody><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#1">安装与执行</a></td></tr><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#2">配置文件</a></td></tr><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#3">代码</a></td></tr><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#4">结束语</a></td></tr><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#resources">参考资料</a></td></tr><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#author1">关于作者</a></td></tr><tr><td><a href="http://www.huihoo.com/p2p/p2p.html#rating">对本文的评价</a></td></tr></tbody></table></td></tr></tbody></table><!-- End TOC --><table cellspacing="0" cellpadding="0" width="160" border="0"><tbody><tr><td width="150" bgcolor="#000000" colspan="2" height="2"><img height="2" alt="" src="http://www.huihoo.com/developerWorks/i/c.gif" width="160" /></td></tr><tr><td width="150" bgcolor="#ffffff" colspan="2" height="2"><img height="2" alt="" src="http://www.huihoo.com/developerWorks/i/c.gif" width="160" /></td></tr></tbody></table><!-- END STANDARD SIDEBAR AREA --></td></tr></tbody></table><b class="atitle2">深入细节</b><!-- SET BODY FONT --><p><a href="http://www.huihoo.com/p2p/p2p.html#author1">Todd Sundsted</a> (<a href="mailto:todd-p2p@etcee.com">todd-p2p@etcee.com</a>)<br />首席设计师，PointFire, Inc.<br />2001 年 5 月</p><p></p><blockquote>理解 P2P 计算技术方面的最好方法是仔细观察一个实际的 P2P 应用程序。这个月，Todd Sundsted 将带您体验这样一个应用程序。他描述了如何安装、配置这个应用程序，以及它是如何工作的。</blockquote><p></p><p>在 P2P 计算领域方面，我们只写了一篇文章，现在已经是转变的时候了。根据 <a href="http://www.huihoo.com/developerWorks/java/j-p2p/index.shtml">"The practice of peer-to-peer computing: Introduction and history（对等计算实践：介绍与历史）"</a>的读者反馈意见，我认识到：读者对于使用和理解 P2P 应用程序的兴趣远比我预想的大。最初，我只把这个应用程序看成是这样一种方便的资源，可以从中提取示例，以阐明文章中所陈述的观点。结果表明，某些读者希望得到更详细的信息，因此，我将在这个月提供这方面的信息。</p><p>这个月，我将不在高层次领域（高达 1000 英尺）继续讨论，也不解决安全性问题，相反，我将在低层次领域（50 英尺）讨论应用程序框架。</p><p>我真诚地希望这个转变将比现实生活中经常遇到的转变更令人愉快。</p><p><a name="1"></a><b class="atitle2">安装与执行</b><br />让我们从安装的具体细节开始。我略微更改了启动 P2P 应用程序的过程，因为在上个月，一些读者在启动应用程序时遇到了问题。</p><p>在可以运行 P2P 应用程序之前，必须下载两个 jar 文件 -- p2p.jar 和 spp.jar -- 以及配置文件 app.properties（请参阅<a href="http://www.huihoo.com/p2p/p2p.html#resources">参考资料</a>）。p2p.jar 文件包含 P2P 应用程序自身的类文件。spp.jar 文件包含 P2P 应用程序所使用的消息传递库的类文件。</p><p>下载这些文件之后，将这两个 jar 文件和包含配置文件的目录添加到类路径中。</p><p>如果您正在运行 Windows，并且已经将这两个 jar 文件和配置文件下载到 c:\p2p 目录，则可以如下设置类路径：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  set CLASSPATH=c:\p2p\p2p.jar;c:\p2p\spp.jar;c:\p2p
</code></pre></td></tr></tbody></table><p>如果您正在运行 Linux、Solaris 或某个合适的 UNIX 变体，并且已经将这两个 jar 文件和配置文件下载到 /home/foo/p2p 目录，可如下设置类路径：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  export CLASSPATH=/home/foo/p2p/p2p.jar:/home/foo/p2p/spp.jar:/home/foo/p2p
</code></pre></td></tr></tbody></table><p>（以上命令假设您正在运行 BASH 来作为命令 shell）。我将如何在其它流行的 shell（如 CSH）中设置环境变量的问题留给您自己去考虑。</p><p>一旦设置了类路径，就可以用以下命令启动应用程序：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  java com.etcee.app.ki.Main
</code></pre></td></tr></tbody></table><p>P2P 应用程序将显示一个别致的信息性标志和一个命令提示来欢迎您。</p><p>最后再说一遍：我的 P2P 应用程序一定需要 Java 2 平台。</p><p><a name="2"></a><b class="atitle2">配置文件</b><br />前几步将启动并运行 P2P 应用程序，但是，在能够很好地使用它之前，必须编辑配置文件。配置文件定义 P2P 应用程序使用的端口、控制的资源以及识别的伙伴。清单 1 演示了每一个定义。</p><p><a name="code"></a><b>清单 1. 示例配置文件</b></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  com.etcee.app.ki.port=7777
  com.etcee.app.ki.resource.0.name=share
  com.etcee.app.ki.resource.0.class=com.etcee.app.ki.resource.file.FileResource
  com.etcee.app.ki.resource.0.arg0=/home/foo/share
  com.etcee.app.ki.resource.1.name=tmp
  com.etcee.app.ki.resource.1.class=com.etcee.app.ki.resource.file.FileResource
  com.etcee.app.ki.resource.1.arg0=/tmp
  com.etcee.app.ki.peer.0=bass:7777
  com.etcee.app.ki.peer.1=salmon:7777
  com.etcee.app.ki.peer.2=perch:7777
  com.etcee.app.ki.peer.3=guppy:7777
</code></pre></td></tr></tbody></table><p>第一部分由一行组成，它定义了 P2P 应用程序用来接收其它伙伴连接请求的端口。最好不要改变这行。</p><p>第二部分定义 P2P 应用程序管理的资源。您可能需要编辑这部分。清单 1 定义了两个资源：<code>share</code> 和 <code>tmp</code>。从应用程序的观点来看，资源只是实现 <code>Resource</code> 接口的类的实例，我们将马上讲到这点。资源定义一般具有以下基本形式：</p><p><a name="code"></a><b>清单 2. 资源定义</b></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  com.etcee.app.ki.resource.0.name=&lt;name&gt;
  com.etcee.app.ki.resource.0.class=&lt;implementation class&gt;
  com.etcee.app.ki.resource.0.arg0=&lt;initialization argument&gt;
  com.etcee.app.ki.resource.0.arg1=&lt;initialization argument&gt;
     .
     .
</code></pre></td></tr></tbody></table><p><i>name</i> 是给予资源的名称，它用来生成人们可读的输出。<i>class</i> 是 Java 类的名称，可以将其初始化以创建资源。P2P 应用程序在运行期间动态装入这个类并将其初始化。在其初始化期间，<i>argN</i> 自变量被传递到新初始化的资源。例如，<code>FileResource</code> 类使用这些自变量定义目录来为文件提供服务。您需要编辑目录自变量以指向您机器上的某个目录。</p><p>第三部分定义 P2P 应用程序识别的伙伴。每一行都包含伙伴的名称（或 IP 地址）和伙伴的端口。用这种方式定义伙伴显然不是可伸缩的解决方案。在以后的文章中，我们将看一种更好的解决方案。</p><p><a name="3"></a><b class="atitle2">代码</b><br />除了对等通信采用的 SPP（简单点到点）包之外，P2P 应用程序不包含很多类。首先，我们先仔细查看最重要的类，最后再看一下 SPP 通信包。</p><p><b>资源</b><br />P2P 应用程序的主要组件是资源。事实上，P2P 应用程序只是允许和控制对已发布资源的远程访问。资源可以是任何可寻址的事物 -- 文件系统、电话簿、数据库和目录。每个资源都管理零个或多个适当类型的项（文件系统资源管理文件，电话簿资源管理电话号码）。</p><p>为演示如何实现资源，我创建了一个简单的文件系统资源类 <code>FileResource</code>，如清单 3 所示。这个文件系统资源管理零个或多个文件。</p><p><a name="code"></a><b>清单 3. <code>Resource</code> 接口</b></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  public
  interface Resource
  {
    // The initialize() method requires a TTDFactory instance
    // (which the factory uses to create the TTDItem instances
    // it returns from the select() method in response to a
    // query) and a String array (which contains the arguments
    // from the configuration file).
    public
    void
    initialize(TTDFactory ttdfactory, String [] arstring)
    throws ResourceException;
    // The select() method requires a String instance that
    // defines the selection criteria.  It returns an array
    // of TTDItems, one for each entry that matches the
    // selection criteria.
    public
    TTDItem []
    select(String stringSelector)
    throws ResourceException;
  }
</code></pre></td></tr></tbody></table><p><code>Resource</code> 接口定义资源的结构和行为。该接口还定义允许在资源上执行的操作。目前的操作列表包括 <i>select</i>。以后的实现还将包括 <i>insert</i> 和 <i>delete</i>。</p><p><code>select()</code> 方法将一个定义选择标准的字符串作为参数。该方法返回有关所有与选择标准匹配的资源项的信息。按照当前 P2P 应用程序中的文件系统资源所实现的方式，选择字符串既可以直接命名一项，也可以包含通配符 "*"，当直接命名一项时，资源将返回该项本身及其相关元数据；当包含通配符时，资源将只返回它所管理的所有项的元数据。还可以使用更复杂的查询语言，但这不在本文讨论范围之内。</p><p><b>Shell</b><br /><code>Shell</code> 类只是一个允许用户浏览本地和远程资源的非常简单的命令行用户接口。它使用 <code>PeerReference</code>、<code>ResourceReference</code> 和 <code>ItemReference</code> 类向其它伙伴发送请求，但它本身只分析用户输入。</p><p>为了从请求伙伴的角度更好地理解通信的工作原理，让我们看一下<a href="http://www.huihoo.com/p2p/listing4.html" target="_new">清单 4</a> 中显示的 <code>PeerReference</code> 类的一部分。</p><p>因为我在<a href="http://www.huihoo.com/developerWorks/java/j-p2p/index.shtml">上个月</a>详细描述了通过 shell 进行的用户交互，所以不再这里重述。在第一次启动 P2P 应用程序之前，请停一下并使自己重新熟悉它的操作。</p><p><b>通信</b><br />P2P 所做的全部就是伙伴间的通信。那些对原始得令人难以置信的 Napster 协议熟悉的读者应该理解我为什么选择高级一些的协议。我在这里只略微提及 SPP。在以后有关 P2P 通信的文章中，我将详细描述它。</p><p>SPP 将消息建模成一个帧序列，如图 1 所示。</p><p><a name="figure"></a><b>图 1. 消息</b><br /><img height="150" alt="建模成帧序列的消息" src="http://www.huihoo.com/p2p/i/figure.gif" width="123" /></p><p>消息中的每一帧都有一个类型（由 MIME 类型指明）和一个主体。帧中的头是可选的，它用来描述主体中的数据。</p><p>构成完整而正确的消息的序列中的帧类型取决于应用程序。一般来讲，一条消息由一个控制帧和其后零个或多个数据帧组成。数据帧包含控制帧所引用的数据。我们的 P2P 应用程序就采用这种模式。</p><p>消息出现在请求／响应对中。一个伙伴向另一个伙伴发送请求。那个伙伴再将响应发回给第一个伙伴。</p><p>请求消息中的控制帧是命令帧。它包含命令和为该命令提供的所有参数。如果有任何其它帧存在，则这些帧包含命令帧所需的信息。</p><p>响应消息中的控制帧是状态帧。它包含状态（正确或错误）。如果有任何其它帧存在，则这些帧包含状态帧所引用的信息。如果向文件系统资源发出请求，则该信息将包含所选文件的内容。</p><p>多帧消息模式的优点在于：它允许在通信应用程序之间交换内容丰富的消息。SPP 在很多方面都类似于 BXXP（请参阅<a href="http://www.huihoo.com/p2p/p2p.html#resources">参考资料</a>）。</p><p><a name="4"></a><b class="atitle2">结束语</b><br />完全理解了框架之后，我们就可以在下个月继续讨论 P2P 安全性了。我们还将在 P2P 应用程序中集成安全性支持。</p><!-- Enter list of article resources here --><a name="resources"><p><b class="atitle2">参考资料</b></p><ul><li>下载运行 P2P 应用程序所需的 <a href="http://www.huihoo.com/p2p/p2p.zip">jar 文件和配置文件</a>。<br /><br /></li><li>在 <a href="http://www.peer-to-peerwg.org/">http://www.peer-to-peerwg.org/</a> 中仔细查看 P2P 计算的业界支持。<br /><br /></li><li>如果要使用原始协议，最好阅读 <a href="http://opennap.sourceforge.net/napster.txt">Napster protocol</a>。<br /><br /></li><li><a href="http://www.bxxp.org/bxxp/">BXXP</a> 是一种较先进的通信方式。<br /><br /></li><li>Sean Gallagher 的 <a href="http://www-106.ibm.com/developerWorks/java/library/cl-gall.html">"Don't steal the music -- steal the idea"</a>（developerWorks，2000 年 9 月）解释了象 Napster 这样的对等工具如何提供联机协作工作的有价值的洞察。<br /><br /></li><li>Graham Glass 在其 <a href="http://www-106.ibm.com/developerWorks/java/library/ws-peer1.html">"The Web services (r)evolution," 第 1 部分</a>、<a href="http://www-106.ibm.com/developerWorks/java/library/ws-peer2/">第 2 部分</a>、<a href="http://www-106.ibm.com/developerWorks/java/library/ws-peer3/">第 3 部分</a>和<a href="http://www-106.ibm.com/developerWorks/java/library/ws-peer4/">第 4 部分</a>系列中研究了对等 Web 应用程序。<br /><br /></li><li><a href="http://www.huihoo.com/developerWorks/cgi-bin/click.cgi?url=http://www-4.ibm.com/software/is/emms/&amp;origin=j">IBM Electronic Media Management System (EMMS)</a> 技术允许内容所有者安全地在开放公共网络上传递数字资产。<br /><br /></li><li>使用 <a href="http://www.huihoo.com/developerWorks/cgi-bin/click.cgi?url=http://www-4.ibm.com/software/network/technology/appnhpr/&amp;origin=j">Advanced Peer-to-Peer Networking (APPN) 和 High Performance Routing (HPR) 技术</a>，IBM 联网软件提供一整套节约成本的客户机／服务器连接选项，它可以扩展到最大和要求最苛刻的环境，同时提供安全可靠的质量、安全性和可用性。<br /><br /></li><li><a href="http://www.huihoo.com/developerWorks/cgi-bin/click.cgi?url=http://www-4.ibm.com/software/data/dpropr/peers2.html&amp;origin=j">"Using DB2 Data Propagator in a peer-to-peer configuration"</a>（DB2 产品系列，2000 年 4 月）关注了在多层配置中只有一个数据库服务器的问题。<br /><br /></li><li><a href="http://www.huihoo.com/developerWorks/cgi-bin/click.cgi?url=http://www.lotus.com/developers/devbase.nsf/homedata/article?OpenDocument%26url=/developers/devbase.nsf/articles/doc2001020200/&amp;origin=j">Nothing New Under the Sun (or NeXT)</a>（Sean Gallagher 著，Lotus Developer Network）讲解了有关 P2P 的常见用语。<br /><br /></li><li>阅读 Todd 有关对等计算的<a href="http://www-106.ibm.com/developerWorks/java/library/j-p2pcol.html">前一篇文章</a>。 </li></ul><!-- Enter author bios here; make author heading singular or plural as needed --><a name="author1"><p><b class="atitle2">关于作者</b><br />自从方便的台式机出现以来，Todd Sundsted 就一直在编写程序。尽管最初对用 C++ 构建分布式应用程序感兴趣，但是，当 Java 成为同类语言中明显的选择时，Todd 转到了 Java 编程语言。除了写文章之外，Todd 还是 PointFire, Inc. 的创始人之一和首席设计师。可以通过 <a href="mailto:todd-p2p@etcee.com">todd-p2p@etcee.com</a> 与 Todd 联系。</p></a></a><img src ="http://www.cppblog.com/tx7do/aggbug/10722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-07-31 11:21 <a href="http://www.cppblog.com/tx7do/archive/2006/07/31/10722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>P2P技术与应用</title><link>http://www.cppblog.com/tx7do/archive/2006/07/31/10721.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 31 Jul 2006 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/07/31/10721.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/10721.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/07/31/10721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/10721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/10721.html</trackback:ping><description><![CDATA[(来源：http://www2.ccw.com.cn/01/0128/d/0128d06_1.asp) <br /><br /><!-- START BODY AREA -->P2P即Peer to Peer,称为对等连接或对等网络，P2P技术主要指由硬件形成连接后的信息控制技术，其代表形式是软件。 
<p class="a14"><b>技术背景</b></p><p class="a14">P2P起源于最初的联网通信方式，如在建筑物内PC通过局域网互联，不同建筑物间通过Modem远程拨号互联。其中建立在TCP/IP协议之上的通信模式构成了今日互联网的基础，所以从基础技术角度看，P2P不是新技术，而是新的应用技术模式。 
</p><p class="a14">今天，P2P再一次被关注主要是由Napster以及ICQ类软件的出现，虽然在Napster之前P2P方式的研究也从未停止。 
</p><p class="a14">现在互联网是以S（Server）/ B（Browser）或S/C（Client）结构的应用模式为主的，这样的应用必须在网络内设置一个服务器，信息通过服务器才可以传递。信息或是先集中上传到服务器保存,然后再分别下载(如网站),或是信息按服务器上专有规则（软件）处理后才可在网络上传递流动(如邮件)。 
</p><p class="a14">如今拥有Napster及ICQ类软件的PC（或操作者）就可以选择同样拥有此类软件的另一PC（或操作者）形成互联（直接连接，不通过服务器），双方共享资源，协同完成某种行动。而拥有同一P2P软件的设备和用户，还可以形成一个为其自己所有的在互联网上的P2P专用网。 
</p><p class="a14"><b>现状</b></p><p class="a14">1. 代表性研发产品和技术 
</p><p class="a14">(1) ICQ类的即时通信软件。两个或多个用户互相使用文字、语音或文件进行交流，快速、直接，易于同非PC网络设备（如PDA、手机）通信，而且它不依赖设备即可辨别用户。由于利用P2P技术可以弱化甚至摆脱对中央服务器的依赖，这样的通信更接近非互联网通信模式。 
</p><p class="a14">(2) Farsite（Microsoft），Ocean Store类数据存储软件。用于在网络上将存储对象分散化存放，而不像现在放于专用服务器。这样减轻了服务器负担，增加了数据的可靠性和传输速度。 
</p><p class="a14">(3) Napster类软件。实现数据共享，使用者可以直接从任意一台安装同类软件的PC上下载及上载文件，而不是从服务器。用户可以检索、复制共享的文件。软件自动发现最新的文件列表，发布者无需担心发布的问题。 
</p><p class="a14">(4) Infrasearch、Pointera类数据搜索及查询软件。用来在P2P网中完成信息检索。一旦形成P2P专用网，其上的数据搜索与现在互联网中数据存在中央服务器的情况有所不同，必须要考虑动态地将当前P2P网络中各个Peer的内容进行收集，并且要有效地向用户传递。 P2P网用户中相当数量在联网方式上不同，专线、拨号、宽带、窄带都会碰到; 联网的时间可以一个是24小时在线，而另一个完全可能仅联机几十分钟; 使用的操作系统也不一定相同。 
</p><p class="a14">(5) Netbatch（Intel）类协同计算软件。可联接近1万台PC，利用它们的空闲时间进行协同计算，完成超计算量的工作（如空间探测，分子生物学计算，芯片设计）。 
</p><p class="a14">(6) Groove 类数据或行动协同软件。它是基于P2P连接的软件工具,可以建立一个安全的企业级协同工作平台（P2P网），提供供求信息链上的互动信息沟通，如货品目录、库存及发货清单，帮助使用者进行经销渠道维护、客户服务和支持。 
</p><p class="a14">(7) 游戏软件。事实上许多网络游戏均是P2P方式的，尤其是那些双人及多人对弈游戏。 
</p><p class="a14">2. 组织与标准 
</p><p class="a14">目前，正式的P2P组织尚未成立，2000年8月间成立的P2P工作组，成员包括Intel、IBM、HP等大企业，目标集中在P2P技术的标准、安全性及可靠性等等。但由于P2P技术本身发展迅速，P2P技术涵盖的范围尚未确定，目前尚未有统一的规范。 
</p><p class="a14"><b>发展</b></p><p class="a14">1. 关键技术 
</p><p class="a14">P2P是一种基于互联网环境的新的应用型技术，主要为软件技术。 
</p><p class="a14">(1) 对于互联网上众多计算机，P2P应用比其他应用要更多考虑那些低端PC的互联，它们不具备服务器那样强的联网能力，同时对于以往的P2P应用技术，现在的硬件环境已经更为复杂，这样在通信基础方面，P2P必须提供在现有硬件逻辑和底层通信协议上的端到端定位（寻址）和握手技术，建立稳定的连接。涉及的技术有IP地址解析、NAT路由及防火墙。 
</p><p class="a14">(2) 在应用层面上，如果两个Peer分别代表两家不同的公司，而且它们已经通过互联网建立连接，那么一方的信息就必须为另一方所识别，所以当前互联网上关于数据描述和交换的协议，如XML、SOAP、UDDI等都是一个完善的P2P软件所要考虑的。 
</p><p class="a14">(3) 有通信就要有安全保障，加密技术是必须要考虑的。 
</p><p class="a14">(4) 其他需考虑的有如何设置中心服务器，如何控制网络规模等。 
</p><p class="a14">2. P2P技术与现有互联网技术比较 
</p><p class="a14">目前互联网主要技术模式是S/C方式，此方式要在互联网上设置拥有强大处理能力和大带宽的高性能计算机，配合高档的服务器软件，再将大量的数据集中存放在上面，并且要安装多样化的服务软件，在集中处理数据的同时可以对互联网上其他PC进行服务，提供或接收数据，提供处理能力及其他应用。对于一台与服务器联机并接受服务的PC机来说，这台PC机就是客户机，其性能可以相对弱小。而P2P技术的特征之一就是弱化了服务器的作用，甚至取消服务器，任意两台PC互为服务器，同时又是客户机，即对等。右面是P2P与S/C方式的一些比较： 
</p><p class="a14">S/C方式造成互联网络上的集中，无论信息资源还是成本资源均向同一方向集中，这样的模式符合一对多、强对弱的社会关系形式，如政府对个人、对企业，大企业对小企业，学校对学生，企业对职工等等关系。所以S/C方式是符合市场需求的。P2P方式将导致信息数量、成本资源都向互联网各点均匀分布，也就是所谓“边缘化“的趋势。此模式符合“一对一”的特点，以及彼此相当的社会关系形式，如个人对个人，规模相当的企业之间，等等，这也是符合市场需求的（如ICQ）。所以这两种方式会共存，有关P2P即将替代S/C模式的说法是不成立的。P2P有其独特的市场空间，是现有互联网应用的补充，这一点应该是毫无疑问的。 
</p><p class="a14">3. P2P技术特性 
</p><p class="a14">(1) 既是S又是C，如何表现取决于用户的要求，网络应用由使用者自由驱动。 
</p><p class="a14">(2) 信息在网络设备间直接流动，高速及时，降低中转服务成本。 
</p><p class="a14">(3) 构成网络设备互动的基础和应用。 
</p><p class="a14">(4) 在使网络信息分散化的同时，相同特性的P2P设备可以构成存在于互联网这张大网中的子网，使信息按新方式又一次集中。 
</p><p class="a14"><b>企业应用</b></p><p class="a14">应用P2P技术的互联网产品正在迅速开辟出一块新的互联网应用市场，例如ICQ类的即时信息工具不仅创立了一个巨大市场，而且正在多方向地向外扩展，比如在移动通信市场，ICQ产品的多信息格式（文字、语言的支持）和即时性，可以为常规通信增加信息内容（文字、图片）和通信对象（网上ICQ用户）。 
</p><p class="a14">另一方面，ICQ的使用也会使部分用户放弃Email，侵蚀Email市场。Napster类的文件共享型P2P产品开拓出网上文件传播的新途径，用户不仅可以进行搜索和下载这样的操作，同时也可以方便地将自己的文件提供给其他用户，做到了基本的双向交流。 
</p><p class="a14">由于P2P技术方案不同于S/C方式的特性，可以在许多方面弥补S/C方式的不足，P2P产品将建立互联网上的一种新的应用模式，这时用户不仅在PC装有浏览器，而且还有数种P2P软件来实现新的互联网应用。 
</p><p class="a14">比如一个计算机配件经销商可以通过Email或浏览器（如果对方也通过P2P技术发布信息，则也可以用P2P软件）得到其上游厂家最新推出的产品信息及价格，研究了这些信息，并落实订货事宜之后，启动P2P软件，将新的产品及售价发布到重要客户的P2P联络站上，其中一个未上网的用户通过手机也知道了这消息。不久，经销商将收到客户的在线询问，而经销商在线回答问题的同时又将一个驱动程序传给了这个客户。这一切的操作均是通过互联网，而对象是厂家人员或客户，而非其网站或邮箱，这样就真正利用互联网做到了面对面的交流，更加接近现实社会的人际交流习惯。 
</p><p class="a14">1. 企业P2P互联网应用的几个侧重 
</p><p class="a14">(1) 企业协同 
</p><p class="a14">企业协同包括两大方面，一是企业内部的员工与员工、部门与部门、员工与部门之间的协同，无论部门及员工处在何种地理位置，只要拥有网络，双方存在信息沟通的要求，就可以利用P2P软件协调双方的行为。信息的种类及行为目的可以是多种多样的，如日程安排、通知发布、单据的审批、文件传阅和分发、方案的评比（表决）、计划协调等等这些可以通过电子文件表达的信息均可以通过软件来表达，并以此将使用者联系在一起。P2P应用更适用这当中更多需要用户交互的部分，如计划协调、日程安排等。二是企业与企业之间的行为协同，这种协同的互动的多样性和复杂性要高于企业内部的协同。从简单的会议日程安排、公文往来，到报价、询价订货系统、订单跟踪、电子化交易。 
</p><p class="a14">(2) 企业门户 
</p><p class="a14">新型企业门户不再简单地以一个网站来实现，它不但综合了为企业内部员工或部门的服务，还可以为企业伙伴及用户服务，同时也是企业管理者了解企业运行状态，调控企业运行的管理工具。企业各个部分的运行情况均可以通过它传递给允许接触到相关信息的使用者。管理者可以通过门户掌握企业的动态，调控企业的运行，直达下级领导建立沟通。而企业内部的员工与企业外部的伙伴或客户均可通过这一平台找到相关的人（工作人员），建立起这样那样的信息交流通道，实现不同的协作目标。这将综合S/C技术和P2P技术，P2P部分将实现信息定向推送，实时沟通和数据互动。 
</p><p class="a14">(3) P2P群集和VPN 
</p><p class="a14">构建于互联网之上的P2P应用不再简单地限于两个点，完全可以扩展到多点的群集，形成互联网中的一个虚拟的子网，构成一个精简的VPN。这样一来，通过相对简单的，仅仅是对P2P用户端软件的操作，用户就可以主动地选择不同的VPN并加入，同时也就使得了不同的VPN同时存在于互联网之中。个性化、专业化同时又是开放（基于互联网）的VPN的出现，使信息的集中和流动更接近现实社会的信息流动方式，更易于为人们所接受。比如喜爱音乐的人们建立了自己的音乐VPN，擅长编程的设计师可以建立自己的程序员VPN，而对于企业，行业化、渠道化的组织终于有了一个在互联网上安家的便捷途径。可以预计，行业化的目录服务、信息服务将通过此方式迅速涌现，为企业电子商务打下一个良好基础。 
</p><p class="a14">(4) 人机远程互动和机机互动 
</p><p class="a14">远程监控和调试已经运用在许多工业场合，甚至也出现了一些通过网站方式运行的方案，但网站方式在速度和交互性方面的缺陷使得用户无法接受。P2P方案为这方面的应用开辟了新的天地，利用它，一个锅炉厂商可以通过互联网帮助其客户调控其锅炉的运行状态，而我们也可以在回家的路上用手机将家中的空调提前打开。 
</p><p class="a14">(5) 宽带网及无线移动网应用 
</p><p class="a14">当带宽达到数据流要求的容量，如实时音频、实时视频，人们期待已久的多种网络应用就会呈现在面前。而特别能满足交互需要的P2P技术更有一块施展的天地，电话会议、视频会议、远程教育、培训、安装调试等等都将为企业带来P2P技术的新应用。实际上ICQ作为P2P技术已经开始应用在手机短信上。 
</p><p class="a14">2. 企业P2P互联网应用的市场特点 
</p><p class="a14">(1) 构成企业B2B电子商务内容的一部分。 
</p><p class="a14">(2) 促进建立新的互联网数据交换标准和数据安全模式。 
</p><p class="a14">(3) 引起新一代互联网的应用，可以建立起底层结构平台。 
</p><p class="a14">(4) 具有领域化的市场分割—与前一时期的互联网热有相同的出发点，将建立起相关行业的群落。 
</p><p class="a14">(5) 有较明确的赢利模式。由于P2P产品不再像S/C方式那样客户仅使用浏览器，而是使用特质的客户端软件，同时软件的使用需厂家的直接支持，用户对购买软件或缴纳使用费很容易理解。 
</p><p class="a14">(6) 向后产品和技术可以整合进入企业内部信息管理市场，向前可以进入企业外部电子商务市场。 
</p><p class="a14">3. 估计的产品形式 
</p><p class="a14">(1) 底层基础开发平台及专项应用软件。 
</p><p class="a14">(2) 软件工程。为企业量身定做。 
</p><p class="a14">(3) 软件服务。将软件功能租给企业使用及信息服务。 
</p><p></p><center><b>表 P2P技术与互联网技术比较</b><br /><table width="80%" border="1"><tbody><tr><td> </td><td>P2P</td><td>S/C</td></tr><tr><td>数据发布</td><td>好</td><td>差</td></tr><tr><td>数据接收</td><td>中</td><td>好</td></tr><tr><td>数据互动性</td><td>好</td><td>差</td></tr><tr><td>数据即时性（传输速度）</td><td>好</td><td>差</td></tr><tr><td>数据安全性</td><td>差</td><td>好</td></tr><tr><td>数据更新</td><td>好</td><td>差</td></tr><tr><td>数据质量（价值）</td><td>中</td><td>好</td></tr><tr><td>数据覆盖率和数量（价值）</td><td>差</td><td>好</td></tr><tr><td>数据成本控制</td><td>好</td><td>差</td></tr><tr><td>数据管理方便性</td><td>差</td><td>好</td></tr></tbody></table></center><img src ="http://www.cppblog.com/tx7do/aggbug/10721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-07-31 11:18 <a href="http://www.cppblog.com/tx7do/archive/2006/07/31/10721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>