A.3. Очистка состояния
Некоторые из пакетов от HC-Sender будут включать номера подтверждений, которые подтверждают подтверждения HC-Receiver. При получении такого подтверждения HC-Receiver находит запись R с соответствующим значением ack_seqno и выполняет следующие операции:
Если значение run length в байте R.ack_ptr byte превышает R.ack_runlen, значение run length уменьшается на R.ack_runlen + 1 и устанавливается buf_tail = R.ack_ptr; иначе устанавливается buf_tail = R.ack_ptr + 1.
Если R.ack_nonce = 1, меняется значение бита buf_nonce и ack_nonce для всех последующих записей о подтверждениях.
Удаляется запись R и все предшествующие ей записи.
(HC-Receiver может сохранять часть старой информации на случай получения пакетов, считавшихся потерянными).
Предположим, что получатель HC-Receiver, сохраняющий Example Buffer, уже передал 2 подтверждения:
- 1. ack_seqno = 59, ack_runlen = 1, ack_ackno = 3, ack_nonce = 1.
- 2. ack_seqno = 60, ack_runlen = 0, ack_ackno = 10, ack_nonce = 0.
Далее предположим, что HC-Receiver получает от HC-Sender пакет DCCPDataAck с Acknowledgement Number 59. Этот пакет говорит получателю HCReceiver, что отправитель HC-Sender принял и обработало всю информацию из пакета от HC-Receiver с номером 59. Этот пакет подтверждает полученный от HC-Sender пакет 3 и HC-Sender имеет от HC-Receiver подтверждения для пакетов 0, 1, 2 и 3. Вид буфера Example Buffer показан на рисунке:
+------------------*+ * * 10 |0,0|3,0|3,0|3,0|0,2| 4 BN[0] +------------------*+ * *
Значение run length для «хвостового» байта было изменено, поскольку пакет 3 был учтен в этом байте. Поскольку значение R.ack_nonce было равно 1, значение бита buf_nonce изменяется, как и значения битов ack_nonce для последующих подтверждений (в данном случае запись HC-Receiver Ack 60 не показана; для нее значение ack_nonce меняется на 1). HC-Receiver может также удалить сохраненную информацию для HC-Receiver Ack 59 и всех предшествующих подтверждений.
Осторожная реализация может предпринять попытку обеспечения разумной устойчивости к смене порядка доставки. Воспользуемся снова примером Example Buffer, предположив, что пакет 9 приходит с нарушениям порядка доставки. Вид буфера для этого случая показан на рисунке:
+----*----------------------+ 10 |0,0|0,0|3,0|3,0|0,4|1,0|0,0| 0 BN[1] +----*----------------------+
Опасность заключается в том, что HC-Sender может подтвердить предыдущее подтверждение от HC-Receiver (номер 60), которое говорит о том, что пакет 9 не был получен, до того, как HC-Receiver получит шанс на передачу нового подтверждения, указывающего получение пакета 9. Следовательно, по получении пакета 9 HC-Receiver может изменить подтверждающую запись, как показано ниже:
- ack_seqno = 59, ack_ackno = 3, ack_nonce = 1.
- ack_seqno = 60, ack_ackno = 3, ack_nonce = 1.
Т. е., пакет Ack 60 сейчас трактуется подобно дубликату пакета Ack 59. Это будет предотвращать перемещение хвоста буфера за пакет 9, пока HC-Receiver не узнает, что полусоединение HC-Sender увидело вектор Ack Vector, показывающий доставку пакета.