6.3.3 The Example as a Finite State Machine
Writing a transport entity is difficult and exacting work,
especially for more realistic protocols. To reduce the chance of making an
error, it is often useful to represent the state of the protocol as a finite
state machine.
We have already seen that our example protocol has seven states
per connection. It is also possible to isolate 12 events that can move a
connection from one state to another. Five of these events are the five service
primitives. Another six are the arrivals of the six legal packet types. The last
one is the expiration of the timer. Figure
6-21 shows the main protocol actions in matrix form. The columns are the
states and the rows are the 12 events.
Figure 6-21. The example protocol as a finite state machine. Each entry has an optional predicate, an optional action, and the new state. The tilde indicates that no major action is taken. An overbar above a predicate indicates the negation of the predicate. Blank entries correspond to impossible or invalid events.
Each entry in the matrix (i.e., the finite state machine) of Fig. 6-21 has up to three fields: a
predicate, an action, and a new state. The predicate indicates under which
conditions the action is taken. For example, in the upper-left entry, if a
LISTEN is executed and there is no more table space (predicate P1), the LISTEN fails and the state does not change. On
the other hand, if a CALL REQUEST packet has already arrived for the transport
address being listened to (predicate P2), the
connection is established immediately. Another possibility is that P2 is false, that is, no CALL REQUEST has come in, in
which case the connection remains in the IDLE
state, awaiting a CALL REQUEST packet.
It is worth pointing out that the choice of states to use in
the matrix is not entirely fixed by the protocol itself. In this example, there
is no state LISTENING, which might have been a
reasonable thing to have following a LISTEN. There is no LISTENING state because a state is associated with a
connection record entry, and no connection record is created by LISTEN. Why not?
Because we have decided to use the network layer virtual circuit numbers as the
connection identifiers, and for a LISTEN, the virtual circuit number is
ultimately chosen by the network layer when the CALL REQUEST packet arrives.
The actions A1 through A12 are the major actions, such as sending packets and
starting timers. Not all the minor actions, such as initializing the fields of a
connection record, are listed. If an action involves waking up a sleeping
process, the actions following the wakeup also count. For example, if a CALL
REQUEST packet comes in and a process was asleep waiting for it, the
transmission of the CALL ACCEPT packet following the wakeup counts as part of
the action for CALL REQUEST. After each action is performed, the connection may
move to a new state, as shown in Fig.
6-21.
The advantage of representing the protocol as a matrix is
threefold. First, in this form it is much easier for the programmer to
systematically check each combination of state and event to see if an action is
required. In production implementations, some of the combinations would be used
for error handling. In Fig. 6-21 no
distinction is made between impossible situations and illegal ones. For example,
if a connection is in waiting state, the
DISCONNECT event is impossible because the user is blocked and cannot execute
any primitives at all. On the other hand, in sending state, data packets are not expected because no
credit has been issued. The arrival of a data packet is a protocol error.
The second advantage of the matrix representation of the
protocol is in implementing it. One could envision a two-dimensional array in
which element a[i][j ] was a pointer or
index to the procedure that handled the occurrence of event i when in state j. One
possible implementation is to write the transport entity as a short loop,
waiting for an event at the top of the loop. When an event happens, the relevant
connection is located and its state is extracted. With the event and state now
known, the transport entity just indexes into the array a and calls the proper procedure. This approach gives a
much more regular and systematic design than our transport entity.
The third advantage of the finite state machine approach is for
protocol description. In some standards documents, the protocols are given as
finite state machines of the type of Fig.
6-21. Going from this kind of description to a working transport entity is
much easier if the transport entity is also driven by a finite state machine
based on the one in the standard.
The primary disadvantage of the finite state machine approach
is that it may be more difficult to understand than the straight programming
example we used initially. However, this problem may be partially solved by
drawing the finite state machine as a graph, as is done in Fig. 6-22.
No comments:
Post a Comment
silahkan membaca dan berkomentar