Annotation of 43BSDReno/contrib/isode-beta/doc/manual/q-design.tex, revision 1.1

1.1     ! root        1: \chapter {Overview}
        !             2: 
        !             3: \section {Introduction}
        !             4: 
        !             5: 
        !             6: 
        !             7: This part of the manual describes aspects of the design of QUIPU which are not
        !             8: needed to be known by the administrator or user of QUIPU.
        !             9: However, it documents important design decisions and protocol, which are of
        !            10: interest to understand how QUIPU works, and in some specific circumstances
        !            11: (e.g., solving interoperability problems).  A summary of the main features
        !            12: of QUIPU is also given.
        !            13: 
        !            14: 
        !            15: QUIPU fully implements both of the OSI Directory Protocols, and a number of
        !            16: extensions.
        !            17: The highlights of the QUIPU Directory Service
        !            18: Implementation are:
        !            19: 
        !            20: \begin{itemize}
        !            21: \item
        !            22: Use of memory structures to provide fast access, without use of
        !            23: complex keying techniques.
        !            24: \item
        !            25: Activity scheduling within the DSA to allow for multiple accesses.
        !            26: \item
        !            27: General and flexible searching capabilities.
        !            28: \item
        !            29: A mechanism to provide non-local access control.
        !            30: \item
        !            31: A mechanism to provide external schema management.
        !            32: \item
        !            33: A sophisticated approach for management of distributed operations and
        !            34: replication.
        !            35: \end{itemize}
        !            36: 
        !            37: The current implementation provides a DSA, and a procedural interface to the
        !            38: Directory Abstract Service and the associated Directory Access Protocol
        !            39: (DAP), which will enable other applications to use the Directory.
        !            40: 
        !            41: \section {General Aims}
        !            42: 
        !            43: To understand the rationale behind some of the decisions, it is
        !            44: useful to consider the original aims of the QUIPU project.
        !            45: These
        !            46: can then be mapped onto a number
        !            47: of more technical considerations:
        !            48: 
        !            49: \begin{itemize}
        !            50: \item To produce an implementation which followed the
        !            51: emerging standards.  This is an aim in itself.
        !            52: 
        !            53: \item Flexibility, to enable the system to be used
        !            54: for experimentation and research into problems relating to directory
        !            55: services.
        !            56: 
        !            57: \item To provide a vehicle for experimentation in the area of
        !            58: distribution and replication.
        !            59: 
        !            60: \item To provide some level of real usage.
        !            61: This sort of work is useless if entirely confined to the laboratory.
        !            62: It is important that it is capable of use for some level of experimental
        !            63: service.  However, it is not consciously designed to evolve into a full
        !            64: fledged product.
        !            65: \end{itemize}
        !            66: 
        !            67: As the work has evolved, the following goals have emerged as
        !            68: additional to the original ones listed above:
        !            69: 
        !            70: \begin{itemize}
        !            71: \item To provide a public domain the OSI Directory implementation as a part of
        !            72: the ISODE package.
        !            73: 
        !            74: \item To provide integrated support for the ISODE Applications.
        !            75: 
        !            76: \item To be used as a part of the initial pilot Directory Service in
        !            77: the UK Academic Community and in other pilots.
        !            78: \end{itemize}
        !            79: 
        !            80: 
        !            81: \section {Technical Goals}
        !            82: 
        !            83: The major goals of the QUIPU Directory Service are:
        !            84: 
        !            85: \begin{itemize}
        !            86: \item Full support of the Directory Access Protocol and Directory System
        !            87: Protocols \cite{CCITT.Directory}.
        !            88: \item
        !            89: Support of the majority of the service elements specified in the OSI Directory.
        !            90: \item
        !            91: Full interworking with other OSI Directory implementations.
        !            92: \item
        !            93: Very full searching and matching capabilities, beyond the minimum
        !            94: required by the OSI Directory.
        !            95: \item
        !            96: Provision of a system which has potential for very high distribution.
        !            97: 
        !            98: \item Support of distributed operations in a manner which is full
        !            99: conformant with respect to non-QUIPU systems, and provides additional
        !           100: functionality for QUIPU systems.
        !           101: 
        !           102: \end{itemize}
        !           103: 
        !           104: The following areas were not intended as goals in the initial system.
        !           105: Some discussion is given as to how these areas might be tackled in
        !           106: future versions.
        !           107: 
        !           108: \begin{itemize}
        !           109: \item
        !           110: The QUIPU Directory is not intended for very large scale
        !           111: systems (i.e., Millions and tens of Millions of entries per DSA or hundreds
        !           112: of megabytes of data per DSA).
        !           113: 
        !           114: \item
        !           115: Substantial data robustness is not required: there is no need to employ
        !           116: complex data backup techniques, such as replicated hardware.
        !           117: \item
        !           118: The security aspects of the OSI Directory were initially omitted, as not
        !           119: required by the general aims.   
        !           120: At this point, there is no reason why this aspect should not be
        !           121: integrated.
        !           122: 
        !           123: \end{itemize}
        !           124: 
        !           125: \section {Further QUIPU documents}
        !           126: 
        !           127: 
        !           128: The following documents are available, in addition to this manual:
        !           129: 
        !           130: \begin{itemize}
        !           131: \item A paper on the original design, which is mainly of historical interest
        !           132: \cite{inca-paper}.
        !           133: 
        !           134: \item A paper presented at the 1988 IFIP 6.5 conference, which gives a
        !           135: general overview \cite{QUIPU.IFIP}.
        !           136: 
        !           137: \item A paper presented at Esprit Conference Week 1988, which describes the
        !           138: distributed operations \cite{QUIPU.Distributed}.
        !           139: 
        !           140: \item A paper presented to the Dutch \unix/ User Group in November 1989, which
        !           141: describes how Quipu DSAs navigate the DIT \cite{QUIPU.Navigate}.
        !           142: 
        !           143: \end{itemize}
        !           144: 
        !           145: These papers, except the first, are distributed online with QUIPU.
        !           146: 
        !           147: \chapter {General Design}
        !           148: 
        !           149: \section {Overview}
        !           150: 
        !           151: This chapter describes general decisions.  
        !           152: In particular, issues relating to use of
        !           153: the OSI Directory are covered,
        !           154: rather than
        !           155: system implementation decisions.
        !           156: However, the two are somewhat bound up.
        !           157: Attention is drawn to the protocol extensions defined in section
        !           158: \ref{edb-ros}.  Note that this does {\em not} affect interactions with
        !           159: non-QUIPU DSAs (or DUAs).
        !           160: The following aspects of the OSI Directory are not handled in QUIPU 6.0.
        !           161: 
        !           162: \begin{itemize}
        !           163: \item The protocol elements for support of directory use of authentication
        !           164: are handled in a conformant manner, but the associated services are not
        !           165: available to the end user.
        !           166: 
        !           167: \item
        !           168: Search is always supported by multicasting.  This does
        !           169: {\em not} affect the basic service offered to the user, but means that
        !           170: prohibition of chaining is not possible in all cases.  
        !           171: 
        !           172: \item Partial Outcome Qualifier is not supported for List.
        !           173: 
        !           174: \item There are some aspects of distributed operation, where interaction
        !           175: with another conforming system would not be fully general.  In particular,
        !           176: QUIPU might not be able to be configured with references to point at a
        !           177: complex configuration where not all sibling entries are held.  
        !           178: \end{itemize}
        !           179: 
        !           180: Otherwise, QUIPU 6.0 is believed to conform to the standard.
        !           181: 
        !           182: \section {Service Controls}
        !           183: 
        !           184: QUIPU use of service controls conforms to the OSI Directory.
        !           185: Comments are made on those
        !           186: controls where QUIPU makes a choice with respect to some option
        !           187: given by the OSI Directory.
        !           188: 
        !           189: \begin{description}
        !           190: \item [preferChaining]
        !           191: Chaining will be done.
        !           192: 
        !           193: \item [chainingProhibited]
        !           194: Chaining will not be done.
        !           195: For some cases of the search operation, this means that the QUIPU Directory
        !           196: Service will not be able to provide the service, and will return a
        !           197: ``chaining required'' error.
        !           198: 
        !           199: 
        !           200: \item [localScope]
        !           201: The scope will be restricted to the DSA concerned (i.e., no chaining will be
        !           202: done).
        !           203: 
        !           204: \item [dontUseCopy] If this is set, the master data will be used.  This may
        !           205: have a significant impact on performance for operations on entries which are
        !           206: high up the tree and for the DSAs which master this information.  These issues
        !           207: need study.
        !           208: 
        !           209: 
        !           210: \item [dontDereferenceAliases]
        !           211: Followed as per the OSI Directory.
        !           212: 
        !           213: \item [priority]
        !           214: This is used to help control scheduling within the DSA.  High priority
        !           215: tasks are dealt with before low priority tasks (Note: there are no checks
        !           216: here, so this is open to mis-use !)
        !           217: 
        !           218: \item [timeLimit]
        !           219: Followed as per the OSI Directory.
        !           220: 
        !           221: \item [sizeLimit]
        !           222: Followed as per the OSI Directory.
        !           223: 
        !           224: \item [scopeOfReferral]
        !           225: The OSI Directory is followed, although QUIPU does not make use of this control.
        !           226: \end{description}
        !           227:  
        !           228: 
        !           229: \chapter {Distributed Operation}
        !           230: \label {dist-op}
        !           231: 
        !           232: \section {Overview}
        !           233: 
        !           234: 
        !           235: Distributed Operation is a major aspect of the QUIPU
        !           236: Directory Service
        !           237: Sadly, the OSI Directory specifications in this area are, in the author's
        !           238: opinion, rather unsatisfactory.   
        !           239: Therefore, the QUIPU distributed operations are described in a slightly
        !           240: different manner.  The concept of ``Naming Context'' is not used, and the
        !           241: significance of ``Knowledge'' is de-emphasised.  The external view of this
        !           242: functionality is fully in line with the standard.   
        !           243: 
        !           244: Some of the concepts 
        !           245: defined in this chapter  do {\em not} correspond to the
        !           246: ISO/CCITT terms, and so new terminology is introduced. 
        !           247: Standard terminology is used in the standard way.
        !           248: 
        !           249: 
        !           250: \section {DSA/DUA Interaction Model}
        !           251: 
        !           252: There are some interesting choices to be made between DSA Referral and
        !           253: Chaining.  A DUA will start by contacting a local DSA, specifying that
        !           254: chaining is preferred (i.e., DSA referrals should not be passed back to the
        !           255: DUA).  After that, the first DSA will proceed by use of DSA Referral, except
        !           256: for operations where this is not possible in the QUIPU framework (some cases
        !           257: of search).  The advantages of this approach are:
        !           258: 
        !           259: \begin{itemize}
        !           260: \item
        !           261: The DUA code can be kept to a minimum, as there is no need to handle
        !           262: referrals.
        !           263: This does mean that the DUA must always interact with the Directory
        !           264: Service through a DSA which supports chaining (which might exclude
        !           265: some implementations).
        !           266: \item
        !           267: Always going thorough a local DSA allows a ``per system'' cache to
        !           268: be maintained in a coherent manner.
        !           269: \item
        !           270: The overhead of maintaining chained connections is not passed
        !           271: on too far.
        !           272: \end{itemize}
        !           273: 
        !           274: Note that whilst the DUA procedural does not handle referrals transparently,
        !           275: they are defined in the service interface, so that an application can
        !           276: choose to handle the referrals directly if it wishes to do so.
        !           277: 
        !           278: \section {Model of Data Distribution}
        !           279: \label {model-dist}
        !           280: 
        !           281: This is a critical section of the design.   It is essential to understand it
        !           282: before studying distributed operation.
        !           283: 
        !           284: \subsection {Entry Data Blocks}
        !           285: 
        !           286: For the root and every non-leaf vertex, there will be an
        !           287: {\em Entry Data Block} (EDB)
        !           288: which contains
        !           289: {\em all}
        !           290: information pertaining
        !           291: to the next level down in the DIT.
        !           292: Figure~\ref{edbf} gives and ASN.1 description of
        !           293: the Entry Data Block format.
        !           294: 
        !           295: \tagrind [htbp] {edb}{Entry Data Block Format}{edbf}
        !           296: 
        !           297: 
        !           298: It should be noted and remembered that 
        !           299: the Entry Data Block associated with an entry and described as ``the Entry
        !           300: Data Block of the entry'' contains the entries children (i.e., their
        !           301: attributes and RDNs)
        !           302: and not the attributes of the entry itself.
        !           303: This is {\em not} necessarily intuitive.
        !           304: 
        !           305: 
        !           306: 
        !           307: \subsection {Masters and Slaves}
        !           308: 
        !           309: Every Entry Data Block has {\em Master}  and {\em Slave} copies.
        !           310: There will typically be only one master (although there may be
        !           311: multiple master copies, where data is maintained ``out of band'').
        !           312: Slave copies are automatically replicated from a Master EDB.
        !           313: This may be direct or indirect.  The full propagation path must be acyclic
        !           314: (loop free).
        !           315: 
        !           316: A DSA has either all or none of an Entry Data Block 
        !           317: as a Master or Slave
        !           318: (viz: Entry Data Blocks are atomic).
        !           319: Any other DIT information it contains is treated as cached
        !           320: data.
        !           321: A DSA does not need to have any Master or Slave data.
        !           322: 
        !           323: 
        !           324: DSAs are named, and represented in the DIT.
        !           325: One of the reasons for this, is to enable use of the
        !           326: Directory to identify the OSI location of DSAs.
        !           327: This OSI location can then be adjusted transparent to the
        !           328: logical mapping of the DIT onto DSAs.
        !           329: This can be seen as treating a DSA in the same manner as any other
        !           330: Application Entity.
        !           331: This simplifies the implementation, as there does not need  to be
        !           332: specific storage of additional configuration information (knowledge).
        !           333: 
        !           334: An important piece of information stored in the entry of each DSA is the
        !           335: list of EDBs and how they are replicated.  This information is the basis for
        !           336: automatic replication.   
        !           337: 
        !           338: \subsection {QUIPU Subordinate References}
        !           339: 
        !           340: An entry has associated with it, attributes which indicate  the
        !           341: DSAs which have Master or Slave Entry Data Blocks for the entry
        !           342: in question.
        !           343: These pointers are known as {\em Quipu Subordinate References} (QSR).
        !           344: For every QSR, the DSA must have a Master or Slave copy of the EDB, as
        !           345: implied  by the QSR.
        !           346: The converse it not true:  DSAs may have copies of EDBs without there being
        !           347: QSRs.
        !           348: The  DSAs with QSRs have the information {\em and} are
        !           349: prepared to answer public queries about the Entry Data Block in
        !           350: question.
        !           351: DSAs with EDBs (typically slave copies) and no QSRs usually have copies for
        !           352: performance or robustness reasons.  
        !           353: 
        !           354: Quipu Subordinate References are similar to the standardised Non-Specific
        !           355: Subordinate References (NSSR).  There are the following differences:
        !           356: 
        !           357: \begin{itemize}
        !           358: \item QSRs admit to replication, and therefore there are Master QSRs and
        !           359: Slave QSRs.
        !           360: 
        !           361: \item A QSR always points to all of the relevant information, whereas an NSSR
        !           362: may only point to a part of it and must be used in ``and'' conjunction with
        !           363: other NSSRs.
        !           364: \end{itemize}
        !           365: 
        !           366: 
        !           367: \subsection {Access to the root EDB}
        !           368: 
        !           369: There is no requirement for a given DSA to hold a copy of the
        !           370: root Entry Data Block.
        !           371: However, to be able to systematically process all queries, there
        !           372: must be direct or indirect access to the root Entry Data Block.
        !           373: Therefore, every DSA which does not have a copy of the root
        !           374: Entry Data Block must know the name and address of one or more
        !           375: DSA which either has a copy of the root Entry Data Block, or is
        !           376: closer (in terms of these references) to a DSA which has a
        !           377: copy.  This approach is similar to, but not the same as, use of superior
        !           378: references defined in the standard.
        !           379: 
        !           380: \section {Standard Knowledge References}
        !           381: 
        !           382: 
        !           383: In addition, to the QUIPU specific QSRs, an entry might also contain
        !           384: standard Knowledge References, as defined in the OSI Directory.  This is
        !           385: used to point to data not contained in a QUIPU DSA.  There are three types
        !           386: of reference defined in the standard:
        !           387: 
        !           388: \begin{description}
        !           389: \item[Subordinate Reference]  Pointer to an Entry
        !           390: 
        !           391: \item[Cross Reference] From the QUIPU standpoint, the same as a subordinate
        !           392: reference
        !           393: 
        !           394: \item[Non Specific Subordinate Reference] Pointer to multiple subordinates
        !           395: which must be queried for the next level down.  QSRs are similar to this
        !           396: (see previous section).
        !           397: 
        !           398: \end{description}
        !           399: 
        !           400: In the first two cases, the entry in the Entry Data
        !           401: Block is considered to be ``Knowledge only'' (although other entry
        !           402: information may be cached). 
        !           403: In the third case the entry will also have full information on itself.  
        !           404: If any of these are present, there will be no QUIPU master or slave pointers.
        !           405: These three types of pointer are mutually exclusive\footnote{Thought(SEK) ---
        !           406: does the standard let you have a subordinate reference plus a cached NSSR?}.
        !           407: 
        !           408: These attributes are not supported in QUIPU 6.0.
        !           409: 
        !           410: \section {Navigation}
        !           411: 
        !           412: Given this data model, a straightforward navigation algorithm
        !           413: can now be specified.
        !           414: The requirement is to locate the entry associated with a
        !           415: specified Distinguished Name.
        !           416: When the entry is arrived at, the operations will behave
        !           417: as proscribed.
        !           418: 
        !           419: The basis of the navigation strategy is that the first DSA (i.e., the one
        !           420: accessed by the DAP) does all of the hard work.  Other DSAs, accessed by DSA
        !           421: Referral, either answer the question or return an error.  This is important,
        !           422: as it is the basic strategy by which the system ensures completion of
        !           423: queries.
        !           424: There are times when the DSA may depart from this model, these are discussed
        !           425: in Section~\ref{DSA:select} and \cite{QUIPU.Navigate}.
        !           426: 
        !           427: First consider the behaviour of a DSA accessed by the Directory
        !           428: System Protocol (DSP):
        !           429: 
        !           430: \begin{enumerate}
        !           431: \item 
        !           432: Look up the Distinguished Name.
        !           433: \item 
        !           434: If the Distinguished Name is found, go to step 6.
        !           435: \item 
        !           436: If there is a local copy of
        !           437: the Entry Data Block of the parent,
        !           438: return a nameError.
        !           439: The ``matched'' parameter should be set to the Distinguished Name
        !           440: of the Entry Data Block (i.e., the level above the offered name).
        !           441: This is an authoritative NO.
        !           442: \item 
        !           443: Strip the lowest component off the Distinguished Name, and go
        !           444: to step 1.
        !           445: If there are no more components, go to step 5.
        !           446: This process checks for authoritative NO.
        !           447: \item 
        !           448: At this point, the name has not been found, and no relevant
        !           449: Entry Data Block has been found.
        !           450: This implies that the DSA does not hold the root Entry Data
        !           451: Block.
        !           452: Therefore the DSA should return a DSA Referral.
        !           453: The DSA Referral should be the list of DSAs (names and
        !           454: addresses) which are known
        !           455: to be closer to the root.
        !           456: \item 
        !           457: We now have an entry which matches some or all of the original
        !           458: Distinguished Name.
        !           459: Consider this entry.
        !           460: \item 
        !           461: If the entry contains an Alias attribute, dereference, and goto step 1.
        !           462: Note that if a referral is returned, that the appropriate parameters should
        !           463: be set to indicate all dereferences.
        !           464: \item 
        !           465: If the entry is the one specified in the query, return the
        !           466: answer to the query, or the appropriate (authoritative) error.
        !           467: \item 
        !           468: If the entry is of object class ``QuipuNonLeafObject'', return a Referral.
        !           469: This is simply a redirect to a DSA which can take the query at least one
        !           470: step further.  The names for the DSA Referral should be taken from the
        !           471: master and slave Quipu Subordinate References.  Where the calling DSA is a
        !           472: non-QUIPU DSA, the Presentation address of the Master DSA must be looked up,
        !           473: and only this one returned.
        !           474: \item
        !           475: If the entry contains a reference, the appropriate referral should be
        !           476: returned.
        !           477: \item 
        !           478: The query refers to an entry below the bottom of the DIT.
        !           479: An authoritative nameError can be returned.
        !           480: \end{enumerate}
        !           481: 
        !           482: Now consider the slightly more complex case of the initial
        !           483: DSA (doing the DSA Referral).
        !           484: Steps 1-4 are followed as above
        !           485: as above, to determine authoritative NO.
        !           486: 
        !           487: \begin{enumerate}
        !           488: \setcounter{enumi}{4}
        !           489: \item
        !           490: At this point, the name has not been found, and no relevant
        !           491: Entry Data Block has been found.
        !           492: This implies that the DSA does not hold the root Entry Data
        !           493: Block.
        !           494: The list of DSAs which are known
        !           495: to be closer to the root, are the starting point for the
        !           496: iterative query.
        !           497: Go to step \ref{step-iter}.
        !           498: \item 
        !           499: We now have an entry which matches some or all of the original
        !           500: Distinguished Name.
        !           501: Consider this entry.
        !           502: \item 
        !           503: If the entry contains an Alias attribute, apply the relevant
        !           504: dereference to the original query, and go back to the start.
        !           505: \item 
        !           506: If the entry is the one specified in the query, return the
        !           507: answer to the query, or the appropriate (authoritative) error.
        !           508: \item 
        !           509: If the entry is of object class ``QuipuNonLeafObject'', 
        !           510: this gives a list of QSRs to start the iterative query.
        !           511: Go to step \ref{step-iter}.
        !           512: \item
        !           513: If the entry contains a standard knowledge reference, then
        !           514: go to step \ref{step-iter}.  Note that for non-specific subordinate
        !           515: references, {\em all} of the references must
        !           516: be followed before giving up.
        !           517: \item 
        !           518: The query refers to an entry below the bottom of the DIT.
        !           519: An authoritative nameError can be returned,
        !           520: \item 
        !           521: \label{step-iter}
        !           522: Select one of the DSAs from the referral list.
        !           523: The order to try the DSAs is arbitrary.
        !           524: However, it is attempted to  select ones with the
        !           525: topologically closest name first (e.g., a UK DSA will prefer to
        !           526: query another UK DSA before asking a French one).
        !           527: Try DSAs in turn until one gives an answer or you get bored.
        !           528: Consider the answer.
        !           529: Authoritative answers (yes or no) should be passed back to the
        !           530: DUA.
        !           531: If a Referral is received, recurse to step, watching
        !           532: carefully for loops.
        !           533: \end{enumerate}
        !           534: 
        !           535: It can be seen that this navigation is relying on data being
        !           536: distributed correctly, and DSAs other than the one doing the
        !           537: work behaving in a correct manner.
        !           538: Information provided in the referral should be used to ensure that the
        !           539: iteration is progressing, and thus detect livelock situations.
        !           540: 
        !           541: 
        !           542: 
        !           543: \section {List}
        !           544: 
        !           545: The Entry Data Block concept allows the list operation to fall out in a
        !           546: straightforward manner.
        !           547: Navigation to the Entry Data Block belonging to the name provided, will
        !           548: give access to the full result for the list operation.
        !           549: 
        !           550: Note that where cross/subordinate references are involved, it will be
        !           551: assumed that these are not alias entries (reasonable in practice).
        !           552: This will allow list to be performed in a single DSA in all cases.
        !           553: 
        !           554: \section {Search}
        !           555: 
        !           556: This section describes how the OSI Directory search is supported.  This is
        !           557: one of the hardest parts of the implementation, and care must be taken.
        !           558: Note that the DAP argument in DSP is always that provided by the
        !           559: DUA\footnote {Whilst this is in principle one of the key aspects of the way
        !           560: the DSP works, the recommendations for distributed operations violate this
        !           561: principle when dealing with aliases during search.}.  This means that the
        !           562: work done by a given DSA must be in relation to the target object.  With
        !           563: other operations, this is (fairly) straightforward, as the target object
        !           564: always references the base object of the operation.  For searching, care
        !           565: must be taken to correctly verify whether the base object has been reached.
        !           566: This is done by use of the operation progress information, setting the name
        !           567: resolution phase to completed.
        !           568: 
        !           569: The search operation functions by searching the part of the tree implied
        !           570: by the ``subset'' specification.
        !           571: Rather than returning all of the information, the queried DSA will apply
        !           572: the associated filter to the entries in question, and return the
        !           573: filtered result, along with appropriate continuation pointers.
        !           574: This should minimise network traffic.
        !           575: 
        !           576: 
        !           577: The case of ``subset = baseObject'' is handled by navigating to the Entry
        !           578: Data Block of the object's parent, and applying the given filter.
        !           579: If the entry is a cross reference or subordinate reference, the reference
        !           580: should be followed (using the same query).
        !           581: 
        !           582: The case of ``subset = oneLevel'' is handled by navigating to the object's
        !           583: own Entry Data Block.
        !           584: There the filter is applied to each of its children.
        !           585: If any of the children are alias entries, the alias should be
        !           586: de-referenced, and a baseObject search applied to the new entry.
        !           587: For each child which is a cross references or subordinate references, 
        !           588: the references should be followed, setting the target object to be the child.
        !           589: 
        !           590: The case of ``subset = wholeSubtree'' is handled by navigating to the
        !           591: object's own Entry Data Block.
        !           592: There, the filter is applied to the object and to each of its
        !           593: children.
        !           594: If any of the children are alias entries, the alias should be
        !           595: de-referenced, and a wholeSubtree search applied to the new entry.
        !           596: For each child which has QUIPU children (determined
        !           597: by the prescence of a masterDSA attribute), the search should be applied to
        !           598: the master or one of the slave DSAs, with target object set to the child.
        !           599: For each child which is a cross reference or subordinate reference, 
        !           600: the references should be followed, setting the target object to the child.
        !           601: For each child which has non-specific subordinate references, the search
        !           602: should be applied to {\em all} of the referenced DSAs, with the target
        !           603: object set to the child.
        !           604: 
        !           605: There are three procedures for operating:
        !           606: 
        !           607: \begin{enumerate}
        !           608: \item Everything handled by the first DSA, with other DSAs returning a
        !           609: mixture of results and partial outcome qualifiers. 
        !           610: 
        !           611: 
        !           612: \item Proceed by referral until a DSA is reached which has a copy of the
        !           613: base object.  Then this DSA proceeds by referral, and returns the full
        !           614: result to the first DSA.  This is how QUIPU 6.0 works.  It has the advantage
        !           615: of often accumulating search results in a local environment, and so is
        !           616: selectable  (possibly in a complex manner).
        !           617: 
        !           618: \item Proceed by referral until a DSA is reached which has a copy of the
        !           619: base object.  Then proceed entirely by chaining.  This is not done.
        !           620: 
        !           621: \end{enumerate}
        !           622: 
        !           623: 
        !           624: There is potential for looping in this procedure.
        !           625: This will be detected and broken by noting loops in the DSA trace
        !           626: information.
        !           627: This takes account of the fact that some distribution will allow
        !           628: for a query to re-enter the same DSA a number of times.
        !           629: 
        !           630: 
        !           631: The Search and list operations make use of the ``partial results''
        !           632: functionality to return information if a time or size limit is reached.
        !           633: Thus, setting a low size limit will allow a user to easily examine 
        !           634: sample information (either by list or search).
        !           635: 
        !           636: \section {Selecting a DSA}
        !           637: \label{DSA:select}
        !           638: 
        !           639: In Quipu-5.0 the
        !           640: chain/refer choice was very ad hoc.  For a DSA, the best
        !           641: choice is usually to give a referral, except where this will not work.
        !           642: To make this calculation, it is necessary to determine if two DSAs can
        !           643: communicate directly.  This is done by deriving from
        !           644: the presentation address of a DSA, a list of connected networks.  This can
        !           645: then be used to determine if a pair of DSAs can communicate directly, and is
        !           646: the basis for the chaining/referral choice.  This will need the extension
        !           647: of the network address, to allow encoding of private networks other than the
        !           648: three well known ones.
        !           649: 
        !           650: There is an analogous problem when a DSA needs to access a DSA which cannot
        !           651: be accessed directly.  Each DSA which does not have full connectivity, will
        !           652: have an attribute which indicates network/DSA pairs.  This indicates a DSA
        !           653: which may be used (bilateral agreement) to access a given network by
        !           654: application relay.
        !           655: 
        !           656: The following Sections discuss briefly how these choices are made,
        !           657: \cite{QUIPU.Navigate} describes the process more fully.
        !           658: 
        !           659: \subsection {DSA Quality}
        !           660: 
        !           661: Replication gives a choice of DSA to ask a given query to.  The following
        !           662: criteria are relevant:
        !           663: 
        !           664: \begin{itemize}
        !           665: \item Use an existing association if possible
        !           666: \item Prefer a QUIPU DSA
        !           667: \item Prefer a reliable DSA
        !           668: \item Prefer a ``local'' DSA
        !           669: \end{itemize}
        !           670: 
        !           671: The first two are straightforward.  
        !           672: A local DSA can be selected using the following\ldots
        !           673: 
        !           674: \begin{enumerate}
        !           675: \item 
        !           676: Prefer to use networks in the order
        !           677: specified by ts\_communities.  This will encourage access over a local
        !           678: ether/preferred net.   
        !           679: 
        !           680: \item Pick a DSA with a close name (e.g., prefer one in the same country)
        !           681: 
        !           682: \item Pick a DSA in the same DMD.  This would need to add a DMD attribute to
        !           683: the DSA entry (encoded as DN) [Not yet implemented].
        !           684: \end{enumerate}
        !           685: 
        !           686: Picking a reliable DSA is achieved using the following information
        !           687: \begin{verbatim}
        !           688: DSAInfo ::= SEQUENCE  {
        !           689:      dsa DistinguishedName,
        !           690:      lastAttempt UTCTime,
        !           691:      lastSuccess UTCTime OPTIONAL,
        !           692:      failures-since-last-success INTEGER }
        !           693: \end{verbatim}
        !           694: Thus a DSA will be able to check if it knows about the DSAs in question, and
        !           695: can make a choice based on past results.  This should operate dynamically,
        !           696: without operator interference.  Info on DSAs not contacted for a given period
        !           697: should be expunged.
        !           698: It is hoped to store this as an attribute of a DSA in future versions of
        !           699: Quipu.
        !           700: 
        !           701: 
        !           702: \subsection {Unavailable DSAs}
        !           703: 
        !           704: In the case where a DSA is unavailable, and chaining is preferred, a reference
        !           705: will be returned by a QUIPU DSA.  
        !           706: A QUIPU DUA, which knows it is talking to a QUIPU DSA
        !           707: can rely on this behaviour, and simply use the referral as a diagnostic to
        !           708: the user.  It is hoped that the next version of the standard will add an
        !           709: obvious extra parameter.
        !           710: 
        !           711: 
        !           712: \subsection {Operating When DSAs are not Fully Interconnected}
        !           713: \label {tcp-only}
        !           714: 
        !           715: Whilst global interconnection of all application entities is an OSI ideal,
        !           716: it will not be achievable in the short or medium term.  Application relaying
        !           717: by DSAs will be needed to achieve full directory connectivity.  
        !           718: 
        !           719: 
        !           720: In general, it is not desirable for DSAs to proceed by chaining - it wastes
        !           721: unnecessary application level resources.  Later, there may be policy reasons
        !           722: to prefer chaining, but these are ignored for now.  The internal structure
        !           723: of network addresses allows a DSA to determine if two DSAs can communicate
        !           724: directly.
        !           725: 
        !           726: 
        !           727: 
        !           728: \section {The External View of QUIPU}
        !           729: 
        !           730: To a non-QUIPU system, QUIPU will appear to work exactly according to the
        !           731: standard.  
        !           732: 
        !           733: When a QUIPU DSA interacts with another DSA, it will look up its object
        !           734: classes (and probably other information).  This will allow it to determine if
        !           735: the other DSA is a QUIPU DSA.  When interacting with another QUIPU DSA, the
        !           736: following deviations from the standard are possible.  These are primarily
        !           737: concerned with the introduction of replication:
        !           738: 
        !           739: \begin{itemize}
        !           740: \item Presentation Address might be omitted from Access Point (always
        !           741: present in QUIPU 6.0, for consideration in QUIPU 7.0).
        !           742: \item Cross References and Subordinate References have multiple values
        !           743: (although QUIPU will probably never send these to itself).
        !           744: \item Multiple values of Non Specific Subordinate Reference are assumed to
        !           745: have OR conjunction (i.e., they are really QSRs).
        !           746: \item Use of QUIPU Access control as described in Section~\ref{dsp-acl}
        !           747: \end{itemize}
        !           748: 
        !           749: When a QUIPU DSA returns references which are derived from reference
        !           750: attributes, it will return them as specified.  If it returns information
        !           751: derived from QUIPU internal pointers, it will return a non-specific
        !           752: subordinate reference.  If the DSA being communicated with is not a QUIPU
        !           753: DSA, it will return only a reference to the a selected DSA (as replication is
        !           754: not admitted within the protocol).
        !           755: 
        !           756: \section {Cached Data}
        !           757: \label {cache-all}
        !           758: 
        !           759: Cached data is not mentioned in the basic algorithm.
        !           760: However, the algorithm can utilise cached
        !           761: data in some circumstances.
        !           762: This is because of the manner in which identification of copy data has been
        !           763: introduced in the final stage of the OSI Directory specification.
        !           764: Cached data may be used whenever this is not prohibited by the service
        !           765: controls.
        !           766: The standard does not clearly define what ``copy'' data is.  In general,
        !           767: QUIPU treats master and slave data as authoritative.
        !           768: Both slave and cached data are returned to the user as
        !           769: ``copy'' data.  For this reason, the distinction between slave and copy data
        !           770: can only be internal to QUIPU.
        !           771: 
        !           772: There is no time to live or age information in the OSI Directory Protocols.
        !           773: Care must be taken when caching, that spurious information is not passed
        !           774: around indefinitely between DSAs.
        !           775: 
        !           776: When QUIPU holds cached data, it will notes how long it has had it, and will
        !           777: ``time out'' the data after a tailorable period.
        !           778: 
        !           779: This section is open ended.
        !           780: The exact approaches to caching, and determining suitable timeout values
        !           781: will be the subject of experiment.
        !           782: 
        !           783: 
        !           784: The important thing about managing cached data is to handle timeouts
        !           785: sensibly.
        !           786: Data cached from a cache may have an indeterminate age.
        !           787: It is important that this data is given a relatively short timeout, to
        !           788: prevent it being circulated indefinitely amongst a set of DSAs.
        !           789: However, {\em if} the data can be verified by usage (e.g., correctly 
        !           790: connecting to a DSA verifies a presentation address), it should then be
        !           791: treated as if cached from a master/slave.  
        !           792: Non-verified data should be treated in the same manner as user data, which
        !           793: is described in the next section.
        !           794: Data cached from master/slave information should be given a longer timeout.
        !           795: Data is discarded, rather than refreshed automatically.  A timeout of some
        !           796: number of days seems appropriate for most data.   
        !           797: 
        !           798: \section {Configuration and Slave Update}
        !           799: 
        !           800: A given DSA will have copies of zero or more Entry Data Blocks.
        !           801: A DSA may either be a master for a given Entry Data Block, or a
        !           802: slave.
        !           803: If there are multiple master copies, it is assumed that these
        !           804: are kept coherent by some out of band mechanism.
        !           805: For example, one of them is the ``real'' master, and the others
        !           806: are updated by file transfer when modifications occur.
        !           807: This discussion will proceed for the single master case.
        !           808: 
        !           809: There are three distinct types of DSA:
        !           810: 
        !           811: \begin{enumerate}
        !           812: \item 
        !           813: A DSA with a master copy of the root Entry Data Block.
        !           814: \item 
        !           815: A DSA with a slave copy of the root Entry Data Block.
        !           816: \item 
        !           817: A DSA with no copy of the root Entry Data Block.
        !           818: \end{enumerate}
        !           819: 
        !           820: As noted in Section~\ref{model-dist}, DSAs of type 2 and 3 will have pointer(s) to
        !           821: a DSA which is ``closer'' to the master copy of the root Entry
        !           822: Data Block.
        !           823: Specifying this hierarchical distribution, as opposed to requiring
        !           824: direct access to the master (as in earlier versions of the OSI Directory)
        !           825: means that there can be many copies of information which needs to be highly
        !           826: replicated, without excessive
        !           827: redundant copying across the Wide Area Network.   
        !           828: This will be particularly important for the root Entry Data Block.
        !           829: 
        !           830: DSAs of type 2 will only need the pointer information for initial
        !           831: startup or recovery after catastrophic corruption.
        !           832: When the slave copy of the root Entry Data Block has been
        !           833: obtained for the first time, this will supercede the pointers.
        !           834: DSAs of type 3 will usually use cached information in preference to
        !           835: these pointers, and will only need the pointers if cached information is
        !           836: (or appears to be) invalid.
        !           837: 
        !           838: The only information which a DSA has to obtain locally at initial boot time,
        !           839: other than the DSA pointers, is its own name.  All other information may be
        !           840: obtained from the Directory.
        !           841: Beyond this, the Directory Service manages its own
        !           842: configuration.
        !           843: There is little point in having a Directory Service providing
        !           844: general high speed access to global information, and then
        !           845: requiring an additional system (knowledge) to deal with its own
        !           846: configuration.
        !           847: 
        !           848: Associated with the DSA's entry in the DIT is a specification of
        !           849: the entries for which the DSA is a master, and for which it is
        !           850: a slave.
        !           851: A DSA will be able to derive the location of an Entry Data
        !           852: Block for which it is master from this information.
        !           853: Thus at initial boot, a DSA will utilise its initial DSA pointers
        !           854: to read its own entry.
        !           855: The location of master Entry Data Blocks will be derivable from
        !           856: their name, and so their existence can then be verified by the
        !           857: DSA in question.
        !           858: A DSA which is a master for the root Entry Data Block will have
        !           859: no pointers.
        !           860: However, it can go straight to the master root Entry Data
        !           861: Block, read the information about itself, and proceed as for
        !           862: other DSAs.
        !           863: 
        !           864: 
        !           865: It is believed that for early pilots, a high level of copying configuration
        !           866: data will be desirable to achieve robustness.  The root and national EDBs
        !           867: will be very highly replicated, even though QUIPU can operate with a rather
        !           868: low level of replication.
        !           869: 
        !           870: \section {DSA Naming}
        !           871: \label {dsa-naming}
        !           872: 
        !           873: \subsection {Choice of Names to Prevent Loops}
        !           874: 
        !           875: Care must be taken to prevent the situation where the location
        !           876: of a DSA is only known through itself (and other more complex
        !           877: variants).
        !           878: A simple rule for naming DSAs will ensure that this cannot
        !           879: happen.
        !           880: The master DSA for a given entry (i.e., the DSA controlling the Entry Data Block of
        !           881: containing 
        !           882: the entry's children) should have its
        !           883: name in the Entry Data Block of the entry's parent or at a
        !           884: level higher in the DIT.
        !           885: For example, the master DSA of 
        !           886: \begin{quote}\small\begin{verbatim}
        !           887: Country=UK, Org=University College London, OU=Computer Science
        !           888: \end{verbatim}\end{quote}
        !           889: which contains information on entries below Computer Science, may be labelled
        !           890: \begin{quote}\small\begin{verbatim}
        !           891: Country=UK, Org=University College London, DSA=Three Toed Sloth
        !           892: \end{verbatim}\end{quote}
        !           893: or
        !           894: \begin{quote}\small\begin{verbatim}
        !           895: Country=France, DSA=Capybara
        !           896: \end{verbatim}\end{quote}
        !           897: It may not be labelled
        !           898: \begin{quote}\small\begin{verbatim}
        !           899: Country=UK, Org=University College London, OU=Computer Science, 
        !           900:             DSA=Alpaca
        !           901: \end{verbatim}\end{quote}
        !           902: or
        !           903: \begin{quote}\small\begin{verbatim}
        !           904: Country=France, Org=Inria, DSA=Llama
        !           905: \end{verbatim}\end{quote}
        !           906: 
        !           907: 
        !           908: A little more flexibility could be allowed;
        !           909: However, this rule is simple, it prevents deadlock, and allows
        !           910: for reasonable labelling practices.
        !           911: The restriction may be relaxed somewhat, when the concept of Directory
        !           912: Management Domains is introduced more formally.
        !           913: 
        !           914: \chapter{Access Control and Authentication}
        !           915: 
        !           916: \input{q-secdes}
        !           917: 
        !           918: \chapter {Replicating Updates}
        !           919: \label {des-first}
        !           920: \label {dist-update}
        !           921: 
        !           922: 
        !           923: \section {Basic Update Approach}
        !           924: \label {edb-ros}
        !           925: 
        !           926: QUIPU  supports a simple automatic update
        !           927: mechanism.
        !           928: This allows for copying of Entry Data Blocks,
        !           929: but with a simple check to ensure that only new information is copied.
        !           930: Slave copies are obtained by use of a new remote operation.
        !           931: The argument to the operation is the name of the Entry, and the
        !           932: version number of the copy of the Entry Data Block held
        !           933: locally.
        !           934: A FULL copy of the Entry Data Block is returned if this version
        !           935: is out of date.
        !           936: In the DSA's entry, there is a list of Entry Data Blocks for which the DSA
        !           937: has master or slave copies, and the DSA which it gets updates from.
        !           938: For each Entry Data Block, there is the list of DSAs which pull the Entry
        !           939: Data Block, and for slave copies, which DSA the update should come from.
        !           940: It is assumed that this operation will be invoked sufficiently
        !           941: often for it to be acceptable to consider the slave data as
        !           942: ``official''.
        !           943: For the type of usage being considered, this probably means several
        !           944: times per day.
        !           945: Within QUIPU, this operation is in  a new protocol (QUIPU DSP), which will
        !           946: also contains the DSP ASEs.
        !           947: The operation is specified in Figure~\ref{getedb-py}.
        !           948: 
        !           949: \tagrind {getedb}{EDB Access Operation}{getedb-py}
        !           950: \clearpage
        !           951: 
        !           952: Note that a DSA receiving a GetEDB operation, should check the associated
        !           953: EDBInfo, to ensure that the DSA in question is allowed to pull a copy of
        !           954: this EDB.
        !           955: 
        !           956: The operation may be used to determine which version of the EDB is currently
        !           957: master.  This might be used when a query with dontUseCopy arrives, in order
        !           958: to determine whether slave information is accurate.  This would be a big
        !           959: performance win for search and list operations, due to potnetila reduction
        !           960: in information transferred.
        !           961: 
        !           962: \chapter {Implementation Choices}
        !           963: 
        !           964: \section {DSA Structure}
        !           965: 
        !           966: Whilst the operation of a QUIPU DSA is fast, its
        !           967: startup procedure is not, due to reading all of its data from a text file on
        !           968: disk.
        !           969: This long startup means that applications must be able to use
        !           970: multiple DSAs, to prevent lockout whilst the local DSA starts up.
        !           971: Also, the process structure of DSAs must be static.
        !           972: To provide a system with reasonable availability, particularly in view of
        !           973: the system's ability to perform extravagant searching, the basic
        !           974: DSA must be able to handle multiple calls.
        !           975: For this reason, apart from conformance issues, the DSA will be inherently
        !           976: asynchronous, and will need to have its own internal scheduling.
        !           977: Initially, this can be simple minded.
        !           978: However, we are providing a framework for a system which is very
        !           979: sophisticated in this area.
        !           980: 
        !           981: The basic approach of the DSA is to have two (conceptually) co-routined modules, which are
        !           982: interfaced by in-core C structures.
        !           983: The first module is the DSA engine, which resolves inbound queries either
        !           984: by looking them up in its in-core data structures or by generating further
        !           985: queries.
        !           986: The second module is the protocol engine.
        !           987: This is responsible for opening and closing calls, and for mapping between
        !           988: OPDUs on the network and C structures to be handled by the DSA engine.
        !           989: The interface provided to the DSA is largely independent of DAP vs DSP.
        !           990: 
        !           991: \subsection {Memory Structures}
        !           992: 
        !           993: There are a number of structures which are of particular importance.
        !           994: They are summarised here:
        !           995: 
        !           996: \begin{itemize}
        !           997: \item
        !           998: The Entry is as the basic component of the in-core tree, which is linked
        !           999: upwards and downwards between parents and children.
        !          1000: The tree always starts at the root, even if there is no information beyond
        !          1001: the RDN present.
        !          1002: Where an entry corresponds to the base of an Entry Data Block, the parameters
        !          1003: of the Entry Data Block are present.
        !          1004: Siblings are linked in a chain.
        !          1005: Each entry is represented by a `C' structure, which contains:
        !          1006: 
        !          1007: \begin{itemize}
        !          1008: \item
        !          1009: Information on the linkage (hierarchical, and between siblings).
        !          1010: 
        !          1011: \item
        !          1012: How Entry Data Blocks are managed.
        !          1013: 
        !          1014: \item
        !          1015: How the ``special'' attributes (ACL, Schema, Alias, Password, DSA location
        !          1016: info) are held.
        !          1017: \end{itemize}
        !          1018: 
        !          1019: \item
        !          1020: There is a structure associated with each connection.
        !          1021: This is used to represent actual and desired connections.
        !          1022: These structures are linked into a list, and are the key point for the
        !          1023: protocol module.
        !          1024: They indicate a list of operations and tasks associated with each connection.
        !          1025: When the DSA engine needs a connection, it will see if one is already
        !          1026: open to the DSA in question.  If it is not, a connection structure will be
        !          1027: created, which the protocol engine will act on in due course.
        !          1028: Similarly, the protocol engine will close down unneeded connections, possibly
        !          1029: after some (intentional) delay.
        !          1030: 
        !          1031: \item
        !          1032: There is a Task structure associated with each query which arrives.
        !          1033: This holds the {\em full} state of the task, so the the DSA can switch between
        !          1034: tasks at intervals (typically when a network connection blocks).
        !          1035: This points to the list of operations which have been generated by the task.
        !          1036: This is the key structure for the DSA Engine.
        !          1037: 
        !          1038: \item
        !          1039: There is an Operation structure, associated with each pending operation.
        !          1040: These structures are in mesh structure, arranged both by Task and Connection.
        !          1041: \end{itemize}
        !          1042: 
        !          1043: Multi-level priorities are associated with tasks and operations, which are
        !          1044: used by both engines to control scheduling.
        !          1045: This will be done in QUIPU 6.0 on two bases:
        !          1046: 
        !          1047: \begin{itemize}
        !          1048: \item  The user specified priority
        !          1049: 
        !          1050: \item The progress of the operation (long searches are downgraded in
        !          1051: priority).
        !          1052: \end{itemize}
        !          1053: 
        !          1054: \subsection {Malloc}
        !          1055: 
        !          1056: The above is optimised by careful use of malloc. \index{malloc}
        !          1057: A purpose built malloc is used, this knows about the memory intensive DSA,
        !          1058: and tries to ensure that data accessed at similar times during the DSA
        !          1059: operation, will be stored in the same page of core memory.
        !          1060: This has the effect that the number of page faults generated is
        !          1061: significantly reduced (early results indicate a twenty percent improvement
        !          1062: over the standard malloc supplied with SunOS4).
        !          1063: 
        !          1064: \subsection {Disk Structures}
        !          1065: 
        !          1066: All of
        !          1067: the data for a given QUIPU DSA 
        !          1068: will be
        !          1069: contained under a single (UNIX) directory.  There will be a directory for
        !          1070: each RDN, where the DSA in question has an Entry Data Block (which may be
        !          1071: master, slave, or cached).
        !          1072: The name of directory being that of the QUIPU text encoded RDN.
        !          1073: Thus there will be a UNIX directory structure which corresponds to the
        !          1074: portion of the DIT held in the DSA.
        !          1075: There will be file in each RDN directory called ``EDB'', which has the
        !          1076: authoritative version of the data, and one called ``EDB.bak'', which has the
        !          1077: previous version.
        !          1078: This might be extended to provide more comprehensive backup.
        !          1079: 
        !          1080: 
        !          1081: When the system is booted, the following will occur:
        !          1082: 
        !          1083: \begin{enumerate}
        !          1084: \item 
        !          1085: Read tailoring information.
        !          1086: \item 
        !          1087: Look for sequence of Entry Data Blocks implied by the DSAs name.
        !          1088: These will usually be cached. for later reuse.
        !          1089: If not, the default addresses must be used.
        !          1090: \item 
        !          1091: With the DSA's own info available, read in the other master and slave Entry
        !          1092: Data Blocks.
        !          1093: \item 
        !          1094: Read in other Entry Data Blocks, checking for consistency.
        !          1095: \end{enumerate}
        !          1096: 
        !          1097: \section {OSI Choices}
        !          1098: 
        !          1099: ROS (1988) and the implied protocols (ACSE and Presentation) will be used.
        !          1100: Other combinations (e.g., TP0 over TCP or TP4 over CLNS may be used by
        !          1101: bilateral agreement between DUA and DSA or DSA and DSA).
        !          1102: 
        !          1103: To ensure full connectivity of the QUIPU Directory Service, one of the
        !          1104: following conditions must be met:
        !          1105: 
        !          1106: \begin{enumerate}
        !          1107: \item Support of transport class 0 over international X.25(80) (This condition
        !          1108: will be changed to support of CONS with access to the international X.25
        !          1109: subnetwork, when such a statement is realistic).
        !          1110: 
        !          1111: \item Access to a DSA which will perform application relaying in line with
        !          1112: the procedures of Section~\ref {tcp-only}.
        !          1113: This will need a bilateral agreement.  It is hoped to establish ``well
        !          1114: known'' DSAs which can serve this function for the following well known
        !          1115: networks:
        !          1116: \begin{itemize}
        !          1117: \item  Janet
        !          1118: \item  The DARPA/NSF Internet
        !          1119: \end{itemize}
        !          1120: \end{enumerate}
        !          1121: 
        !          1122: 
        !          1123: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.