At the packet level, a simple throttling protocol is setup to limit the amount of buffering required and to prevent fast senders from affecting the message flow of other processes sharing the channel. This creates process-pair virtual channels. The number of virtual channels mapped onto a single channel is not fixed and can change according to the application's behavior. The communication agents are expected to handle the resulting change in buffering requirement. At startup time, two packet protocol values are negotiated:
For each process-pair, the source maintains a packets-sent counter and the destination maintains a packets-received counter. The destination process sends a protocol ACK to the source process for every IMPI_Pk_ackmark packets it receives from that source. This decrements the source's counter by IMPI_Pk_ackmark. When the source's counter reaches the IMPI_Pk_hiwater value, it refrains from sending more packets to that destination until an ACK is received from it. The transfer of protocol ACK packets does not modify the value of the counters. The implementation is expected to provide sufficient buffering to receive the protocol ACK packets and to expedite their processing.