Программирование сокетов: как обрабатывать данные вне диапазона

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

Фактический вопрос будет (помимо "Может ли кто-нибудь объяснить, что такое данные OOB?"):

Я пишу Unix-приложение, которое использует сокеты и нуждается в использовании select(), и мне было интересно, что делать с параметром exceptionfds? Нужно ли мне помещать все свои сокеты в этот параметр и реагировать на такие события? Или я их просто игнорирую?

4 ответа

Решение

Я знаю, что вы решили, что вам не нужно обрабатывать данные OOB, но вот некоторые вещи, которые следует иметь в виду, если вы когда-либо заботитесь о OOB...

  • IPv4 на самом деле не отправляет данные OOB по отдельному каналу или с другим приоритетом. Это просто флаг на пакете.
  • Данные OOB крайне ограничены - 1 байт!
  • Данные OOB могут быть получены как встроенными, так и отдельно, в зависимости от параметров сокета
  • "Исключение", сигнализирующее данные OOB, может произойти, даже если следующее чтение не содержит данных OOB (сетевой стек отправителя может пометить любые уже помещенные в очередь данные, поэтому другая сторона будет знать, что OOB как можно скорее). Это часто выполняется путем ввода "сливного" цикла, в котором вы отбрасываете данные до тех пор, пока не станут доступны фактические данные OOB.

Если это кажется немного запутанным и бесполезным, это потому, что это в основном так. Есть веские причины использовать OOB, но это редко. Одним из примеров является FTP, где пользователь может находиться в середине большой передачи, но решает прервать. Прерывание отправляется как данные OOB. В этот момент сервер и клиент просто съедают любые "нормальные" данные, чтобы истощить все, что еще находится в пути. Если прерывание было обработано в соответствии с данными, тогда весь ожидающий трафик должен был быть обработан, только чтобы быть сброшенным.

Хорошо знать, что OOB существует и основы того, как он работает, на тот случай, если он вам когда-нибудь понадобится. Но не пытайтесь изучать это наизнанку, если вам просто не интересно. Скорее всего, вы никогда не будете использовать это.

Я думаю, что нашел ответ на этой странице. Короче:

Мне не нужно обрабатывать данные OOB на принимающей стороне, если я не отправляю данные OOB. Я думал, что данные OOB могут быть сгенерированы ОС отправителя.

"Может ли кто-нибудь объяснить, что такое данные OOB?"

В терминологии связи (Out-Of-Band) OOB просто означает вредоносный пакет, который содержит Urgent Pointer (флаг URG в пакете TCP).

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

Из WIKI 1 С помощью данных OOB можно прерывать или прерывать поток, находящийся в очереди, вместо ожидания его завершения. Это делается путем указания данных как срочных. Это говорит программе-получателю обрабатывать ее немедленно вместе с остальными срочными данными. По завершении TCP информирует приложение и возвращается в очередь потока. Например, когда TCP используется для сеанса удаленного входа в систему, пользователь может отправить последовательность клавиатуры, которая прерывает или прерывает программу на другом конце. Эти сигналы чаще всего необходимы, когда программа на удаленном компьютере не работает должным образом. Сигналы должны быть отправлены, не дожидаясь завершения текущей передачи программы. Данные TCP OOB не были предназначены для современного Интернета. Указатель срочности только изменяет обработку на удаленном хосте и не ускоряет обработку в самой сети. Когда он добирается до удаленного хоста, есть две немного отличающиеся интерпретации протокола, что означает, что только отдельные байты данных OOB являются надежными. Это предполагает, что он вообще надежен, поскольку является одним из наименее часто используемых элементов протокола и имеет тенденцию быть плохо реализованным.

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

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