Я сделал это на C, но общие идеи: вам нужно отслеживать порядковые номера TCP (для каждого сеанса TCP есть два потока: один от клиента к серверу, другой - от сервера к клиенту). Это немного сложно.
Для каждого потока у вас есть указатель для отслеживания последовательных порядковых номеров, отправленных до сих пор, и использовать связанный список для отслеживания пар (порядковый номер + длина данных), которые имеют пробел к указателю. Каждый раз, когда вы видите новый поток данных в потоке, вы либо обновляете указатель, либо добавляете в связанный список. Обратите внимание, что после обновления указателя вы должны проверить, закрыт ли связанный список, закрыты ли какие-либо промежутки. Таким образом вы можете передать повторно переданные пакеты данных.
Надеюсь, что это поможет. Удачи.