TLDR;
- TCP - потоково-ориентированный, требует подключения, надежный, медленный
- UDP - ориентированный на сообщения, без установления соединения, ненадежный, быстрый
Прежде чем мы начнем, помните, что все недостатки чего-либо являются продолжением его преимуществ . Там только правильный инструмент для работы, без панацеи. TCP / UDP сосуществуют на протяжении десятилетий, и не без причины.
TCP
Это было разработано, чтобы быть чрезвычайно надежным, и это делает свою работу очень хорошо. Это так сложно, потому что выполняет сложную задачу: обеспечение надежного транспорта по ненадежному протоколу IP.
Поскольку вся сложная логика TCP инкапсулирована в сетевой стек, вы свободны от множества трудоемких, подверженных ошибкам низкоуровневых вещей на уровне приложений.
Когда вы отправляете данные по TCP, вы записываете поток байтов в сокет у отправителя, где они разбиваются на пакеты, передаются по стеку и отправляются по проводам. На стороне получателя пакеты снова собираются в непрерывный поток байтов.
Поддержание этой хорошей абстракции имеет стоимость с точки зрения сложности и производительности. Если 1-й пакет из потока байтов потерян, получатель задержит обработку последующих пакетов, даже если они уже получены.
Кроме того, чтобы быть надежным, TCP реализует это:
- TCP требует установленного соединения, которое требует 3 приема-передачи («печально известное» трехстороннее рукопожатие).
- TCP имеет функцию, называемую «медленный запуск», когда он постепенно увеличивает скорость передачи после установления соединения, чтобы позволить получателю не отставать от данных.
- Каждый отправленный пакет должен быть подтвержден, иначе отправитель перестанет отправлять больше данных.
- И так далее, и так далее ...
Все это усугубляется в медленных ненадежных беспроводных сетях, в то время как TCP был разработан для проводных сетей, где задержки предсказуемы, а потеря пакетов встречается не так часто. Кроме того, как уже упоминалось, для некоторых вещей TCP просто не работает вообще (DHCP). Однако, где это уместно, TCP по-прежнему работает исключительно хорошо.
Используя почтовую аналогию, сеанс TCP подобен рассказу истории вашему секретарю, который разбивает ее на почту и отправляет через дерьмовую почтовую службу издателю. С другой стороны, другой секретарь собирает письма в один фрагмент текста. Некоторые письма теряются, другие - испорчены, поэтому для надежной доставки требуется очень сложная процедура, и ваша 10-страничная история может занять много времени, чтобы добраться до вашего издателя.
UDP
UDP, с другой стороны, ориентирован на сообщения, поэтому получатель записывает сообщение (пакет) в сокет, а затем передает его получателю как есть, без разделения / сборки.
По сравнению с TCP его спецификация очень проста. По сути, все, что он делает для вас - это добавляет контрольную сумму к пакету, чтобы получатель мог обнаружить ее повреждение. Все остальное должно быть реализовано вами, разработчиком программного обеспечения. Теперь прочитайте обширную спецификацию TCP и попробуйте подумать о повторной реализации некоторых ее частей.
Некоторые пошли по этому пути и получили очень приличные результаты, вплоть до того, что HTTP / 3 использует QUIC - протокол, основанный на UDP. Тем не менее, это скорее исключение. Обычными приложениями UDP являются приложения для потоковой передачи аудио и видео, такие как Skype, Zoom или Google Hangout, где потеря пакетов не так важна по сравнению с задержкой, введенной TCP.