P2P最重要的基础知识
The most important basics of P2P
我一直在www上阅读,但就是无法获得P2P最重要的基础知识。
图表如下:
[peer1]<-->[dsl-router1]<-->[central server]<-->[dsl-router2]<-->[peer2]
我正在中央服务器上开发一个聊天软件。聊天消息现在已经很好地通过中央服务器传输了,然而,我需要制作p2p文件共享功能,因为服务器的带宽(电缆带宽,而不是传输限制)应该只用于传输聊天消息。
问题是,我在中央服务器上的软件知道路由器1和路由器2的IP和端口,但不知道peer1和peer2,因为这些对等端在路由器后面,没有IP地址。
如何在不让数据通过"中央服务器"的情况下将一些数据从peer1传输到peer2,反之亦然?
(最坏的情况是对等路由器和dsl路由器之间有一个无线路由器)
有两种基本方法。新方法是使用IGDP(通过uPnP打开端口)。这里描述得很好:
http://www.codeproject.com/Articles/13285/Using-UPnP-for-Programmatic-Port-Forwardings-and-N
如果这两个节点都没有支持uPnP的路由器,那么另一种选择是TCP打孔,这并不完美,但在实践中效果很好。此处描述:
http://www.brynosaurus.com/pub/net/p2pnat/
在某些情况下,ISP提供的"路由器"可能以桥接模式运行,这会直接将对等计算机暴露在互联网上(计算机获得公共互联网地址)。如果至少有一方有这种配置(或者在类似的情况下,对等客户端不在另一台设备后面),那么事情应该很简单:只需将中央服务器的工作分配给拥有此权限的人。
在另一种情况下,如果两个对等端都只为其计算机分配了一个本地地址(例如192.168.0.2),则很难通过路由器;路由器后面的客户端在很大程度上是无法从外部访问的,除非它们发起了请求。然后,这个问题的一个解决方案是端口转发。通过显式编写的规则或UPnP进行端口转发,对等计算机上的一些端口暴露在公共互联网上,就像在第一种情况下,整个计算机不是只暴露一些端口。
如果您没有这两种方法,那么就没有简单的方法可以避免通过中央服务器发送。尽管你可能会找到其他有能力为他人转学的同龄人。
- 与C++哈希表的基础知识混淆
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 使用 QVector 创建图形磁贴(QCache 之前的基础知识)
- 从未签名的长期错误中获得最多的32位重要位
- 将所有位低于最重要的设置位零的最有效方法是什么?
- C++基础知识(使用其他方法(Unicode?)的相同代码)
- 2 个未解析的外部符号(C++函数基础知识)
- 了解线程构造函数的基础知识
- 了解写入副本的基础知识
- 在班级基础中实现功能的最有效方法
- 计算DX11中的着色器基础知识
- P2P最重要的基础知识
- 哪些是安卓系统中不可用的最重要的POSIX功能
- c++编译的基础知识
- 如何开始学习用C++为XBOX 360 KINECT编写用于开发windows应用程序的程序的基础知识
- 如何在C++中获取字符中最不重要的部分
- 不是最重要的const.但这是什么
- 传递常量引用…它像最重要的const一样工作吗
- 最重要的常量和右值参考
- 基数排序,最重要的先排序或者最不重要的先排序,这样更快