Выбор типа сокета для Python-проектов

Разрабатывая клиент-серверные системы для локального или сетевого использования, возникает вопрос, какой из интерфейсов межпроцессного взаимодействия выбрать. Давайте разберемся, когда уместны UNIX-сокеты, а в каких случаях лучше использовать TCP-сокеты.

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

Скорость работы

Сокеты UNIX обеспечивают более высокую скорость работы по сравнению с TCP-сокетами, поскольку в UNIX-сокетах:

  • отсутствуют дополнительные переключения контекста;
  • посылающий поток записывает поток или дейтаграммы напрямую в буфер принимающего сокета;
  • не рассчитываются контрольные суммы;
  • не добавляются заголовки;
  • не выполняется маршрутизация.

Ошибки в реализации

TCP-сокеты

Использование TCP-сокетов предполагает, что в серверной части реализовано медленное закрытие соединений (lingering close). HTTP-серверы, такие как nginx и httpd, библиотеки FastCGI, реализуют эти возможности. К сожалению, кроме uWSGI (см. пулл-реквест).

Поддержка клиентов и прокси

TCP-сокеты

Для протокола HTTP поддерка TCP-сокетов широко распространена.

UNIX-сокеты

По сравнению с TCP-сокетами, UNIX-сокеты в клиентах и прокси-серверах поддерживаются реже. Например, если ваше веб-приложение работает через UNIX-сокет, скорее всего возникнут сложности в использовании любимого отладчика.

Распределение по различным хостам

Эту возможность поддерживают только TCP-сокеты.

Права доступа

TCP-сокеты

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

UNIX-сокеты

UNIX-сокеты используют файловую систему в качестве адресного пространства. Это означает, что можно использовать права доступа к файлам UNIX для управления доступом к сокетам. То есть вы можете ограничить подключение других процессов к демону. Например, процессов, не входящих в определенную группу. В продакшен-окружении это может быть критически важно, т. к. система прав доступа будет гарантировать, что посторонние сервисы не смогут взаимодействовать с сокетами вашего приложения и использовать его уязвимости.

Нюансы

TCP-сокеты

Пока сокеты находятся в состоянии TIME_WAIT, расходуются ресурсы ядра. Необходимо в правильной последовательности закрывать соединения, чтобы позволить клиентам прочитать ответ прежде, чем получить ошибку ECONNRESET. В некоторых серверных архитектурах (например, httpd prefork или worker MPM, uWSGI) требуются дополнительные ресурсы для этой операции.

UNIX-сокеты

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

Выводы

Выбирайте UNIX-сокеты, если:

  • вы хотите добиться максимальной производительности;
  • предполагается работа в пределах одной машины.

Выбирайте TCP-сокеты, если для вас приоритетны:

  • мобильность;
  • возможность простого масштабирования.