Разница между push и срочными флагами в TCP

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

3 ответа

Решение

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

PSH и функция PUSH

Когда вы отправляете данные, ваш TCP буферизирует это. Так что, если вы отправите персонажа, он не отправит его сразу, а будет ждать, если у вас есть больше. Но, может быть, вы хотите, чтобы все шло прямо по проводам: именно здесь включается функция PUSH. Если вы PUSH-данные, ваш TCP немедленно создаст сегмент (или несколько сегментов) и протолкнет их.

Но история не заканчивается здесь. Когда равноправный TCP получает данные, он, естественно, буферизует их, что не будет мешать приложению для каждого байта. Вот где PSH включается флаг. Если принимающий TCP видит флаг PSH, он немедленно передает данные в приложение.

Там нет API для установки PSH флаг. Обычно он устанавливается ядром, когда очищает буфер. Из проиллюстрированного TCP/IP:

Этот флаг обычно используется для указания того, что буфер на стороне, отправляющей пакет, был освобожден в связи с отправкой пакета. Другими словами, когда пакет с установленным битовым полем PSH покинул отправителя, у отправителя больше не было данных для отправки.

Но знайте, Стивенс также говорит:

Нажмите (получатель должен передать эти данные приложению как можно скорее -ненадежно реализовано или использовано)

Данные URG и OOB

TCP является потоковым протоколом. Таким образом, если вы добавите 64 КБ на одной стороне, вы в конечном итоге получите 64 КБ на другой. Итак, представьте, что вы отправляете много данных, а затем получаете сообщение "Эй, вы знаете все эти данные, которые я только что отправил? Да, выбросьте их". Суть в том, что когда вы отправляете данные в соединение, вы должны ждать, пока получатель получит все это, прежде чем он получит новые данные.

Это где URG включается флаг. Когда вы отправляете срочные данные, ваш TCP создает специальный сегмент, в котором он устанавливает флаг URG, а также поле срочного указателя. Это заставляет принимающий TCP пересылать срочные данные по отдельному каналу приложению (например, в Unix ваш процесс получает SIGURG). Это позволяет приложению обрабатывать данные вне диапазона¹.


В качестве дополнительного примечания важно знать, что срочные данные сегодня используются редко и не очень хорошо реализуются. Гораздо проще использовать отдельный канал или вообще другой подход.


RF: RFC 6093 не согласен с этим использованием "out of band" и заявляет:

Срочный механизм TCP НЕ является механизмом отправки "внеполосных" данных: так называемые "срочные данные" должны доставляться "в линию" пользователю TCP.

Но затем он продолжает признавать:

По умолчанию последний байт "срочных данных" доставляется "вне диапазона" в приложение. То есть он не доставляется как часть обычного потока данных.

Приложение должно выйти из своего пути и указать, например, SO_OOBINLINE чтобы получить актуальную семантику, соответствующую стандартам.

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

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

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

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

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

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

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

Другие вопросы по тегам