Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19270057
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 10:50:05

在Whois++结构中,由客户负责进行网状漫游,因为每个主机仅通知客户与它相邻的主机是什么,这个倒不是复杂,客户打开到一台的连接,发送查询请求,接收应答,关闭连接。客户在接收到应答后进行分析,然后决定下一个联系哪一台主机。这样使得客户必须有一种算法使得客户查询的主机没有重复的,而且能够尽快找到要找的主机。

    每个Whois++客户应该被配置为自动和一个特定的Whois++联系。这个默认的服务器可能有这样那样的要求,但是最基本的要求就是最好是本地服务器。

    在接收到服务器的应答后,如果命中数大于0,则把结果返回用户。如果客户被要求和一个或多个服务器进行通信,客户要能够知道这些服务器指针是什么。

    查询的方法有两种一种是扩充查询,一种是使用服务器目录。如果命中数为0,或用户希望扩展查询,客户机应该进行扩展查询,它只需要向服务器发送下面两种消息即可:\'polled-by\'或\'polled-for\',客户可以向新指定的主机进行扩充查询。

    客户必须保留查询过的服务器,不要查询过的服务器再查询一次。

    3.1.1. 优化网络

    如果A希望经常使用B的WHOIS++服务器,A会希望通过创建一个本地索引服务器将B的服务器成为本地可用的。当A的客户通过扩充查询希望查询B时,解析的速度就会快得多。

    Whois++网络已经不是一个树了,B和F之间已经建立了直接通道。这样查询的速度就快得多了,不用在查询完B后查询A,再查询C,最后再查询F。因为B和F已经建立了联结,所以,当客户只需要查询其中之一的数据时需要指时要的是哪一个,不然会返回B和F结点的内容。在客户方还可以使用黑名单方法将查询中的一些服务器屏蔽掉,因为访问这些服务器代价太大或其它原因不愿意让用户访问这些服务器。

    3.1.2. 客户使用的算法

    Query := 需要查询的数据;
    QueriedServers := {};
    AnswerList := {};
    OriginalServers := { 客户所知的服务器 };
    while OriginalServers非空 do:
      ServerList = OriginalServers;
      while ServerList非空 do:
        Server := ServerList[1];
        if Server未包括在QueriedServers中 then do:
         send Query to Server;
         Answer := 从Server返回的响应;
         将ServersToAsk附加到ServerList;
         将Server从ServerList删除;
         将Answers附加到AnswerList;
        end;
      done;
      if 应该扩充查询 then do:
        ServerList := OriginalServers;
        OriginalServers := {};
        while ServerList非空 do:
          Server := ServerList[1];
          发送Polled-For-Query到Server;
          Answer := 从Server返回的响应;
          将Answer附加到OriginalServers;
          将Server从ServerList删除;
        end;
      done;
    done;
    显示AnswerList;

    3.2. 服务器目录

    第二个寻找正确服务器的方法是使用一个单独的服务,我们称为服务器目录。服务器目录实际上是一个特殊的Whois++服务器。这个服务器内包括了所有服务器上信息,用户在查询前先查询些服务器,由此服务器指出应该查询哪一个服务器,未来的技术可能允许客户选择服务器,而不是由服务器。

3.2.3. 例子

    下面是一个客户与服务器联系的例子。

    > % 220-This is services.bunyip.com running Bunyip-Whois++: DIGGER 1.0.5
    > % 220 Ready to go!
    < template=serverhandle and bunyip
    > % 200 Search is executing
    > # FULL SERVERHANDLE BUNYIPCOM01 BUNYIPCOM01
    > SERVER-HANDLE: BUNYIPCOM01
    > HOST-NAME: services.bunyip.com
    > HOST-PORT: 63
    > ADMIN-NAME: Patrik Faltstrom
    > ADMIN-EMAIL:
    > ORGANIZATION-NAME: Bunyip Information Systems Inc.
    > DESCRIPTION: USER information
    > DESCRIPTION: Directory of Servers
    > DESCRIPTION: Toplevel Index server in the world
    > MENU-ITEM: World (Bunyip Information Systems inc)
    > CITY: Montreal
    > COUNTRY: Canada
    > # END
    >
    > # FULL SERVERHANDLE BUNYIPCOM01 BUNYIPCOM02
    > SERVER-HANDLE: BUNYIPCOM02
    > HOST-NAME: services.bunyip.com
    > HOST-PORT: 7778
    > ADMIN-NAME: Patrik Faltstrom
    > ADMIN-EMAIL:
    > ORGANIZATION-NAME: Bunyip Information Systems Inc.
    > DESCRIPTION: USER information
    > MENU-ITEM: Bunyip Information Systems
    > CITY: Montreal
    > COUNTRY: Canada
    > # END
    >
    > % 226 Transaction complete
    > % 203 Bye, bye

    4. 缓冲

    客户可以缓冲它从服务器取得的信息。客户自行选择缓冲多长时间更新。

    4.1. 缓冲Whois++服务器主机名

    下面是一个缓冲算法:

    response := 从服务器A获得的servers-to-ask响应
    IP-address := 寻找DNS中response.hostname的IP地址
    连接IP地址上的端口
    if 连结失败 {
      连结服务器目录服务器
      查询主机
      response := 由服务器目录服务器获得的响应
      IP-address := 寻找DNS中response.hostname的IP地址
      connect to ip-address at port response.portnumber
      if 连结失败 {
        以错误消息返回
      }
    }
    查询这个新服务器

    5. 安全问题

    客户应该维护一个黑名单,因为在网络上可能有假的Whois++服务器,一旦发现这样的服务器,应该把它加入黑名单,以后不再查询。因为在扩充查询时比较费时,应该允许用户在操作进行中退出。

阅读(380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~