TCP не только протокол сообщений. Это потоковый протокол, который заботится о разделении данных для нас. Позвольте мне перенести вас в основной раздел. В случае TCP существует две части: сегментация и фрагментация.
Сегментация происходит в TCP (транспортный уровень). Это зависит от двух параметров - MSS и размера окна. MSS определяет максимальный размер сегмента, который может принять устройство. MSS сообщается во время первоначального установления соединения через параметры TCP. Каждое направление потока данных может использовать разные MSS, и операционная система определяет их. Однако размер окна отправляется в заголовке TCP получателем, чтобы передать максимум данных, которые он может за один раз буферизовать на принимающей стороне соединения, прежде чем ожидать подтверждения и обновления окна от принимающего хоста. То есть хост может отправить несколько сегментов (коэффициент MSS) до исчерпания размера окна получателя.
Фрагментация происходит на IP (сетевой уровень) двумя способами. Если на пути связи между отправителем и получателем нет устройств с ограничением MTU, фрагментация будет соответствовать только MTU Ethernet (1500 байт). Однако в случае наличия промежуточного устройства с ограничением MTU между отправителем и получателем, уровень IP (Интернет-протокол) выполняет фрагментацию дейтаграммы, так что пакеты могут формироваться так, что они могут проходить через канал с меньшей максимальной единицей передачи ( MTU), чем исходный размер датаграммы. В случае промежуточного устройства с ограничениями MTU отправитель должен также развернуть обнаружение MTU пути, чтобы определить минимальный MTU в пути сети к приемнику и динамически настроить MSS, чтобы избежать фрагментации IP в сети. Определение MTU пути выполняется путем установки опции DF (Don't Fragment) в заголовках IP исходящих пакетов. Любое устройство на пути связи между отправителем и получателем, MTU которого меньше, чем пакет, будет отбрасывать такие пакеты и отвечать отправителю сообщением ICMP «Destination Unreachable (Datagram Too Big)», содержащим MTU устройства. Эта информация позволяет отправителю соответствующим образом уменьшить MTU предполагаемого пути.
Итак, это приводит к точке связи между MSS и MTU. RFC 791 гласит, что «все хосты должны быть готовы принимать дейтаграммы длиной до 576 октетов (независимо от того, прибывают ли они целыми или фрагментарно)». Итак, минимальный MTU для IP-сетей составляет 576. В случае TCP, вычитая 20 байтов для заголовка TCP и 20 байтов для заголовка IP, мы дадим нам 536 байтов в качестве стандартного MSS для TCP.
Теперь давайте перейдем к части повторной сборки. Фрагментация может происходить на основе MTU на промежуточных устройствах, но повторная сборка должна происходить только на целевом устройстве. TCP заботится о сегментации, однако на устройстве назначения TCP должен заботиться о порядке, но приложение должно заботиться о повторной сборке сегментов.
Итак, если вам нужна только полная связь, основанная на сообщениях, и надежность не является проблемой, тогда UDP будет вашим выбором. Однако обратите внимание, что если вы можете отправлять большие данные путем разделения, UDP не сможет обеспечить упорядочение пакетов, а также не сможет справиться с отбрасыванием пакетов, поскольку у него нет механизма исправления ошибок, такого как повторная передача. .
Если вы хотите иметь обмен сообщениями на основе сообщений, как в UDP, но в сочетании с функциями TCP, такими как надежная доставка по заказу, контроль перегрузки, а также дополнительными улучшениями / функциями, такими как многопотоковая передача, множественная передача , встроенное обнаружение MTU, тогда SCTP должен быть вашим выбором. Однако, если в вашей сети есть устаревшие системы NAT, вам может потребоваться инкапсуляция SCTP в UDP.