2013-10-07 3 views
0

Я пытаюсь создать собственный веб-сервер, и есть несколько вопросов о работе веб-серверов, которые мы используем сегодня. Вопросы:Реализация WebServer

  1. После получения HTTP-запроса от клиента через порт 80 сервер отвечает с использованием того же порта 80?
  2. Если да, то при отправке большого файла скажем, что в МБ, веб-сервер не сможет получать запросы от других клиентов?
  3. Является ли компьютерный порт двусторонним или симплексным? (Может ли он отправлять и получать в одно и то же время)?
  4. Если другой порт на стороне сервера используется для отправки ответа клиента, а затем (если TCP используются, который обычно используется), опять-таки 3-полосные рукопожатия будут сделаны, который будет над головой ...

ответ

1

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html вот хорошее руководство по вопросам, связанным с веб-серверами, хотя оно находится в каталоге c, но все они есть. Это объяснит все отношения клиентского сервера, а также некоторые детали реализации.

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

Итак, у вас есть один сервер, ожидающий запросов, и для каждого полученного запроса он порождает дочерний процесс для обработки этого запроса. Я уверен, что есть намного более простые языки для реализации этого материала, чем c (мне приходилось делать как ac, так и java-сервер, обслуживающий один из них в прошлом), но c действительно позволяет вам понять, что происходит, и я вот что вы ищете здесь

Теперь есть несколько вещей, о которых нужно подумать: , как вы хотите, чтобы веб-сервер работал. В примере объясняется родительский дочерний процесс. Вы хотите использовать tcp/UDP, существуют различия в способах доставки полезной нагрузки. Вам не нужно подключаться к порту 80. Это только по умолчанию для Интернета.

Надеюсь, руководство поможет вам.

0
  1. Да. Сервер отправляет ответ, используя TCP-соединение, установленное клиентом, поэтому он также отвечает с использованием того же порта. Сервер может обрабатывать соединения с несколькими клиентами с использованием одного и того же порта, поскольку TCP-соединения идентифицируются (local-ip, local-port, remote-ip, remote-port), поэтому сервер может обрабатывать несколько соединений с одного и того же клиента, при условии, что исходные порты разные.
  2. Существуют различные методы, которые вы можете использовать для одновременного обслуживания нескольких клиентов. К ним относятся

    • с использованием нескольких процессов или потоков: когда один занят службой клиенту, другие могут обслуживать других клиентов.
    • используя событие: сервер прослушивает события от ОС: когда он может написать блок данных в связи с этим пишет это, когда новый клиент подключается он принимает соединение, ...

    Часто оба подхода объединяются.

  3. Соединение TCP является дуплексным: вы можете отправлять и получать в одно и то же время. Протокол HTTP основан на простой модели запроса-ответа, хотя: в любой момент времени только одна сторона «разговаривает».
+0

Основное внимание уделяется порту на стороне сервера. Может ли этот порт отправлять ответ клиенту и одновременно прослушивать новые клиентские запросы? Если да, то программно, как? Если нет, то какой метод используется, чтобы избежать такой ситуации, когда сервер должен отправлять большие файлы (например, файл изображения) и одновременно быть легко доступными для входящих клиентских запросов ... –

+0

Да, это возможно, и так, как это делается во всех socket API - это то, что сокет, используемый для приема соединений, отделен от сокетов, используемых для связи с клиентами. Я рекомендую вам найти учебник по сетевому программированию для вашего любимого языка программирования в вашей любимой операционной системе, так как он объяснит все это ... – Joni

+0

Можете ли вы реализовать эту строку на c или Java-коде: «Сокет, используемый для приема соединений, является отдельным из сокетов, используемых для общения с клиентами ». ?. Потому что, когда я смотрю в любом учебнике на Java, это делается (как говорится) ServerSocket welcomeSocket = new ServerSocket (6789); while (true) { \t Соединительная розеткаSocket = welcomeSocket.accept(); Теперь, если я отслеживаю активность сети через tcpdump или netstat или открываю порты портов из nmap и т. Д. Он не показывает, что другой порт (кроме прослушивания onServer) используется для отправки данных клиенту. –