Разница между push и срочными флагами в TCP - PullRequest
52 голосов
/ 06 февраля 2012

Я пытаюсь понять разницу между сегментом TCP с флагом PSH и с флагом URG. Я прочитал RFC, но все еще не смог получить его, один из них буферизует данные перед отправкой в ​​процесс, а другой нет?

Ответы [ 3 ]

97 голосов
/ 06 февраля 2012

Это два совершенно разных механизма.

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, чтобы получить срочную семантику, соответствующую стандартам.

Если все это звучит сложно, просто не используйте срочные данные .

6 голосов
/ 21 сентября 2014

Добавление дополнительной информации к уже отвеченному.

  • Бит URG, если он установлен, устанавливает приоритет данных, что означает, что вместо ожидания передачи всего байтового потока, который опережает данные «Срочные», срочные данные будут отправляться в срочном порядке. и не будет ожидать передачи всего потока байтов, который находится перед ним.

  • Когда установлен бит URG, также устанавливается Urgent Pointer (в поле Опции заголовка TCP: 16 бит).

  • Указатель URG сообщает, сколько байтов данных является срочным в поступившем сегменте. (Например, если размер данных составляет 100 байт, и только первые 50 байт являются срочными, указатель срочности будет иметь значение 50).

  • Теперь перейдем к биту PSH. Цель бита PSH состоит в том, чтобы сообщить TCP, что он не ожидает заполнения буфера, и немедленно отправить данные. Аналогично, когда получатель получает сегмент с установленным флагом PSH, он должен немедленно отправить данные на верхний уровень, не дожидаясь, пока приемный буфер заполнится. Практическим примером этого является приложение telnet, где приложение отправляет данные в виде нескольких нажатий клавиш. Телнет станет непригодным для использования, если он ожидает заполнения буфера и затем передает данные получателю.

0 голосов
/ 06 февраля 2012

Я бы не принял все в RFC слишком жестко, кажется, есть некоторая двусмысленность в реализации этих флагов.URG касается отправки пакетов до заполнения буферов, в то время как PSH контролирует перемещение данных вверх стека на принимающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...