SP AM provides reliable, ordered delivery of messages. The design is optimized for a lossless SP switch behavior given that the switch is highly reliable. Because packets can still be lost due to input buffer overflows, flow control and fast retransmission have proved essential in attaining reliable delivery without harming the performance of the layer.
Sequence numbers are used to keep track of packet losses and a sliding window is used for flow control; unacknowledged messages are saved by the sender for retransmissions. When a message with the wrong sequence number is received, it is dropped and a negative acknowledgement is returned to the sender forcing a retransmission of the missing as well as subsequent packets. Acknowledgements are piggybacked onto requests and replies whenever possible; otherwise explicit acknowledgements are issued when one-quarter of the window remains unacknowledged.
During a bulk transfer, data is divided into chunks of 8064
bytes. Packets making up a chunk
carry the same sequence number, and the window slides by the number of
packets in a chunk; address offsets are used to order packets within a
chunk and each chunk requires only one acknowledgment.
Figure 2 illustrates the flow-control protocol. The
transmission of chunks is pipelined such that chunk N is sent after an
ack for chunk N-2 has been received (but typically before an ack for
chunk N-1 arrives). The overhead for sending a chunk (175
s) is
higher than one round-trip which ensures that the pipeline remains
filled. Note that with this chunk protocol, there is virtually no
distinction between blocking and non-blocking stores for very large
transfer sizes.
Figure 2: Flow-Control Protocol: initially, two chunks are
transmitted and the next chunk is sent only when the previous to
last chunk is acknowledged
Although a chunk of 36 packets slightly exceeds half the size of the receive FIFO (64 packets per active node), the sender is unlikely to overflow the receive FIFO in practice. Given the flow control scheme, the window size must be at least twice as large as a chunk (72 packets). To accommodate start-up request messages, the window size is chosen to be 75 packets for requests and 76 for replies.
A keep-alive protocol is triggered when messages remain
unacknowledged for a long period of time. This
protocol forces negative acknowledgements to be issued to the protocol
initiator, causing the retransmission of any lost messages.