Как работает асинхронный сервер сокетов?

Я должен заявить, что я не спрашиваю о конкретных деталях реализации (пока), а просто общий обзор того, что происходит. Я понимаю основную концепцию сокета и нуждаюсь в разъяснении процесса в целом. Мое (вероятно, очень неправильное) понимание в настоящее время таково:

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

мои вопросы:

насколько я понимаю?

требует ли каждый клиентский сокет собственного потока для прослушивания данных?

Как маршрутизируются данные к правильному сокету клиента? Это что-то позаботилось о кишках TCP/UDP/kernel?

в этой потоковой среде какие данные обычно используются совместно и каковы точки соперничества?

любые разъяснения и дополнительные разъяснения будут весьма признательны.

EDIT:

Что касается вопроса о том, какие данные обычно являются общими и спорными, я понимаю, что это скорее детали реализации, чем это вопрос относительно общего процесса приема соединений и отправки/получения данных. Я просмотрел пару реализаций (SuperSocket и Kayak) и заметил некоторую синхронизацию для таких вещей, как кэш сеанса и многоразовые буферные пулы. Не стесняйтесь игнорировать этот вопрос. Я оценил все ваши отзывы.

2 ответов


один поток на соединение плохой дизайн (не масштабируемый, чрезмерно сложный), но, к сожалению, слишком распространенный.

сервер сокетов работает примерно так:

  • прослушивающий сокет настроен на прием соединений и добавлен в socketset
  • набор сокетов проверяется на наличие событий
  • если прослушивающий сокет имеет ожидающие соединения, новые сокеты создаются путем принятия соединений, а затем добавляются в сокет set
  • если подключенный сокет имеет события, соответствующие функции ввода-вывода называются
  • набор сокетов снова проверяется на наличие событий

это происходит в одном потоке, вы можете легко обрабатывать тысячи подключенных сокетов в одном потоке, и есть несколько веских причин сделать это более сложным, введя потоки.

while running
    select on socketset
    for each socket with events
        if socket is listener
            accept new connected socket
            add new socket to socketset
        else if socket is connection
            if event is readable
                read data
                process data
            else if event is writable
                write queued data
            else if event is closed connection
                remove socket from socketset
            end
        end
    done
done

стек IP заботится обо всех деталях, какие пакеты идут в какой "сокет" в каком порядке. Видно из с точки зрения приложений, сокет представляет собой надежный упорядоченный поток байтов (TCP) или ненадежную неупорядоченную последовательность пакетов(UDP)

EDIT: в ответ на обновленный вопрос.

Я не знаю ни одной из библиотек, которые вы упоминаете, но о концепциях, которые вы упоминаете:

  • кэш сеанса обычно хранит данные, связанные с клиентом, и может повторно использовать эти данные для нескольких подключений. Это имеет смысл, когда логика приложения требует состояния информация, но это уровень выше, чем фактический конец сети. В приведенном выше примере кэш сеанса будет использоваться частью "данные процесса".
  • буферные пулы также являются простой и часто эффективной оптимизацией сервера с высоким трафиком. Концепция очень проста в реализации, вместо выделения / освобождения места для хранения данных, которые Вы читаете / пишете, вы получаете предварительно выделенный буфер из пула, используете его, а затем возвращаете его в пул. Это позволяет избежать (иногда относительно дорого) механизмы выделения/освобождения бэкэнда. Это напрямую не связано с сетью, вы можете также использовать буферные пулы, например, для чтения кусков файлов и их обработки.

насколько я понимаю?

довольно далеко.

требует ли каждый клиентский сокет собственного потока для прослушивания данных?

нет.

Как данные направляются в правильный клиентский сокет? Это что-то позаботилось о кишках TCP/UDP/kernel?

TCP / IP-это несколько уровней протокола. В этом нет никакого" ядра". Это части, каждая с отдельным API для другая фигура.

IP-адрес обрабатывается на месте.

порт # обрабатывается в другом месте.

IP-адреса сопоставляются с MAC-адресами для идентификации конкретного хоста. Порт # - это то, что связывает сокет TCP (или UDP) с определенным прикладным программным обеспечением.

в этой потоковой среде какие данные обычно используются совместно и каковы точки соперничества?

что резьбовая среда?

данные? Что?

утверждение? Физический канал-это точка соперничества номер один. (Ethernet, например, зависит от обнаружения столкновения.) После этого, ну, каждая часть компьютерной системы является дефицитным ресурсом, общим для нескольких приложений и является точкой соперничества.