Как я писал свой TCP на чистом Си: надежный протокол доставки данных поверх UDP
A developer built a reliable data delivery protocol over UDP in pure C. The implementation uses a sliding window, SACK, and checksum. The write-up also examines why the network unexpectedly became faster when packet loss occurred. It starts from the common distinction that TCP is reliable but slow and UDP is fast but unreliable, and goes deeper into what happens under the hood.
История о том, как реализовать надежный протокол поверх ненадежного UDP: скользящее окно, SACK, чексумма и почему при потерях сеть внезапно заработала быстрее Зачем вообще писать свой RDT-протокол? Каждый джун знает, что TCP у нас «надежный, но медленный», а UDP — «быстрый, но ненадежный». Но это очень поверхностные знания, которые не раскрывают всего масштаба происходящего под капотом. И как раз недавно я задался вопросом: а почему бы не попытаться повторить TCP? Амбициозная цель: приблизить своё детище к работе TCP, поработить мир и захватить умы человечества, объединив всех в единый организм… Кхм, ну что-то типа того. Получилось ли у меня? Захватить мир — пока нет, а вот добиться надежной доставки данных через ненадежную сеть с потерями, порчей данных, дублированием, задержками и так далее — более чем. Так что хочу рассказать свою историю о том, как я писал это чудо, с чего начинал, с какими проблемами столкнулся и как пришел к рабочему варианту протокола: с поддержкой скользящего окна, SACK, таймаутов, флагов и прочих прелестей, которые я подглядел в архитектуре TCP. Протокол прошел краш-тест с 30% потерь в сети и смог передать данные байт-в-байт, правда, с нюансами, о которых расскажу дальше :) Читать далее