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

Разница между сокетами UNIX домена STREAM и DATAGRAM?

Этот вопрос NOT для разницы между типами STREAM и DATAGRAM типа INTERNET. Я знаю, что сокеты STREAM используют TCP, Datagram сокеты используют UDP и все файлы TCP, UDP, поступающие по заказу пакеты, ACK, NACK и т.д. Я понимаю важность этих данных через Интернет.

Q1) Когда я создаю сокет домена UNIX, который является локальным сокетом, как бы важно, является ли сокет STREAM-сокетом или гнездом DATAGRAM. Этот тип сокета будет записывать данные в файл сокета, будет ли этот протокол в этом случае, поскольку я не передаю данные по сети? Есть ли вероятность потери данных в этом случае, если я использую сокеты DATAGRAM на базе UNIX?

Q2) Сокеты UNIX DATAGRAM обеспечивают лучшую производительность, чем сокеты UNIX STREAM?

Q3) Как решить, для сокета STREAM/DATAGRAM UNIX в моем приложении?


Благодаря

4b9b3361

Ответ 1

Так же, как на странице руководства говорится, что сокеты Unix всегда надежны. Разница между SOCK_STREAM и SOCK_DGRAM заключается в семантике потребления данных из сокета.

Стереальный сокет позволяет считывать произвольное количество байтов, но при этом сохраняется последовательность байтов. Другими словами, отправитель может записать 4K данных в сокет, и получатель может использовать этот байт данных байтом. Другой путь тоже прав - отправитель может записать несколько небольших сообщений в сокет, которые получатель может использовать в одном чтении. Сокет Stream не сохраняет границы сообщений.

С другой стороны, сокет Datagram сохраняет эти границы - одна запись отправителем всегда соответствует тому, который считывает приемник (даже если буфер получателя указан read(2) или recv(2) меньше, чем это сообщение).

Итак, если ваш протокол приложения имеет небольшие сообщения с известной верхней границей размера сообщения, вам лучше с SOCK_DGRAM, так как это проще в управлении.

Если ваш протокол вызывает произвольные сообщения с длинными сообщениями или просто неструктурированный поток (например, сырой звук или что-то еще), выберите SOCK_STREAM и выполните требуемую буферизацию.

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

Ответ 2

Основное различие заключается в том, что основан на подключении (STREAM), а другой без подключения (DGRAM) - разница между потоком и пакетом ориентированная коммуникация, как правило, гораздо менее важна.

С SOCK_STREAM вы все равно получите всю обработку соединения, т.е. listen/accept, и вы можете узнать, закрыто ли соединение другой стороной.

Обратите внимание, что существует также тип сокета SEQPACKET, который все еще ориентирован на соединение, но сохраняет границы сообщений (что может избавить вас от реализации ориентированного на сообщения слоя поверх сокета STREAM).

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

Ответ 3

  • Одно из возможных различий - границы сообщений. Дейтаграммы будут доставлены в целом, а дейтаграммы будут естественными границами сообщений. С помощью сокетов потока вы можете читать N байтов, и сокет будет блокироваться до тех пор, пока не будут готовы N байтов. Но это означает отсутствие видимых границ сообщений.
  • Может быть. Поток сокетов с TCP по крайней мере нуждается в первоначальном трехстороннем рукопожатии для установления соединения. Разъем UDP не работает.
  • При прочих равных условиях, если скорость является проблемой, инструментом и мерой. (Я предполагаю, что вы уже знаете, что только сокет TCP-потока обеспечивает встроенный надежный транспорт на заказ, и только для соединений для передачи нескольких приемников могут использоваться только соты дейтаграмм).

Ответ 4

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