免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 39669 | 回复: 45
打印 上一主题 下一主题

P2P原理的解释与实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-02 20:41 |只看该作者 |倒序浏览
关于采用UDP协议进行打洞以进行P2P会话的原理,我本来想写一篇文章作说明,但是现在已经有一篇文章把原理性的东西解释清楚了,我在这里不再作这部分的重复,可以参见这里:
P2P 之 UDP穿透NAT的原理与实现(附源代码)--http://www.cnpaf.net/Class/hack/0512182034513804825.htm

下面解释一下上面的文章中没有提及或者说我觉得比较欠缺的地方.
私有地址/端口和公有地址/端口:我们知道,现在大部分网络采用的都是NAPT(Network Address/Port Translator)了,这个东东的作用是一个对外的对话在经过NAT之后IP地址和端口号都会被改写,在这里把一次会话中客户自己认为在使用的IP地址和端口号成为私有地址/端口,而把经过NAPT之后被改写的IP地址和端口号称为公有地址/端口.或者可以这么理解,私有地址/端口是你家里人对你的昵称而公有地址/端口则是你真正对外公开的名字.如何获得用户的私用地址/端口号,这个很简单了,而要得到公有地址/端口号就要在连接上另一台机器之后由那台机器看到的IP地址和端口号来表示.

如果明白了上面的东西,下面进入我们的代码,在这里解释一下关键部分的实现:

客户端首先得到自己的私有地址/终端,然后向server端发送登陆请求,server端在得到这个请求之后就可以知道这个client端的公有地址/终端,server会为每一个登陆的client保存它们的私有地址/端口和公有地址/端口.

OK,下面开始关键的打洞流程.假设client A要向client B对话,但是A不知道B的地址,即使知道根据NAT的原理这个对话在第一次会被拒绝,因为client B的NAT认为这是一个从没有过的外部发来的请求.这个时候,A如果发现自己没有保存B的地址,或者说发送给B的会话请求失败了,它会要求server端让B向A打一个洞,这个B->A的会话意义在于它使NAT B认为A的地址/端口是可以通过的地址/端口,这样A再向B发送对话的时候就不会再被NAT B拒绝了.打一个比方来说明打洞的过程,A想来B家做客,但是遭到了B的管家NAT B的拒绝,理由是:我从来没有听我家B提过你的名字,这时A找到了A,B都认识的朋友server,要求server给B报一个信,让B去跟管家说A是我的朋友,于是,B跟管家NAT B说,A是我认识的朋友,这样A的访问请求就不会再被管家NAT B所拒绝了.简而言之,UDP打洞就是一个通过server保存下来的地址使得彼此之间能够直接通信的过程,server只管帮助建立连接,在建立间接之后就不再介入了.

好了,原理性的东西解释到这里,附件中有一个完整的P2P演示程序,命令行模式下,包括server端和client端,在运行的时候首先启动server端,然后打开几个client端分别登陆,之后彼此之间就可以相互通信了.程序在本机上测试通过,也就是测试的环境server和client都是一台机器,还没有在不同的机器上测试过,不知道会不会有问题
下载地址:
http://www.cppblog.com/Files/converse/P2PDemo.rar

参考资料:
1)P2P 之 UDP穿透NAT的原理与实现(附源代码)-http://www.cnpaf.net/Class/hack/0512182034513804825.htm
2)王艳平<<Windows网络与通信程序设计>>

附:

又被人翻出这个东西来了.
我得说,这不是一个成熟的东西,只是我当时学习网络编程时看书的一个笔记,再后来,据我的了解,商业上的做法也不是这么做的,所以,同学一笑而过吧,别把这个玩具当回事,我自己看着都觉得惭愧.
                                                                                                                                                          2008.01.15


[ 本帖最后由 converse 于 2008-1-15 11:25 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-09-02 21:04 |只看该作者
好冷...
怎么没有人回复?

论坛徽章:
0
3 [报告]
发表于 2006-09-02 21:20 |只看该作者
原帖由 iwinux 于 2006-9-2 21:04 发表
好冷...
怎么没有人回复?

因为没看懂...

为什么不是
当A要和B说话的时候,请server老大先叫一声B, 然后B再出来见A?
为什么开始要被拒绝一次...

论坛徽章:
0
4 [报告]
发表于 2006-09-02 22:15 |只看该作者
一般啦。
  穿nat 只是一个应用。 p2p 不止这么简单啦。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-09-02 22:23 |只看该作者
原帖由 converse 于 2006-9-2 20:41 发表
2)王艳平<<Windows网络与通信程序设计>>

国家主席江泽民,陪同夫人王艳平,一同会见了来华访问的美国XX代表团。

论坛徽章:
0
6 [报告]
发表于 2006-09-02 22:43 |只看该作者
>>为什么开始要被拒绝一次...

因为请求被NAT挡住了,我里面没有具体写NAT的概念,可以到我提供的那两份文档中看看.

论坛徽章:
0
7 [报告]
发表于 2006-09-02 22:44 |只看该作者
原帖由 benjiam 于 2006-9-2 22:15 发表
一般啦。
  穿nat 只是一个应用。 p2p 不止这么简单啦。


嗯,我也是初学,不知道还有哪些?我这份代码只是演示了打洞的过程,打洞之后的应用没有展开,只是一般的对话而已....

论坛徽章:
0
8 [报告]
发表于 2006-09-02 22:50 |只看该作者
没做过。。。完全不懂,只能顶一下。

论坛徽章:
0
9 [报告]
发表于 2006-09-02 22:50 |只看该作者
NAPT(The IP Network Address/Port Translator) 为何阻碍了P2P软件的应用?

通过NAPT 上网的特点决定了只能由NAPT内的计算机主动向NAPT外部的主机发起连接,外部的主机想直接和NAPT内的计算机直接建立连接是不被允许的。IM(即时通讯)而言,这意味着由于NAPT内的计算机和NAPT外的计算机只能通过服务器中转数据来进行通讯。对于P2P方式的下载程序而言,意味着NAPT内的计算机不能接收到NAPT外部的连接,导致连接数用过少,下载速度很难上去。因此P2P软件必须要解决的一个问题就是要能够在一定的程度上解决NAPT内的计算机不能被外部连接的问题。

论坛徽章:
0
10 [报告]
发表于 2006-09-02 23:46 |只看该作者
8明白,那么server又如何和B联系的呢?它也在外面啊.

A ----------------NAT -------------B
|                       |
|                       |
Server-----------

这样子.
1. A 准备发东西给 B
2. A告诉server它对 B 感兴趣
3. server向B发送信息
4. B连接到A, 于是A变成了server
....

8过好象就是这样的. 奇怪的就是为什么前面会碰一下?

[ 本帖最后由 yarco3 于 2006-9-2 23:54 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP