Что такое SOCK_DGRAM и SOCK_STREAM? - PullRequest
       16

Что такое SOCK_DGRAM и SOCK_STREAM?

29 голосов
/ 28 апреля 2011

Я только что натолкнулся на странную вещь, которую я увидел, что приложение по умолчанию использует функцию SOCK_STREAM. Почему это так? Это SOCK_STREAM просто создает несколько потоков? Или это стандартная функция SOCK_STREAM, доступная для создания потоков TCP?

Я думал, что цунами основано на UDP, но все еще имеет некоторые функции, такие как TCP, например. Честность, дружелюбие и т. Д.

Может ли кто-нибудь пролить свет на эту проблему? Я совершенно смущен этим.

Ответы [ 2 ]

45 голосов
/ 30 мая 2012

TCP почти всегда использует SOCK_STREAM, а UDP использует SOCK_DGRAM.

TCP (SOCK_STREAM) - это протокол на основе соединения.Соединение установлено, и обе стороны ведут разговор до тех пор, пока соединение не будет прервано одной из сторон или сетевой ошибкой.

UDP (SOCK_DGRAM) - это протокол на основе дейтаграмм.Вы отправляете одну дейтаграмму и получаете один ответ, а затем соединение разрывается.

  • Если вы отправляете несколько пакетов, TCP обещает доставить их по порядку.UDP не делает, поэтому получатель должен проверить их, если порядок имеет значение.

  • Если пакет TCP потерян, отправитель может сказать.Для UDP это не так.

  • Размер дейтаграмм UDP ограничен, из памяти я думаю, что это 512 байт.TCP может отправлять гораздо большие шишки.

  • TCP немного более устойчив и делает больше проверок.UDP имеет меньший вес (меньше нагрузки на компьютер и сеть).

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

7 голосов
/ 28 апреля 2011

Обновление: мой ответ кажется не более актуальным, но первоначальный вопрос касался UDT, который является протоколом, ориентированным на соединение, построенным поверх UDP.Более подробная информация здесь: http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol


UDT, по-видимому, предоставляет API, имитирующий классический API сокетов BSD, поэтому его можно использовать в качестве замены для приложений, ориентированных как на поток, так и на дейтаграммы.Проверьте, например, sendmsg и recvmsg - оба выдают исключение, если используются в сокете, созданном с SOCK_STREAM, и все потоковые API выдают исключение для сокета, созданного также с SOCK_DGRAM.

В случае SOCK_DGRAM он выполняет некоторую дополнительную обработку, однако в этом случае он не просто прозрачно оборачивает сокет UDP - насколько я понимаю код после быстрого просмотра (я не знаком с внутренними компонентами UDT или спецификацией протокола).).Чтение технических документов может очень помочь.

Библиотека всегда создает свой базовый, "реальный" сокет как датаграмму (проверьте channel.cpp, CChannel::open).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...