• 2007-11-16

    P2P 的定义

    Views: 12292 | 1 Comment

    P2P 即 Peer to Peer(点对点, 节点对节点). 节点是资源和对其进行处理的实例的总称.

    P2P 包含两层意思:

    1. P2P 网络

    给定一个现有的网络, 如果任意两个节点能够使用该网络的通信线路直接通信, 那么, 这些节点组成一个新的网络, 称为 P2P 网络.

    2. P2P 应用

    给定某些资源及其处理方式, 如果任意一个节点都拥有向其他某个节点请求和被请求资源以及对这些资源进行处理的能力, 那么, 这些节点的行为称为 P2P 应用.

    P2P 应用一般建立在 P2P 网络之上.

    Posted by ideawu at 2007-11-16 17:59:37
  • 2007-10-26

    Ideawu.P2P API 简介

    Views: 12583 | 2 Comments

    本文从 API 层面来介绍我的 P2P 库(P2P 开发包).

    P2P 网络可以简化为如以下图的结构: 一个服务中心(SC, Service Center), 节点 A 和 B.

             SC
      +------+------+
      |             |
    Peer A ===== Peer B
    

    A 和 B 在 SC 的帮助下逻辑上存在一条通信线路, 称为中转通道(Relay Channel). Relay Channel 是可信的, 可靠的, 低速的(大约 10K/s), 高延时的(大约 10s). A 和 B 之间直接相连的线路(Link)建立在现有的 Socket 线路上.

    原语包括: 函数名, 参数, 返回值, 行为.

    void PeerAgent.Login(string name, string password, string extension);
    void PeerAgent.Logout();
    void PeerAgent.Connect(string peerId);
    void PeerAgent.Disconnect(string peerId);
    ILink PeerAgent.GetLink(string peerId);
    
    IChannel ILink.Bind(ushort localPort);
    IChannel ILink.Unbind(ushort localPort);
    
    void IChannel.Connect(ushort remotePort);
    void IChannel.Close();
    void IChannel.Send(byte[] data);
    int IChannel.Read(byte[] buffer, int offset);
    

    PeerAgent 是节点的代理, 它与其他每一个唯一的节点建立最多一条 Link. 这不代表节点只能使用最多一条 Link, 因为 P2P 库提供了建立 Link 的工具.

    使用轮循来判断是否已经和某个节点连接, 这样使用 PeerAgent:

    ILink link = null;
    PeerAgent.Connect(peerId);
    while((link = PeerAgent.GetLink(peerId)) == null){
    	Thread.Sleep(100);
    	// Throws exception when timeout, or call Connect() again.
    }
    

    P2P 应用的开发者应该根据业务的要求, 商定两个节点调用 PeerAgent.Disconnect() 的时机, 以便两个节点可以再次建立 Link.

    Link 对 Socket 网络线路进行多路复用, 所以一个 Link 上可以创建多达 65536 个 Channel, Channel 根据端口号进行标识. 不像 Socket API, Link 没有 Listen 或者 Accept. P2P 开发者应该定义各个端口对应什么服务. 比如 IM 应用, 假设开发者定义 2 号 Channel 进行文本传输, 那么他应该这样做:

    IChannel ch = link.Bind(2);
    ch.Connect(2);
    

    开发者还必须约定连接的时机. 否则, 如果其中一个节点调用了上面的代码, 而另一个什么也没做, 他们不能进行通信. 一种可行的方法是, 一旦 Link 建立成功, 便立即创建 0 号 Channel, 并启动一个线程进行监听. 或者 Link 建立成功之后双方都立即调用上面的代码.

    这表明, Link 是一条对等的线路, Link 的两头不存在 Client/Server, 但是你完全可以在对等线路上实现 C/S 应用.

    备注: 这些概念看起来太复杂了, 只能尽快开发出一个实际的应用.

    Posted by ideawu at 2007-10-26 14:30:21
  • 2007-10-24

    使用 Channel 进行可靠传输

    Views: 9504 | No Comments

    Channel 是一个通信线路, 建立在 UdpLink, TcpLink, HttpLink 或者更多类型的 Link 之上. 当建立在不提供可靠传输服务的 Link(如 UdpLink)之上时, Channel 能保证可靠传输.

    Channel 的另一个功能是对一条 TCP/IP 层次上的网络连接(如 TCP, UDP, IP, HTTP 等)多路复用, 使得可以在一条网络连接上同时传输文本, 图像, 音频, 视频等. 这表示, 你在等待给对方发送一张大图片过程中, 可以继续进行文本和视频聊天, 而不必盯着静止的屏幕等待图片传输完成. 你需要做的工作只是建立多条 Channel, 而 Channel 的建立是立即完成的, 不会像建立网络连接那样有非常大的网络延时.

    ILink link = ...; // 例如将一个 UdpLink 赋值给 link.
    IChannel ch1 = link.Bind(1); // 建立编号为 1 的 Channel.
    ch1.Connect(1001); // 连接对方的 1001 号 Channel.
    
    byte[] dataToSend = Encoding.UTF8.GetBytes("Hello from 1.");
    ch1.Send(dataToSend); // 发送数据给对方
    
    byte[] buffer = new byte[1024];
    int n = channel.Read(buffer); // 从 Channel 中读取数据到缓冲区中.
    // 打印接收到的数据.
    Console.WriteLine("Read {0} bytes from remote: {1}", n, Encoding.UTF8.GetString(buffer, 0, n));
    
    IChannel ch2 = link.Bind(2); // 建立编号为 2 的 Channel.
    ch1.Connect(1002); // 连接对方的 1002 号 Channel.
    
    ... // 操作 ch2.
    

    Channel 的表现类似 TCP socket, 提供流式的字节传输服务. 有了 Channel, 你便可以开发你自己的应用.

    备注: 本文是关于我的 P2P SDK 的介绍的一部分, 详细文档请见 http://www.ideawu.com/p2p/

    Posted by ideawu at 2007-10-24 11:21:59
  • 2007-10-22

    使用 Ideawu.P2P.Core.AccountManager 登录服务中心

    Views: 8737 | No Comments

    节点必须先登录服务中心, 才能读取好友列表, 查询用户, 请求服务中心的帮助以便进行 NAT 穿透等.

    // AccountManager 需要一个网络代理(IAgent)与服务中心进行通信,
    // IAgent 可以基于 TCP, UDP, HTTP 等协议.
    HttpAgent agent = new HttpAgent(); // 基于 HTTP 协议的网络代理.
    agent.ServerUrl = "http://www.ideawu.net/?mediator";
    
    // 创建一个用户判断本机是否在 NAT 之后, 以及帮助获取 Socket 的公网地址(IP:port).
    NatHelper natHelper = new NatHelper();
    natHelper.ServerEndPoint = new IPEndPoint(IPAddress.Parse("22.2.2.2"), 10215);
    natHelper.Start();
    
    // SessionListener 监听其它节点的会话请求, 决定是否接受某个请求.
    // 你可以实现你自己的 SessionListener, 使 AccountManager 只接受
    // 好友的连接请求, 拒绝黑名单中的用户的请求.
    // 标准的 SessionListener 接受所有节点的会话请求.
    StandardSessionListener sessionListener = new StandardSessionListener();
    sessionListener.Start();
    
    AccountManager am = new AccountManager();
    
    am.Agent = agent;
    am.NatHelper = natHelper;
    am.SessionListener = sessionListener;
    
    // 使用用户名和密码进行登录.
    am.Login("user01", "my password ***", null);
    am.Start();
    

    备注: 本文是关于我的 P2P SDK 的介绍的一部分, 详细文档请见 http://www.ideawu.com/p2p/

    Posted by ideawu at 2007-10-22 22:03:58
  • 2007-10-16

    使用 Ideawu.P2P.Core.UdpLink 进行 NAT 穿透

    Views: 11671 | 3 Comments

    使用 UdpLink 进行 NAT 穿透之后, 将与对方建立一条 UDP 连接. 该 UdpLink 可以用来生成提供可靠传输服务的 Channel, 也可以直接使用其 UDP Socket.

    IPEndPoint remoteEP = new IPEndPoint(IPAdress.Parse("2.2.2.2"), 12345);
    UdpLink link = new UdpLink();
    link.Udp = new UdpClient();
    link.RemoteEndPoint = remoteEP; // 设置对方节点的公网地址.
    link.ReadKey = "my key +"; // 建立连接时期望从对方接收到的口令.
    link.SendKey = "his key -"; // 建立连接时对方期望的口令.
    link.Start(); // 进行 NAT 穿透.
    

    当 Start() 方法成功返回时, NAT 穿透已经完成, 否则会抛出一个异常. UdpLink 可以应用在以下网络结构: No-NAT -- Any, Cone NAT -- Any, Loose Symmetric NAT -- Any.

    备注:

    Posted by ideawu at 2007-10-16 21:06:58
  • 2007-10-08

    P2P服务中心的开发

    Views: 7918 | No Comments

    服务中心需要对 P2P 网络的结构进行管理, 同时提供传统的 C/S 架构中的服务器服务. 在 IM 应用中, 账号服务中心提供包括用户注册, 用户登录, 好友功能, 广告等功能, 也可能将这些功能分开, 对应不只一个服务中心.

    服务中心和节点的交互的实现有多种方式:

    1. TCP/UDP socket 连接.

    直接使用 socket 连接, 可以实现服务中心向节点进行"推"数据. 通信延迟小.

    2. 基于 HTTP Web 的"拉"方式.

    因为 HTTP 的工作原理, 所以使用本方式, 通信延迟大. 当两个节点要进行通信时, 某一个节点先将数据存放在服务中心, 然后另一个节点再到服务中心取这些数据. 因为节点取数据的周期不可能太小, 太小会对 Web 服务器造成太大的压力, 所以延迟以秒来计算.

    比较来说, 我认为基于 HTTP Web 的方式更有优势. 因为 Web 集群技术已经相当成熟. 当 P2P 网络变得庞大时, 可以应用现有的成熟技术来解决服务中心的问题.

    另一方面, Web 开发技术多样化和流行. 可以使用 Java/J2EE, .Net, PHP, C/C++ CGI 等技术. 这也表示一旦应用确定或者进行更改, 将非常容易找到开发人员. 所以开发成本可以降低.

    单就 IM 应用来说, 账号管理, 好友功能, 群(圈子), 留言, 黑名单, 客户端广告等用 Web 方式来实现都是非常简单的技术.

    Posted by ideawu at 2007-10-08 21:09:52
|<<<1234567>>>| 5/7 Pages, 38 Results.