Разница между сокетами 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 в моем приложении?
Благодаря
Ответы
Ответ 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
Если клиенты и серверы всегда будут на одном компьютере, и цель состоит в том, чтобы иметь минимальную задержку и максимальную пропускную способность, используйте общую память.