Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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). Это позволяет приложению обрабатывать данные вне диапазона¹.


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


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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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