home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / fido / ftsc_all.z43 / FSC-0044.001 < prev    next >
Text File  |  1990-04-01  |  29KB  |  564 lines

  1. Document: FSC-0044
  2. Version:  001
  3. Date:     04/01/90
  4.  
  5.  
  6.  
  7.  
  8.         An improved method of duplicate message detection and prevention
  9.                                   Jack Decker
  10.                                 1:154/8@Fidonet    
  11.  
  12.  
  13.  
  14.  
  15. Status of this document:
  16.  
  17.      This FSC suggests a proposed protocol for the FidoNet(r) community,
  18.      and requests discussion and suggestions for improvements.
  19.      Distribution of this document is subject to the restrictions stated
  20.      in the copyright paragraph below.
  21.  
  22.      Fido and FidoNet are registered marks of Tom Jennings and Fido
  23.      Software.
  24.  
  25.  
  26. Purpose:
  27.  
  28. The purpose of this document is to present a proposal for an improved method of
  29. duplicate message detection and prevention, that could eventually replace the
  30. existing PATH and SEEN-BY lines currently used within Fidonet.  The principal
  31. advantages of this method over previous schemes is that it is fully Zone-aware
  32. and Point-aware, and that it adds far fewer bytes to a message than the current
  33. combination of SEEN-BY and PATH lines.  It can also be run in parallel with
  34. existing SEEN-BY and PATH lines for an indefinite period, thus allowing a
  35. "transition period" of as long as is necessary for software to be converted.
  36.  
  37. Copyright:
  38.  
  39. This document is Copyright 1990 by Jack Decker.  However, permission is granted
  40. for any and all non-commercial use, providing the contents of this document are
  41. not altered in any way.  Also, permission is expressly granted for any use by
  42. developers of software primarily intended to be used in the Fidonet amateur
  43. communications network, or in any similar amateur communications network that
  44. primarily uses Fidonet technology and protocols, whether that software is
  45. commercial or not.
  46.  
  47. Comments on this proposal, and suggestions for improvement are welcomed by the
  48. author.  In particular, suggestions on how this proposal might be reworded to
  49. make the meaning clearer are especially welcome.
  50.  
  51.  
  52. A. Definition:
  53.  
  54. In this document the characters ^A (caret and capital A) will be used to
  55. represent a 0x01 (SOH) byte.  It will be most commonly used in reference to the
  56. "^APTH line", which will be a line that begins with a 0x01 byte immediately
  57. followed by the letters "PTH" (and then by additional data as specified below).
  58.  
  59.  
  60. B. Why a new method of duplicate message detection is needed:
  61.  
  62. Most of the methods of duplicate message detection currently used in Fidonet
  63. echomail processing operate by trying to find some distinguishing
  64. characteristic of an echomail message (whether it be something deliberately
  65. included in the message, such as an EID, MSGID, etc. type of "kludge line", or
  66. something which is contained in all echomail messages, such as the message
  67. header).  Typically, either the item being used for duplicate detection itself
  68. or a checksum of that item is then saved in a data file, and if another item
  69. comes in with that same distinguishing characteristic, the message is
  70. considered to be a duplicate message.  The data files used to store
  71. previously-seen message data can occupy a significant amount of disk space if
  72. many conferences are carried on a system.
  73.  
  74. Unfortunately, all such schemes seem to suffer from the drawback that under the
  75. proper circumstances, messages that are not duplicates of each other may be
  76. created with identifying characteristics that are similar enough to be falsely
  77. recognized as duplicates.  The circumstances under which this can happen may
  78. differ from method to method, but none are totally foolproof.  Thus, it's
  79. possible that messages may be deleted as duplicates even though in reality they
  80. are not duplicates, but rather they are simply messages that contain data that
  81. make them appear to be duplicates.
  82.  
  83. The most common cause of duplicate messages is improper echomail topology (also
  84. known as the infamous "dupe loop").  While there are certainly other ways that
  85. duplicates can be generated, improper topology is far and away the leading
  86. cause.  Further, many of the current duplicate elimination schemes will NOT
  87. catch most of the duplicates that are NOT generated as a result of improper
  88. topology (which is why duplicate messages are seen occasionally, even though
  89. duplicate message detection schemes are currently in use).
  90.  
  91. Unfortunately, if a duplicate killer is to be effective, it must store the
  92. identifying characteristics for the last several thousand messages that have
  93. passed through a particular system.  This not only uses up disk storage space,
  94. it consumes extra processing time during echomail processing, since each new
  95. arriving message must be compared to the data list in the attempt to determine
  96. if it is, indeed, a duplicate.
  97.  
  98. A better approach would be to store within a message itself data that
  99. identifies it as having already been received by a particular system, before
  100. sending it on to another system.  Then, if the same message came back to a
  101. given system in a "dupe loop", it would be possible to positively identify it
  102. as one that has already been seen on that particular system.  And, since the
  103. data necessary to identify the message as a duplicate is stored within the
  104. message itself, it is possible to use this method without the necessity of
  105. storing great amounts of data on previously-seen messages (in many
  106. implementations this alone would save 10K or more of disk space per conference
  107. carried!).
  108.  
  109. Were it not for the fact that the PATH line present in most echomail messages
  110. does not contain Zone or Point information, we could use it for that purpose.
  111. However, since it does not contain that information, it cannot and should not
  112. be used in that manner.  Another drawback of the PATH line is that because it
  113. is physically located at the end of a message (after the SEEN-BY lines), if
  114. only the last part of a message is scrambled or deleted, the PATH line
  115. information will be lost.
  116.  
  117.  
  118. C. Proposal:
  119.  
  120. 1) A new type of kludge line (commonly known within FIDONET as an "IFNA kludge
  121. line"), which combines certain characteristics of the existing PATH and SEEN-BY
  122. lines, will be placed into each echomail message.  This line, known as the
  123. ^APTH line, will be placed at the TOP of the message (not necessarily the first
  124. line, but prior to the body of the message text).  IMPORTANT: Support for the
  125. existing PATH and SEEN-BY lines will be retained as long as is necessary to
  126. accommodate everyone in Fidonet, but eventually the ^APTH line could possibly
  127. replace both the current PATH and SEEN-BY lines.
  128.  
  129. 2) The ^APTH line will contain full four-dimensional addressing
  130. (Zone:Net/Node.Point), BUT elements that are the same as the previous entry in
  131. the line need not be repeated.  When the "point" portion of an address stands
  132. alone, it shall be preceded by at least a "." character (to distinguish it from
  133. a node address).
  134.  
  135. 3) If a system is importing messages and finds a message with its own address
  136. already in the ^APTH line, it will discard the message (unless that address is
  137. in the very last position on the line... this allows for the odd situation
  138. where a point or another task on the same system has already inserted the
  139. system's address in the ^APTH line, or where it is desirable to process the
  140. same message a second time).
  141.  
  142. 4) One (and only one) non-numeric character may appear just AFTER any address
  143. on the ^APTH line.  When using the ^APTH for duplicate message checking only,
  144. you may just skip past any such address, unless it's your own address (see
  145. examples later in this document).  In that case, strip the address and the
  146. non-numeric character (in other words, if you see your own address but it's
  147. immediately followed by a non-numeric character, remove that address, add yours
  148. to the end of the ^APTH line, and toss the message anyway).  The reason for
  149. doing this is to allow the design of an echomail processor that doesn't rely on
  150. SEEN-BY's.  Such a processor could append a non-numeric character (such as a
  151. "!") to an address, in order to indicate that "this message hasn't really
  152. passed through this node, but don't send it back there" (which would be the
  153. equivalent of a SEEN-BY statement for that node, indicating that this message
  154. has already been sent to that node).  Thus the ^APTH line could eventually take
  155. the place of SEEN-BY lines, but you could still have a "fully coupled"
  156. triangular or rectangular topology.  In this case, you'd add the nodes that are
  157. part of that fully coupled topology to the ^APTH line BEFORE sending the
  158. message to them, but with the special character after the address.  The
  159. receiver would know that the message didn't really pass through that node yet,
  160. but it should NOT send it to that node under any circumstances.
  161.  
  162. (Please note that during the initial design of software to create ^APTH lines,
  163. you would not have to worry about generating the special case with the trailing
  164. non-numeric characters, you'd just have to be able to handle them as shown in
  165. the examples below above if you came across one).
  166.  
  167.  
  168. D. Specifications and examples:
  169.  
  170. The general specifications for a ^APTH line, and a general outline of how an
  171. incoming message might be processed follows.
  172.  
  173. A valid ^APTH line will contain at a minimum the string ^APTH followed by a
  174. single space character and the network address of the system that created the
  175. ^APTH line, in Zone:Net/Node[.Point] format, where ^A is a 0x01 byte (SOH) and
  176. the point address is required only if the system is a point (specifically, a
  177. system that is NOT a point should not .0).
  178.  
  179. Once again, the FIRST address specified in a ^APTH line is expected to contain,
  180. at a minimum, Zone, Net, and Node numbers.  If any of these are missing from
  181. the FIRST address, the line should be considered defective.  It will be left to
  182. the discretion of the software author as to how to handle a message with a
  183. defective ^APTH line.
  184.  
  185. Subsequent addresses in the ^APTH line are delimited by spaces and should
  186. contain only that information that is different from the previous entry on the
  187. line, except that when a bossnode receives a message from a point, then the
  188. bossnode should append its node number only.  Specific examples follow:
  189.  
  190.      a. If the Zone is the same as the previous address, but the net is
  191.         different, then only Net/Node[.Point] should be used.
  192.  
  193.      b. If the Zone and Net are the same as the previous address, but the
  194.         node is different, then only Node[.Point] should be used.
  195.  
  196.      c. If the Zone, Net, and Node are the same as the previous address,
  197.         but the point is different, then only .Point should be used.  Note
  198.         that in this case, the period is included.
  199.  
  200.      d. If the Zone, Net, and Node are the same as the previous address, but
  201.         the previous address contains a point specifier and the receiving
  202.         system is not a point (i.e., it IS the bossnode), then only Node
  203.         should be used.  .0 (point zero) might also be a valid entry in this
  204.         case, but only if the bossnode consistently identifies itself to other
  205.         systems using a full four-dimensional address.  For example, a message
  206.         that originated on 1:234/5.6 and went from there to 1:234/5 would
  207.         contain a ^APTH line in this format:
  208.                         ^APTH 1:234/5.6 5
  209.         If the bossnode is also considered to be point zero, then
  210.                         ^APTH 1:234/5.6 .0
  211.         Would be equally valid.
  212.  
  213. In the case of a "fully connected" topology, nodes may be added to the ^APTH
  214. line even though a message has not actually passed through those nodes, to
  215. prevent the message from being sent to those nodes.  Such nodes should have an
  216. exclamation point character ("!") appended to the end of the entry, immediately
  217. following the node or point number.  These nodes should be added to the very
  218. end of a new or existing ^APTH line, after the address of the node which added
  219. them.
  220.  
  221. For example, suppose that 157/200, 154/9, and 228/6 were in a "fully connected"
  222. topology.  When a message was received by 157/200 and then sent to 154/9 and
  223. 228/6, the ^APTH line might look something like this:
  224.  
  225.      ^APTH: 3:711/431.5 431 430 403 1:124/4210 4115 157/200 154/9! 228/6! 
  226.  
  227. When a message arrives on one of the nodes indicated by the exclamation point,
  228. the exclamation point entry should be removed, and the node should add itself
  229. to the end of the line in the normal manner.  For example, after the message
  230. containing the above ^APTH line were received at 154/9, it would be modified to
  231. read:
  232.  
  233.      ^APTH: 3:711/431.5 431 430 403 1:124/4210 4115 157/200 228/6! 154/9 
  234.  
  235. Please note that at the time of this proposal, the exclamation point (!) is the
  236. ONLY "officially recognized" non-numeric character that can be expected to be
  237. appended to a ^APTH line address, however, the possibility remains that someone
  238. may figure out a good reason to use a different trailing character for some
  239. other (but similar) purpose, so I am allowing for that possibility by using the
  240. generic terminology "non-numeric character" rather than the more specific
  241. "exclamation point" throughout this document.
  242.  
  243. The ^APTH line must be terminated with a carriage return and/or linefeed (a
  244. carriage return followed by a linefeed is preferred, and should be used by all
  245. systems capable of generating a carriage return/linefeed combination).
  246.  
  247. There is no specified limit on the length of a ^APTH line.  Each message should
  248. contain only one ^APTH line, even if it extends beyond the typical 80 column
  249. screen width.  The ^APTH line is primarily intended for use by the conference
  250. mail processing software, so primary consideration is being given to ease of
  251. processing the line, rather than making it easily human-readable (most software
  252. will not display kludge lines hidden behind a ^A character in any event).
  253.  
  254.  
  255. E. Pseudo-outline of message processing
  256.  
  257. Here is a suggested flow pseudo-outline showing one way that messages might be
  258. processed in a standalone program that runs between the import and export
  259. cycles of an existing conference mail processor such as ConfMail (this outline
  260. assumes that the standard Fido/Opus style *.msg files are used, though
  261. obviously that need not be the case):
  262.  
  263. 1.  Open *.msg file for input
  264.  
  265. 2.  Open temporary file for output
  266.  
  267. 3.  Copy header (first 190 bytes) from input to output file.  The following
  268.     operations begin immediately following this header.
  269.  
  270. 4.  Examine each line of input file (a line is delimited by a carriage return,
  271.     linefeed, or any combination thereof) for one of the following:
  272.  
  273.     a.  A blank line - Write to output and examine next line.
  274.  
  275.     b.  A line containing spaces only - Write to output and examine next line.
  276.  
  277.     c.  A line that begins with a 01 byte (SOH) - GoTo 5.
  278.  
  279.     d.  A line that does not meet any of the above specifications.
  280.  
  281.         I.   Create a line containing the string ^APTH followed by a single
  282.              space character and your network address, in Zone:Net/Node[.Point]
  283.              format, where ^A is a 0x01 byte (SOH) and the point address is
  284.              required only if you are a point (specifically, a system that is
  285.              NOT a point should not necessarily use .0).  This line should be
  286.              terminated with a carriage return and/or linefeed (a carriage
  287.              return followed by a linefeed is preferred).
  288.  
  289.         II.  Write the line created in 4.d.I. to the output file.
  290.  
  291.         III. Write the line input in 4. to the output file.
  292.  
  293.         IV.  Goto 9.
  294.  
  295. 5.  If a line begins with a 0x01 (SOH) byte, examine the keyword immediately
  296.     following it.
  297.  
  298.     a.  If the keyword is NOT "PTH", write the entire line to output and
  299.         examine the next line (go back to 4).
  300.  
  301. 6.  If a line begins with ^APTH, examine each address in the line in turn.
  302.     Addresses start immediately following the characters "PTH " (note the
  303.     space).
  304.  
  305.     a.  The FIRST address is expected to contain, at a minimum, Zone, Net,
  306.         and Node numbers.  If any of these are missing from the FIRST address,
  307.         the line should be considered defective.  It will be left to the
  308.         discretion of the software author as to how to handle a message with a
  309.         defective ^APTH line.
  310.  
  311.     b.  As each address is found, any Zone, Net, and Node numbers found should
  312.         be stored in temporary variables, to be used as defaults for subsequent
  313.         addresses when only a partial address is given.  For example, the first
  314.         address will contain a Zone number.  This should be stored in a
  315.         temporary variable and used as the default Zone for all subsequent
  316.         addresses, until and unless another Zone number is seen in the line, at
  317.         which time that Zone number should be stored in the temporary variable
  318.         and used as the default Zone.
  319.  
  320. 7. As each address is found, it should be compared against the system's
  321.    address.  If a match is found:
  322.  
  323.      a. Check to make sure that the address is not a point address if the
  324.         system's address does not contain a point specifier.  If the system's
  325.         address is given without a point specifier, then it should not be
  326.         considered a match if ANY point address is found in the ^APTH line
  327.         address that is being compared (not even .0 - for example, if the
  328.         address 1:234/5.0 is seen in the ^APTH line, and 1:234/5 is the given
  329.         system address, then it is NOT a match).
  330.  
  331.      b. If the address does match exactly, check to see if a non-numeric
  332.         character (specifically the "!" character) immediately follows the
  333.         address.  If it does, then that address must be removed from the
  334.         line at that point.
  335.  
  336.         I.   When removing an address, please make sure that you do not change
  337.              the address of subsequent entries.  This may require modification
  338.              of the next entry on the line, if one exists.  For example,
  339.              suppose you had a "fully connected" topology where 1:157/200 sent
  340.              an echo to both 1:154/9 and 1:154/970. The ^APTH line might end
  341.              as follows:
  342.                              ..... 157/200 154/9! 970!
  343.              However, after modification of the ^APTH line, it should read:
  344.                              ..... 157/200 154/970! 9
  345.              You can see that if 154/9 were simply deleted without regard to
  346.              what follows on the line, the following (incorrect) line might
  347.              result:
  348.                              ..... 157/200 970! 154/9  (THIS IS INCORRECT)
  349.              The above is incorrect because 154/970 has been transformed into
  350.              157/970.
  351.  
  352.         II.  After removing an address followed by a non-numeric character,
  353.              continue to scan any remaining addresses in the ^APTH line in
  354.              case a match is found later in the line.  If no other matches
  355.              are found, proceed as if no match had been found.  Goto 8.
  356.  
  357.      c.  Check to see if the address is the last one on the line (not counting
  358.          addresses that have a non-numeric character immediately following
  359.          them).  If this address is followed only by the end of the line, or
  360.          ONLY by addresses that have a non-numeric trailing character, then
  361.          there is a very high probability that we have either inadvertently
  362.          or deliberately processed this message twice, and it is not really a
  363.          duplicate.  In this case, the original *.msg file should be left
  364.          untouched.
  365.  
  366.          I.   Close both the input and output files.
  367.  
  368.          II.  Delete the temporary output file.  END.
  369.  
  370.      d.  If a match is found, and it is not followed by a non-numeric
  371.          character, and it is not the last address on the ^APTH line, then the
  372.          message is a duplicate message and should be treated as such (either
  373.          by deleting it, or moving it to a "bad messages" area or the netmail
  374.          area).
  375.  
  376.          I.   Close both the input and output files.
  377.  
  378.          II.  Delete the temporary output file.
  379.  
  380.          III. Either delete or move the original .msg input file, as
  381.               appropriate.  END.
  382.  
  383. 8.  If the end of the ^APTH line is reached and a match has not been found,
  384.     then add the system's address to the end of the ^APTH line.  Then write
  385.     the modified ^APTH line to the output file.
  386.  
  387.          I.   If one or more addresses with an appended non-numeric character
  388.               (used within "fully-coupled" topologies) are to be added to the
  389.               ^APTH line, they should be added at the very end of the line,
  390.               after the address of the system currently processing the
  391.               message).
  392.  
  393. 9.  Copy the remainder of the input file to the output file.  Close both files.
  394.  
  395. 10. Delete the input file.
  396.  
  397. 11. Rename the temporary output filename to the old input filename.  END.
  398.  
  399. [End of outline]
  400.  
  401.  
  402. F.  Additional notes and clarifications:
  403.  
  404. Note 1:  In section 7.b.I. I mentioned the necessity of not simply deleting a
  405. node from the ^APTH line without checking to see if the next address in the
  406. ^APTH line needs to be modified.  This can easily be accomplished if TWO sets
  407. of temporary variables are kept, for the CURRENT and PREVIOUS Zone, Net, and
  408. Node values (Point addresses are NOT kept as defaults, thus there is no need to
  409. store Point information).  When reading the FIRST address in the ^APTH line,
  410. the Zone, Net, and Node numbers of that address would be stored in both the
  411. CURRENT and PREVIOUS variables.  Thereafter, whenever a new Zone, Net, or Node
  412. number is explicitly specified in a ^APTH line address, the new value(s) are
  413. stored in the CURRENT variables, but first the CURRENT values are moved to the
  414. PREVIOUS values.
  415.  
  416. To help visualize this, let's again suppose we have a ^APTH line that ends as
  417. follows (all of these addresses are in Zone 1):
  418.  
  419.      ..... 157/200 154/9! 970!
  420.  
  421. Let's suppose that we are processing this message on 154/9, and will need to
  422. remove the 154/9! address.  When we encounter 157/200, our variables will be
  423. set as follows:
  424.  
  425.       Previous | Current
  426. Zone     1     |    1
  427. Net      ?     |   157
  428. Node     ?     |   200
  429.  
  430. Now, when we read 154/9, our current values will be moved to the previous:
  431.  
  432.       Previous | Current
  433. Zone     1     |    1
  434. Net     157    |   154
  435. Node    200    |    9
  436.  
  437. We now have the data we need to determine what needs to be added to the next
  438. address, after we delete 154/9.  In this case, we need only compare the
  439. Previous and Current addresses to determine which are UNEQUAL.  In this case,
  440. the Zone is the same, but the Net and Node are not.  So, if the following
  441. address lacks either the Net or Node, we'll have to add those.  Now we delete
  442. the 154/9! and look at the next address, 970.  At this point our variables will
  443. look like this:
  444.  
  445.       Previous | Current
  446. Zone     1     |    1
  447. Net     154    |   154
  448. Node     9     |   970
  449.  
  450. Again, we compare to see which addresses are UNEQUAL.  In this case, only the
  451. NODE address is.  So we know we do NOT have to add the NODE address, nor do we
  452. have to add the Zone address (because it was not different on the first
  453. compare).  We only need add those address components which were unequal on the
  454. first compare, but equal on the second compare.  So, in this case, the Net
  455. address must be added to the next address in the ^APTH line, leaving as a
  456. result:
  457.  
  458.      ..... 157/200 154/970!
  459.  
  460. The current system address is then added back in at the end of the line, thus:
  461.  
  462.      ..... 157/200 154/970! 9
  463.  
  464.  
  465. Note 2:  In section 4.d it is suggested that, when a line that is neither blank
  466. nor a kludge line (that begins with a ^A character) is found, a ^APTH line be
  467. added at that point.  However, there are reports that under certain
  468. circumstances (particularly when messages are "forwarded" or "hurled"), certain
  469. software may insert a non-kludge line prior to previously-existing kludge lines
  470. in a message.  It should be recognized by software authors that a non-kludge
  471. line should NEVER be inserted in front of existing kludge lines located at the
  472. start of a message, if those kludge lines are still valid (and if they are NOT
  473. still valid, they should be removed.  When a message is forwarded or hurled, it
  474. is probably desirable to remove duplicate control information since what is
  475. essentially happening is that the text of a previous message is being inserted
  476. into a NEW message.  Since the message is new, the "old" duplicate control
  477. information is no longer valid).
  478.  
  479. Software authors that are implementing the ^APTH line in their software should
  480. never search beyond the first text line of a message for the ^APTH line,
  481. because if one is found later in the text, it is in all probability an old
  482. ^APTH line that was inadvertently copied over from another message, and is not
  483. relevant to the current message.
  484.  
  485.  
  486. Note 3:  This is an optional suggestion, for use during the transition period
  487. in which the ^APTH line has to coexist with more traditional PATH and SEEN-BY
  488. lines.  If ^APTH line checking is being used during the import phase of
  489. echomail processing in a conference mail processor, it might be a good idea to
  490. optionally check to make sure that all ^APTH line addresses that are in the
  491. system's home Zone (including those with an appended non-numeric character)
  492. have been properly included in the SEEN-BY lines, and to add any that have not
  493. been so included.  It should be obvious that ^APTH line addresses that are NOT
  494. in the system's home Zone should NOT be added to the SEEN-BY lines.  If this
  495. feature is implemented, it may be a good idea to give the sysop the ability to
  496. enable or disable it by means of a command line switch or a configuration file
  497. option.
  498.  
  499.  
  500. Note 4:  If nodes with trailing non-numeric characters are inserted into a
  501. ^APTH line for the purpose of indicating "SEEN-BY" nodes in a fully coupled
  502. topology, it is permissible (but not required) to include those nodes ONLY in
  503. the ^APTH lines of messages actually exported to the nodes participating in the
  504. circular topology.  In other words, it's permissible to add such nodes to the
  505. ^APTH lines of messages during the import cycle, in which case messages with
  506. ^APTH lines containing the added nodes would be exported to all nodes.
  507. However, it's also permissible to add those nodes to the ^APTH line during the
  508. export cycle, including them only in the ^APTH lines of the nodes that need to
  509. see them.  Please keep in mind that such nodes are added only to the END of the
  510. ^APTH line, AFTER the address of the system processing the message.  In any
  511. event, it's up to the software author to implement this feature in such a
  512. manner that duplicates will not be created.
  513.  
  514. Similarly, if a node RECEIVES a message containing a ^APTH line that lists
  515. nodes with trailing non-numeric characters, it is permissible to remove those
  516. nodes from the ^APTH line if it can be positively ascertained that they are no
  517. longer required.  Generally speaking, this should NOT be done unless there is
  518. absolutely NO possibility of the message being exported to one of the nodes in
  519. question.  Note that in most situations, if a ^APTH line contains a node with a
  520. trailing non-numeric character, but it is followed by a node number (other than
  521. your own) that does NOT have a trailing non-numeric character (that is, the
  522. node with the trailing non-numeric character is not one of the last nodes on
  523. the line), then it can usually be safely removed since it will have already
  524. "passed through" the fully-coupled topology.
  525.  
  526. Using the previous example of 157/200, 154/9, and 154/970 participating in a
  527. fully-coupled topology, the ^APTH line as received at 154/9 and 154/970 might
  528. end as follows:
  529.  
  530.      ..... 157/200 154/9! 970!
  531.  
  532. However, please note that if 157/200 also feeds other nodes that are NOT part
  533. of this particular fully coupled topology, there is not real reason they would
  534. have to see the "154/9! 970!" at the end of the line.  However, there is no
  535. prohibition against including those nodes in the ^APTH lines of messages
  536. exported to other nodes.
  537.  
  538. Once this example message arrives at 154/9, the ^APTH line would be changed to
  539. look like this:
  540.  
  541.      ..... 157/200 154/970! 9
  542.  
  543. Now, when this message is exported from 154/9 to another node (154/111 for
  544. example), that node may remove the "154/970!" as long as 154/9 remains in the
  545. ^APTH line, since as long as the message cannot be sent back to 154/9, it
  546. cannot re-enter the fully-coupled topology.  The ^APTH line at this point
  547. (after the message is received on 154/111) might look like this:
  548.  
  549.      ..... 157/200 154/9 111
  550.  
  551. It would probably not be advisable to remove the "154/970!" at 154/9 in this
  552. example, even if the message has already been exported, because the message
  553. might need to be re-exported (such as when a new board picks up an echo feed).
  554.  
  555. When in doubt, nodes with trailing non-numeric characters (other than your own)
  556. should be left in the ^APTH line.  While there is a cost of a few extra bytes
  557. per message if you leave them in, it does not compare to the cost of the
  558. duplicate messages that could be generated if they are removed
  559. indiscriminately.
  560.  
  561. Jack Decker
  562. April 1, 1990
  563.  
  564.