summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc143.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc143.txt')
-rw-r--r--doc/rfc/rfc143.txt227
1 files changed, 227 insertions, 0 deletions
diff --git a/doc/rfc/rfc143.txt b/doc/rfc/rfc143.txt
new file mode 100644
index 0000000..e215603
--- /dev/null
+++ b/doc/rfc/rfc143.txt
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+Network Working Group W. Naylor
+Request for Comments #143 J. Wong
+NIC #6728 C. Kline
+Categories: D.1, D.3 J. Postel
+Obsoletes: None UCLA - NMC
+Updates: 123, 145 3 May 1971
+
+ Regarding Proferred Official ICP
+
+We should like to comment on a race condition discovered in the ICP as
+proposed in NWG/RFC #123. The problem arises when the server attempts
+to initiate a second connection to the user's receive socket and the
+first connection is not yet closed. Using a similar notation to that of
+NWG/RFC #123 the following table illustrates the sequence of events in
+the proferred and proposed ICP. The last two columns indicate which
+actions must be completed before the current action may be initiated.
+User and Server are third level programs, and UNCP and SNCP are the
+users NCP and Servers NCP respectively. Allocates have not been
+included since they add nothing to the argument.
+
+ Required Predecessors
+ ---------------------
+Reference # Action Initiator "Proferred" Proposed
+----------- ------ --------- ----------- --------
+ 1 Listen(L,32) Server -- --
+
+ 2 Init(U,L,32) User -- --
+
+ 3 RTS(U,L,'l') UNCP 2 2
+
+ 4 STR(L,U,32) SNCP 1 and 3 1 and 3
+
+ 5 Send(L,S) Server 4 4
+
+ 6 SEND('l',S) SNCP 5 5
+
+ 7 RECEIVE('l',S) UNCP 6 6
+
+ 8 Receive(U,S) User 7 7
+
+ 9 Close(L) Server 5 5
+
+ 10 CLS(L,U) SNCP 9 and 7 9 and 7
+
+ 11 Close(U) User 8 not used
+
+ 12 CLS(U,L) UNCP 11 10
+
+
+
+
+ [Page 1]
+
+NWG Regarding Proferred Official ICP RFC 143
+
+
+ Required Predecessors
+ ---------------------
+Reference # Action Initiator "Proferred" Proposed
+----------- ------ --------- ----------- --------
+
+ 13 Init(S,U+1,B ) Server 9 9
+ u
+
+ 14 RTS(S,U+1,'l' ) SNCP 13 13
+ 2
+
+ 15 Init(S+1,U,B ) Server 13 14 and 18
+ s
+
+ 16 STR(S+1,U,B ) SNCP 15 15
+ s
+
+ 17 Init(U+1,S,B ) User 11 12
+ u
+
+ 18 STR(U+1,S,B ) UNCP 17 17
+ u
+
+ 19 Init(U,S+1,B ) User 17 17
+ s
+
+ 20 RTS(U,S+1,'l' ) UNCP 19 19
+ 3
+
+Note that in the Proferred Order column, 16 can occur before 12 in which
+case UNCP would find socket U in use and probably return a CLS (U,S+1).
+The Server would probably then assume the User was finished with the
+conversation.
+
+The above problem is resolved by eliminating the Close from one side and
+causing that side to wait for the CLS from the other side before doing
+an Init. We propose that eliminating the user's Close (U) is the best
+solution. (The user NCP must of course return a CLS in response to the
+CLS sent by the server NCP).
+
+The Server's Close (L) leads more quickly to the reuse of socket L thus
+the serving of another user.
+
+
+
+
+
+
+
+
+
+ [Page 2]
+
+NWG Regarding Proferred Official ICP RFC 143
+
+
+To clarify the above discussion which may seem confusing at first
+glance, let us demonstrate the problem in the language of RFC #123.
+
+ Server User
+ ------ ----
+ (S1) Listen(L,32) (U1) Init(U,L,32)
+
+ (S2) [Wait for match] (U2)
+
+ (S3) Send(L,S) (U3) Receive(U,S)
+
+ (S4) Close(L) (U4) Close(U)
+
+ (S5) Init(S,U+1,B ) (U5) Init(U+1,S,B )
+ u u
+
+ (S6) Init(S+1,U,B ) (U6) Init(U,S+1,B )
+ s s
+
+Notice that since server and user are independent (probably in different
+hosts), server could execute (S6) before user executes (U4) and could
+receive an error back from user's NCP that socket U is busy. Similarly,
+user could execute (U6) before server executes (S4) and could receive an
+error back from his own NCP that socket U is not yet closed (assuming an
+implementation where sockets are kept busy until a CLS match).
+
+Various modifications could be made to ICP to solve this problem. We
+propose the following ICP:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [Page 3]
+
+NWG Regarding Proferred Official ICP RFC 143
+
+
+ Server User
+ ------ ----
+ Listen(L,32) Init(U,L,32)
+
+ [Wait for match]
+
+ Send(L,S) Receive(U,S)
+
+ Close(L) [Wait for CLS]
+
+ Init(S,U+1,B ) Init(U+1,S,B )
+ u u
+
+ [Wait for match] Init(U,S+1,B )
+ s
+
+ Init(S+1,U,B )
+ s
+
+This ICP assumes the following:
+
+1. The user can inquire or is notified of the fact that one of his
+ connections has been closed.
+
+2. The server can inquire or is notified that a connection for which
+ he has done an Init (or Listen) is now open.
+
+Both of the above seem basic to any NCP - user interface.
+
+This race condition problem would not exist had the dynamic reconnection
+features of RFC #36 been included in the NCP protocol and had dynamic
+reconnection been used in this ICP.
+
+
+ [ This RFC was put into machine readable form for entry ]
+ [ into the online RFC archives by Walter Pienciak 1/98 ]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [Page 4]
+