Это два совершенно разных механизма.
PSH и функция PUSH
Когда вы отправляете данные, ваш TCP
буферизует их.Поэтому, если вы отправите персонажа, он не отправит его сразу, а будет ждать, если у вас есть больше.Но, может быть, вы хотите, чтобы все шло прямо по проводам: именно здесь включается функция PUSH. Если вы PUSH-данные, ваш TCP немедленно создаст сегмент (или несколько сегментов) и выдвинет их.
Но история на этом не заканчивается.Когда равноправный TCP получает данные, он естественно буферизует их , это не будет мешать приложению для каждого байта .Здесь начинается флаг PSH
. Если принимающий TCP видит флаг PSH, он немедленно отправит данные в приложение.
Нет API для установки флага PSH
,Обычно он устанавливается ядром, когда очищает буфер.Из проиллюстрированного TCP / IP:
Этот флаг обычно используется для указания того, что буфер на стороне, отправляющей пакет, был освобожден в связи с отправкой пакета.Другими словами, когда пакет с установленным битовым полем PSH покинул отправителя, у отправителя больше не было данных для отправки.
Но учтите, что Стивенс также говорит:
Push (получатель должен передать эти данные приложению как можно скорее - ненадежно реализовано или использовано )
URG и данные OOB
TCP isпотоковый протокол.Таким образом, если вы поместите 64 КБ на одной стороне, вы в конечном итоге получите 64 КБ на другой.Итак, представьте, что вы отправляете много данных, а затем получаете сообщение «Эй, вы знаете все эти данные, которые я только что отправил? Да, выбросьте их».Суть в том, что когда вы отправляете данные в соединение, вы должны ждать, пока получатель получит все эти данные, прежде чем он получит новые данные.
Именно здесь включается флаг URG
.Когда вы отправляете срочные данные, ваш TCP создает специальный сегмент, в котором он устанавливает флаг URG, а также поле срочного указателя.Это заставляет принимающий TCP пересылать срочные данные по отдельному каналу приложению (например, в Unix ваш процесс получает SIGURG
).Это позволяет приложению обрабатывать данные вне диапазона¹ .
В качестве дополнительного примечания важно знать, что срочные данные редко используются сегодня и не очень хорошо реализуются.Гораздо проще использовать отдельный канал или другой подход.
¹: RFC 6093 не согласен с этим использованием "out of band" и заявляет:
Срочный механизм TCP НЕ является механизмом отправки «внеполосных» данных: так называемые «срочные данные» должны доставляться «in-line» пользователю TCP.
Но затем он продолжает допускать:
По умолчанию последний байт «срочных данных» доставляется «вне диапазона» в приложение.То есть оно не доставляется как часть обычного потока данных.
Приложение должно выйти из своего пути и указать, например, SO_OOBINLINE
, чтобы получить срочную семантику, соответствующую стандартам.
Если все это звучит сложно, просто не используйте срочные данные .