home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1997 December / Internet_Info_CD-ROM_Walnut_Creek_December_1997.iso / drafts / draft_ietf_a_c / draft-ietf-asid-ldap-mult-mast-rep-01.txt < prev    next >
Text File  |  1997-07-31  |  26KB  |  593 lines

  1. Network Working Group                Chris Weider
  2. INTERNET-DRAFT                    Microsoft Corp.
  3.                         John Strassner
  4.                         Cisco
  5. Intended Category: Standards Track        July 29, 1997
  6.  
  7. LDAP Multi-Master Replication Protocol
  8. <draft-ietf-asid-ldap-mult-mast-rep-01.txt>
  9.  
  10. Status of this Memo
  11.  
  12. This document is an Internet-Draft. Internet-Drafts are working 
  13. documents of the Internet Engineering Task Force (IETF), its areas, and
  14. its working groups. Note that other groups may also distribute working 
  15. documents as Internet-Drafts.
  16.  
  17. Internet-Drafts are draft documents, and are valid for a maximum of six 
  18. months. They may be updated, replaced, or obsoleted by other documents 
  19. at any time. It is inappropriate to use Internet-Drafts as reference 
  20. material or to cite them other than as 'work in progress.'
  21.  
  22. To learn the current status of any Internet-Draft, please check the 
  23. '1id-abstracts.txt' listing contained in the Internet-Drafts Shadow 
  24. Directories on ds.internic.net (US East Coast), nic.nordu.net (Europe), 
  25. ftp.isi.edu (US West Coast), or munnari.oz.au (Pacific Rim).
  26.  
  27. This draft expires January 29, 1998.
  28.  
  29. 0: Abstract
  30.  
  31. This paper defines a multi-master, incremental replication protocol 
  32. using the LDAP protocol [LDAPv3]. This protocol uses and builds upon 
  33. previous LDAP support protocols, namely the changelog [change] and LDIF 
  34. [LDIF] protocols. It defines the use of two types of transport protocols
  35. for replication data, and specifies the schema that must be supported by
  36. a server that wishes to participate in replication activities using this
  37. protocol.
  38.  
  39. 1: Introduction
  40.  
  41. LDAP is increasing in popularity as a generalized query, access, and 
  42. retrieval protocol for directory information. Data replication is key
  43. to effectively distributing and sharing such information. Therefore, it 
  44. becomes important to create a replication protocol for use specifically 
  45. with LDAP to ensure that heterogeneous directory servers can reliably 
  46. exchange information. This document defines a multi-master, incremental 
  47. replication protocol for use with LDAP. It does not specifically address
  48.  
  49. the needs of single-master (i.e., master-slave) systems, though this 
  50. document could be used as the basis for such a scheme. In addition, it 
  51. defines how to use that replication protocol over two transport 
  52. mechanisms: standard email and LDAP. The new replication protocol 
  53. requires new data to be entered into the directory for use with this 
  54. protocol. Therefore, we must define new schema to hold that information.
  55. Also, the data must be transmitted in a specific format; we will use 
  56. the proposed LDIF format [LDIF] for doing this.
  57.  
  58. 2: Protocol Behavior
  59.  
  60. 2.1 A glossary of replication terminology
  61.  
  62. There are 6 axes along which replication functionality can be provided. 
  63. These are:
  64.  
  65. - single-master vs. multi-master
  66. - full vs partial
  67. - whole vs fractional
  68. - transactional vs loosely consistent
  69. - complete vs. incremental
  70. - synchronous vs. asynchronous
  71.  
  72. Each of these terms is described below.
  73.  
  74. A single-master (also known as master-slave) replication model assumes
  75. that only one server (the master) allows write access to the replicated
  76. entries. Changes flow from the master server to all of the replicas. A 
  77. multi-master replication model assumes that entries can be written on 
  78. multiple servers. Changes must then propagate from all masters to every 
  79. replica, which requires additional work for conflict resolution. Here, 
  80. an update conflict is defined as updating the same data within a given 
  81. same replication interval (i.e., not necessarily at exactly the same 
  82. time).
  83.  
  84.  
  85. Full replication is where every object in a database or DSA is copied to
  86. the replica. Partial replication is where some subset of the objects is 
  87. copied.
  88.  
  89. Whole and fractional replication refer to the attributes transmitted 
  90. during replication. If all attributes of the replicated objects are 
  91. copied, this is referred to as whole replication. If only a subset of 
  92. the attributes are copied, this is referred to as fractional 
  93. replication.
  94.  
  95. Transactional replication requires that the replica gets and commits all
  96. changes between its copy of the data and the master's copy of the data 
  97. before the client is notified that the change was successful. Note that 
  98. 'commit' is used in the general sense to define the action of writing 
  99. changes to a data store and verifying that those changes were written 
  100. successfully. Specifically, it does NOT imply two-phased commit as used 
  101. in databases. Loosely consistent means that there are times when the 
  102. written server has data that the replicas do not, from the client's
  103. point
  104. of view. Note also that a general replication topology may well have a 
  105. mix of links that are transactional and loosely consistent.
  106.  
  107. Complete replication requires the replicating server to send a complete 
  108. copy of itself to the replica every time it replicates. Incremental 
  109. replication allows the replicating server to only send that data which 
  110. has changed.
  111.  
  112. Synchronous replication updates the replica as soon as the source data
  113. is 
  114. changed. Asynchronous replication updates the replica some time after
  115. the
  116. source data has been modified. 
  117.  
  118. 2.2 Single-master versus multi-master replication
  119.  
  120. This section provides some additional general information that will help
  121.  
  122. lay the groundwork for understanding replication.
  123.  
  124. Replication technology enables the placement of copied and/or shared
  125. data
  126. at different locations distributed throughout an organization. This is 
  127. usually done for two reasons: (1) providing 'fast' local access by 
  128. eliminating long-distance connections between users and database
  129. servers, 
  130. and/or (2) providing corporate-wide high-availability access for
  131. critical
  132. applications, making them more resistant to single system failures.
  133.  
  134. Replication topologies determine what is to be replicated as well as
  135. what
  136. can be updated when and where. Replication policies define how
  137. replication
  138. is done as well as how update conflicts are resolved. Both of these are 
  139. orthogonal to this specification, and so will only be mentioned for 
  140. completeness of understanding in this document.
  141.  
  142. Single-master replication designates one, and only one, copy of the data
  143.  
  144. as being the 'master' or authoritative source of data. All updates are 
  145. done to the master, and the master is responsible for ensuring that all 
  146. replicas contain the same data as it does. Single-master schemes require
  147.  
  148. the definition of both replication topology as well as policy (or
  149. policies),
  150. although since there is by definition no update conflict, these
  151. topologies 
  152. and policies are in general simpler than those of their multi-master 
  153. counterparts.
  154.  
  155. Multi-master replication allows updates to different servers, where each
  156. of
  157. the updated servers allow the same naming contexts to be writable. An 
  158. update conflict occurs when the same data is updated on multiple servers
  159.  
  160. within the same replication interval (i.e., not necessarily at the same 
  161. time). This means that copies can be temporarily out of sync with each 
  162. other. This is acceptable, as long as over time the data converges to
  163. the 
  164. same values at all sites. This requires a rich definition of topology
  165. and 
  166. policy or policies.
  167.  
  168. 2.3 The basics of multi-master, incremental replication
  169.  
  170. This specification is aimed primarily at supporting multi-master, 
  171. incremental, loosely consistent, asynchronous replication. This 
  172. specification could also be used to support single-master replication,
  173. if 
  174. one treats only one of the servers in a replication agreement as
  175. writable.
  176. Someof the information required in this specification (i.e., conflict 
  177. resolution) is not needed for the single-master case. However, the
  178. ability
  179. to define what has been changed and to ensure that those changes are 
  180. propagated throughout the system is common to both single- and
  181. multi-master
  182. replication. Therefore, this specification will address only
  183. multi-master 
  184. replication.
  185.  
  186. To implement multi-master, incremental, loosely consistent, asynchronous
  187.  
  188. replication, each server which wishes to master data MUST have the 
  189. facilities necessary to track changes to the replicate data. In
  190. addition, 
  191. each master server MUST have the ability to transmit those changes to 
  192. other replicas, and MUST have techniques to implement conflict detection
  193. and resolution. The replication protocol enables servers to transmit 
  194. changes over several transport protocols. This document also provides 
  195. algorithms for detecting and resolving conflicts.
  196.  
  197. 2.4 The Naming Context (NC)
  198.  
  199. The Directory Information Base (DIB) is the collection of information
  200. aboutobjects stored in the directory and their relationships. The DIB 
  201. may be organized as a hierarchy (or tree), where objects higher in the 
  202. hierarchy provide naming resolution for their subordinate objects. This 
  203. tree, called the Directory Information Tree (DIT), provides the basis 
  204. for using names toquery, access, and retrieve information. The DIT can
  205. in turn be comprised of a set of subtrees. 
  206.  
  207. The basic unit of replication is the NC. A Naming Context consists of a
  208. non-leaf node (called the root of the naming context) and some subset
  209. of its descendants subject to the following restriction: a descendant 
  210. cannot be part of a naming context unless all of its ancestors which
  211. are descendants of the naming context root are in the naming context 
  212. (e.g. an NC is a complete subtree and cannot have any holes).
  213.  
  214. Each DSA will have one or more naming contexts. These naming contexts 
  215. will be defined and available in the Configuration container pointed to
  216. by the root DSE of the server. The requisite schema are defined in 
  217. section 3. 
  218.  
  219. To replicate a given naming context, the only requirement is that the 
  220. two servers agree on the contents of every schema entry needed to
  221. defineall the objects in the naming context. The reconciliation of 
  222. these entries is beyond the scope of this protocol.
  223.  
  224. 2.4.1 Tracking changes to an NC
  225.  
  226. Borrowing from the ChangeLog draft [change], each change to a 
  227. replicatedNC is logged in its own entry in the changeLog container. 
  228. This entry has object class 'changeLogEntry' and holds the trace of the 
  229. change, in LDIF format. For more details on the format, see [change]. 
  230. However, the current ChangeLog draft is designed to provide single 
  231. master replication. To provide multi-master, incremental replication, 
  232. much more information needs to be kept. 
  233.  
  234. In addition to the information required by the ChangeLog draft, servers
  235. MUST also keep track of the following information and MUST write it to 
  236. the changeLog entry:
  237.  
  238. - a version number for each property of every entry
  239. - a timestamp for the time each property is changed, 
  240. - the attributes that were changed in this particular entry
  241. - the object classes of this particular entry
  242. - the naming context in which a given entry resides
  243. - a unique identifier for each entry, which is NOT the DN or RDN of the
  244.   entry
  245.  
  246. In addition, servers MUST also keep track of the following information
  247. and MAY write it to the changeLog entry:
  248.  
  249. - a unique identifier for each entry's parent, which is NOT the DN or 
  250.   RDN of the parent, when the operation performed on this entry is a 
  251.   modifyDN.
  252.  
  253. 2.4.2 Discussion of the required new changeLog information
  254.  
  255. The version number and timestamp are required for conflict resolution 
  256. in multi-master replication. 
  257.  
  258. The attribute and object class tracking are useful for directory 
  259. synchronization with special-purpose directories. The actual changes 
  260. themselves are stored in a single binary blob in the changeLog entry. 
  261. This allows special-purpose directories (such as mail server 
  262. directories) to extract only the changes they need.
  263.  
  264. The NC is required for conflict resolution in multi-master replication.
  265. The NC in which a given entry resides allows efficient replication of a
  266. given naming context. While this may in principle be derivable from the
  267. DN of the changed entry, adding this information allows much easier 
  268. retrieval of the appropriate entries. 
  269.  
  270. The unique identifier is required to handle modifyDN conflicts 
  271. correctly.
  272.  
  273. In addition, the server MUST write the entry's parentUniqueID to the
  274. changeLog entry during tracking of a modifyDN operation. This is 
  275. required by the reconciliation algorithms defined below.
  276.  
  277. The new attributes are defined in section 3.
  278.  
  279. 2.5 Defining the replication topology
  280.  
  281. Each server replicating a given set of naming contexts needs to have 
  282. information about that naming context, including information on how to 
  283. replicate it. However, this information is orthogonal to the 
  284. replication protocol and as such is beyond the scope of this document.
  285.  
  286. 2.6 Replication conflict resolution policies
  287.  
  288. This section will describe a simple, yet powerful, policy for 
  289. reconciling conflicts in a multi-master replication environment. This 
  290. policy is one implementation of resolving conflicts. However, some 
  291. applications might require more granular control, where different 
  292. policies are used for different parts of the DIT or even at different 
  293. times under different circumstances. However, a detailed analysis of 
  294. different replication policies is beyond the scope of this document.
  295.  
  296. 2.6.1 Using ChangeLog to implement a replication conflict resolution 
  297.       policy
  298.  
  299. In a multi-master environment, conflict resolution between 
  300. incompatible updates is crucial. Since each change listed in the 
  301. ChangeLog includes the version number of the attribute, every attribute
  302. received in a replication update is reconciled with the local version 
  303. of the attribute in the following way:
  304.  
  305. A. If the version numbers are different, the higher version is favored
  306. B. If the version numbers are the same, the version with the more recent
  307.    time stamp is favored
  308. C. If both the version and time-stamp match, the values themselves are 
  309.    compared and the one with the lowest value is favored. This 
  310.    guarantees that the system will quiesce consistently.
  311. D. If all three of these match, the values are identical.
  312.  
  313. If an object is deleted, a server implementing this replication protocol
  314. MUST keep a 'tombstone' of the deleted object. This is essentially a 
  315. copy of the deleted object that can be used to restore it. This document
  316.  
  317. does not specify the length of time that such tombstones must be kept 
  318. (this is part of the replication policy that is implemented in a set of
  319. replicated servers). When an object is deleted and there are replication
  320.  
  321. changes that affect that object, there are some special rules that must 
  322. be applied.
  323.  
  324. E: Deletions are allowed only on objects which have no children. If a 
  325.    deletion is received for an object that has a child, the 
  326.    reconciliation is to simply ignore the deletion. The server MAY flag
  327.    this as an error and issue an error to the administrator, who is 
  328.    then responsible for correcting the problem.
  329.  
  330. F: If an incoming replication change is to create a new object under an
  331.    already deleted object, then the tombstones of all the ancestors of 
  332.    the already deleted object are reanimated and the new object is 
  333.    inserted in the correct place. This reanimation must minimally 
  334.    restore the RDN and object class attributes of the ancestor.
  335.  
  336. A modifyDN operation is not considered, for purposes of replication, to
  337. be a combination of a delete and an add operation unless such an 
  338. operation would move the object to a new naming context. 
  339.  
  340. In the case where the operation does not cross NC boundaries, it is a 
  341. single operation that essentially modifies an entry's parentUniqueID. 
  342. Since this attribute is treated as an attribute of the entry itself, 
  343. the standard reconciliation logic applies. 
  344.  
  345. In the case where the operation does cross the NC boundaries, it must 
  346. be treated as a delete and add combination. A server conforming to
  347. thisspecification will in addition treat the delete and add 
  348. combination as an atomic operation.
  349.  
  350. In addition, a modifyDN or modifyRDN operation may cause two objects 
  351. to have the same DN. In that case, the replication system MUST 
  352. algorithmically change the RDN of one or both of the objects. The 
  353. algorithmically generated RDN is propagated so that the system will
  354. still reach a consistent state. The easiest way to guarantee a non-
  355. conflicting RDN is to use the object's UID as the new RDN.
  356.  
  357. 2.6.2 Loading data
  358.  
  359. In a replicated environment, the problem of loading multiple remote
  360. systems in a coordinated fashion is much more complex. There are 
  361. three different methods to instantiate data at participating 
  362. locations in a replicated environment: (1) pre-instantiation, 
  363. (2)on-line instantiation, and (3) off-line instantiation.
  364.  
  365. Pre-instantiation copies all data to all locations before 
  366. beginning the actual configuration of the replication environment.
  367. This guarantees identical data copies before allowing the 
  368. replication process to begin. This requires that no replication 
  369. activity take place against the data until all locations are up
  370. and configured.
  371.  
  372. On-line instantiation is used when there is an initial location that
  373. has already been populated with data that will be used to replicate
  374. data to a set of remote locations. Note that in a general replication
  375. topology, there may be several authoritative servers that master data
  376. to different sets of replicas. The replication policy that is used in
  377. this case should ensure that there are no duplicate replica sets for 
  378. the initial loading of data. This has the advantage of guaranteeing 
  379. that all locations have the same data and gives the administrator a 
  380. single point of control. However, there can be significant delay while
  381. data are copied over the network.
  382.  
  383. In off-line instantiation , an initial location is configured as a 
  384. master. Replication agreements are then set up between it and other 
  385. locations to replicate data at a later time. The initial location stores
  386. changes destined for future locations and pushes them to the other 
  387. locations as they come on line. This enables other locations to be
  388. loaded with data and synchronized with the initial location when they
  389. need new data.
  390.  
  391. On-line instantiation is enabled by the use of the FullReplicaControl
  392. control, discussed in section 4.1.
  393.  
  394.  
  395. 3: Schema
  396.  
  397. This section defines new attributes used in this protocol. Object
  398. classes and attributes which are not defined in this document can be
  399. found in [LSPA] or in [change].
  400.  
  401. 3.1 Changes to the ChangeLog document
  402.  
  403. As noted above, multi-master replication requires a substantial number
  404. of changes to the changeLog document. Here are the new object class and 
  405. attributes.
  406.  
  407. Note that commonName, namingContexts, and description are all defined
  408. in other documents
  409.  
  410. 3.1.1 Changes to changeLogEntry
  411.  
  412. ( 2.16.840.1.113730.3.2.1
  413.    NAME 'changeLogEntry'
  414.    SUP 'top'
  415.    STRUCTURAL
  416.    MUST (
  417.       ChangeNumber $ targetDN $ changeType $ changes $
  418.       changedAttribute $ entryObjectClass $ namingContext $
  419.       uniqueIdentifier )
  420.    MAY  (
  421.       ParentUniqueIdentifier $ NewRDN $ deleteOldRDN $ newSuperior
  422.    )
  423. )
  424.  
  425. 3.1.2 Changed attributes
  426.  
  427. ( 2.16.840.1.113730.3.1.5
  428.    NAME 'changeNumber'
  429.    DESC 'a 64 bit number which uniquely identifies a change made
  430.       to a Directory entry'
  431.    SYNTAX 'Integer'
  432. )
  433.  
  434. 3.1.3 New attributes
  435.  
  436. (1.2.840.113556.1.4.AAO
  437.    NAME changedAttribute
  438.    DESC 'OID of changed attribute'
  439.    SYNTAX 'DirectoryString'
  440. )
  441.  
  442. ( 1.2.840.113556.1.4.AAR
  443.    NAME 'entryObjectClass'
  444.    DESC 'object class this entry participates in'
  445.    SYNTAX 'DirectoryString'
  446. )
  447.  
  448. (1.2.840.113556.1.4.AAS
  449.    NAME 'parentUniqueIdentifier'
  450.    DESC 'Unique identifier of the entry's parent'
  451.    SYNTAX 'DirectoryString'
  452. )
  453.  
  454. 3.4 Changes to the LDIF document
  455.  
  456. To allow incremental efficient multi-master replication, we required two
  457. pieces of information for each attribute to be transmitted that must
  458. appear on a per-attribute basis; version number and timestamp. This 
  459. should be transmitted in the LDIF format as qualifiers on the 
  460. appropriate attribute: i.e. 'commonName;2,19970308133106Z: Fred Foobar'.
  461. The version number is always the second to last qualifier, the timestamp
  462. is always the last qualifier. Note that this information is formatted 
  463. this way for transmission purposes only.
  464.  
  465. 4: LDAP transport
  466.  
  467. One of the two methods used to transport replication data is by using
  468. the LDAP protocol itself. The target server sets up an ordinary LDAP 
  469. session with the source server, binding to the source DSA as the target 
  470. server (remember that the root naming context has been replicated 
  471. everywhere and so every server participating in a given replication 
  472. topology knows about all the other servers) and issues a search with
  473. the new 'replicate' extended control. The target server will specify
  474. the changeLog container as the base of the search, and will use a
  475. filter that states that all records with changeNumber greater than the
  476. current high update number, that reside in one of the replicated naming
  477. contexts, will be given back. The source server MUST then order the 
  478. results in such a way so that when they are applied to the replica in
  479. that order, the replica will be synced with the source server at the 
  480. time that the replication snapshot was taken. This ordering of the
  481. changes is imperative. One possible way to provide such an ordering
  482. would be to sort the results on changeNumber. There will be a number of
  483. LDAP implementations which may not wish to provide a general sort 
  484. facility for search results; however, a conformant implementation of the
  485. replicate control MUST order the results into a correct order.
  486.  
  487. Once the target starts receiving entries, it then applies each of the 
  488. changeLogEntries to its own database, in the same order in which the
  489. entries were sorted, incrementing its highUpdateNumber attribute for
  490. that server appropriately. If the source server has indicated that it
  491. has more entries, the target server can then reissue the search with the
  492. new highUpdateNumber. In an environment with a rapidly changing 
  493. directory, the source directory may at its discretion return a maximum 
  494. highUpdateNumber indicating the highest number used by the server at the
  495. start of the session. The target server should then use that number as
  496. an 
  497. additional term on the filter on subsequent search requests to allow a 
  498. 'snapshot' of the data to be replicated. Otherwise, the target server 
  499. might never close the connection to the source server, which would
  500. impact 
  501. source server performance and available bandwidth.
  502.  
  503. The replicate control is included in the searchRequest and 
  504. searchResultDone messages as part of the controls field of the 
  505. LDAPMessage, as defined in Section 4.1.12 of [LDAPv3]. The structure of 
  506. this control is as follows:
  507.  
  508. replicateControl ::= SEQUENCE {
  509.     controlType        1.2.840.113556.1.4.617
  510.     criticality        BOOLEAN DEFAULT TRUE
  511.     controlValue    INTEGER (1..2^64-1)
  512. )
  513.  
  514. The replicateControl controlValue is used by the source server to return
  515. a maximum highUpdateNumber if it wishes to allow the target server to 
  516. take a snapshot of the replication data.     
  517.  
  518. 4.1: Full updates
  519.  
  520.  
  521. If the target server wishes to retrieve a full listing of the current 
  522. contents of the DSA, it must issue a fullReplicaControl. This control is
  523. used on a search operation, just like replicateControl. The structure of
  524.  
  525. the control is as follows:
  526.  
  527. fullReplicaControl ::=SEQUENCE {
  528.     ControlType    1.2.840.113556.1.4.618
  529.     Criticality        BOOLEAN DEFAULT TRUE
  530.     ControlValue     INTEGER (1..2^64-1)
  531.  
  532. The fullReplicaControl controlValue is used by the source server on the
  533. first response message to indicate how many entries it will be sending.
  534. If the stream of entries is interrupted, the target server MUST flush
  535. the entries received so far and issue the fullReplicaControl control 
  536. again. When the source server sends the last entry, it must set the 
  537. ControlValue on the message to the correct highUpdateNumber so that 
  538. subsequent replication operations can retrieve only the data that has 
  539. been changed. 
  540.  
  541. 5: Mail transport
  542.  
  543. The other method of transporting replication data is by using an email 
  544. protocol. In this case, the target server mails the search command with
  545. the replicate extended control or the fullReplicaControl control to the
  546. source server, and then the source server mails the results of the 
  547. replication command back to the target server, in LDIF format as
  548. modified
  549. above [LDIF]. When the target server receives the changes, it processes 
  550. them as appropriate. The actual mail transport protocol used is not
  551. covered in this document; it needs to be established as a bilateral
  552. agreement between the two servers. The security on this transaction is
  553. enabled by the security of the underlying mail protocol chosen.
  554.  
  555. 6: Security Considerations
  556.  
  557. Replication requires secure connections and the ability to secure the
  558. change information stored in the directory. Securing the change 
  559. information is covered in [change]. Standard LDAP security should be 
  560. applied to the LDAP transmission of data. Standard mail security should
  561. be applied to the mail transmission of data. The information necessary
  562. to secure these connections will be stored as part of the URLs defining
  563. the connection points.
  564.  
  565. 7: References
  566.  
  567. [change] Good, Gordon, Definition of an Object Class to Hold LDAP Change
  568. Records, Internet Draft, July 1997. Available as draft-ietf-asid-
  569. changelog-01.txt
  570.  
  571. [LDIF] Good, Gordon, The LDAP Data Interchange Format (LDIF) -
  572. Technical Specification, Internet Draft, July 1997. Available as 
  573. draft-ietf-asid-ldif-02.txt.
  574.  
  575. [LSPA] Wahl, M. A Summary of the Pilot X.500 Schema for use in LDAPv3,
  576. Internet Draft, March 1997. Available as draft-ietf-asid-schema-
  577. pilot-00.txt
  578.  
  579. 8: Author's addresses
  580.  
  581. Chris Weider
  582. Cweider@microsoft.com
  583. 1 Microsoft Way
  584. Redmond, WA 98052
  585. +1-206-703-2947
  586.  
  587. John Strassner
  588. Johns@cisco.com
  589. 170 West Tasman Drive
  590. San Jose, CA 95134
  591. +1-408-527-1069
  592.  
  593.