According to the specification, the `MessageHeader` interpretation depends on whether the following submessage is an `ACKNACK` or a `HEARTBEAT` submessage.
In this case, the `sequenceNr` shall be interpreted as an epoch that may be used to discard the duplicate message.
This dichotomy allows us to save bandwidth but it has some drawbacks.
On the one hand, it prevents to send multiple `ACKNACK` and `HEARTBEAT` submessages, which refer to different streams, in a single message.
On the other hand, it obfuscates the message handling because it is not enough to read the `MessageHeader` in order to discard, process, or buffer the message into the stream, but it is necessary to read the first `SubmessageHeader`.
In order to avoid the aforementioned drawbacks, the following modifications are purposed:
1. Add a `stream_id` member to `ACKNACK` and `HEARTBEAT` submessages.
struct ACKNACK_Payload {
short first_unacked_seq_num;
octet[2] nack_bitmap;
octet stream_id;
}
struct HEARTBEAT_Payload {
short first_unacked_seq_nr;
short last_unacked_seq_nr;
octet stream_id;
}
2. Use the stream 0 (`STREAMID_NONE`) since `ACKNACK` and `HEARTBEAT` submessage do not belong to any stream, but they inform about the state of the streams.
This modification allows sending multiple `ACKNACK` and `HEARTBEAT` submessages in a single message and it simplifies the message handling.