TCP переплетается с 3 сервисами, которые могут иметь отношение (хорошо, TCP делает намного больше, но я собираюсь поговорить только о 3).
- Доставка по заказу
- Надежная доставка
- Контроль потока
Вы только что сказали, что вам не нужно управление потоком, поэтому я даже не буду об этом говорить (как вы будете рекламировать размер окна и т. Д., За исключением того, что вам, вероятно, понадобится окно. Я получу к нему.)
Вы сказали, что вам нужна надежная доставка. Это не так сложно - вы используете ACK, чтобы показать, что отправитель получил пакет. Базовая надежная доставка выглядит так:
- Отправитель отправляет пакет
- Получатель получает пакет, а затем отправляет подтверждение
- Если отправитель не получает подтверждение (посредством таймера), он повторно отправляет пакет.
Эти три шага не решают эти проблемы:
- Что делать, если ACK теряется?
- Что делать, если пакеты приходят не в порядке?
Итак, для вашего приложения вы сказали, что вам нужна только надежная доставка - но ничего не сказали о том, что они нужны для заказа. Это повлияет на способ реализации вашего протокола.
(пример, в котором порядок не имеет значения: вы копируете записи сотрудников с одного компьютера на другой. Не имеет значения, получена ли запись Алисы раньше, чем Боб, до тех пор, пока оба получат).
Итак, исходя из предположения, что вам нужен только надежный (поскольку это то, что вы сказали в своем посте), вы можете достичь этого несколькими способами.
Ваш отправитель может отслеживать неподтвержденные пакеты. Таким образом, если он отправляет 3, 4, 5 и 6 и не получает ACK для 3 и 4, то отправитель знает, что ему нужно повторить передачу. (Хотя отправитель не знает, были ли пакеты 3 и 4 большими или их ACK были потеряны. В любом случае, мы должны повторить передачу.)
Но тогда ваш отправитель может сделать кумулятивные ACK - поэтому в приведенном выше примере он получит подтверждение № 6 только при получении 3, 4 и 5. Это означает, что получатель отбросит пакет 6 если бы он не получил раньше. Если ваша сеть очень надежна, то это не плохой вариант.
Протоколы, описанные выше, однако, имеют окно - то есть, сколько пакетов отправитель отправляет одновременно? Это означает, что вам нужно какое-то окно, но не для управления потоком. Как вы будете передавать размеры окна?
Вы можете сделать это без окна, используя постоянный размер окна или сделав что-то вроде остановки и ожидания. Первый может быть лучшим вариантом.
В любом случае, я не ответил прямо на ваш вопрос, но я надеюсь, что указал на некоторые вещи, которые стоит учитывать при разработке этого. Задача «надежного переноса» без элементов управления потоком (например, окон) и без учета порядка очень трудна! (Дайте мне знать, если я расскажу больше об этом материале!)
Удачи!