Как все запросы подключаются к веб-серверу через один и тот же порт? - PullRequest
1 голос
/ 17 декабря 2011

Как веб-сервер обслуживает своего клиента, используя тот же порт (80) для соединения TCP. Для соединения UDP я понимаю, что само по себе соединение отсутствует, поэтому у нас может быть несколько клиентов, отправляющих пакеты на один и тот же порт. Если я пытаюсь использовать уже используемый порт на моем локальном хосте, я получаю BindException.

Одним из решений, которое я вижу, является запуск потока для каждого соединения, но разве это не будет обременительно для сайта, такого как google / yahoo, где на каждом сервере> 100000 соединений?

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

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Сервер прослушивает известный порт (80) и делегирует запрос рабочему сокету, как только он получает запрос. Таким образом, он может обслуживать следующий запрос. Вы можете написать свой собственный простой сервер, чтобы понять, что происходит. На сайте Oracle есть хороший пример кода. [1]

[1] http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServer.java

сначала создается сокет сервера;

ServerSocket ss = new ServerSocket(port);

затем выводит список на указанный порт и создает новый сокет, как только он принимает запрос;

Socket s = ss.accept();

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

2 голосов
/ 17 декабря 2011

У вас есть только один порт для прослушивания, но соединение имеет два порта, по одному на каждой стороне соединения. Эта пара должна быть уникальной.

Итак, предположим, что вы подключаетесь к порту 80 google.com, тогда у вашего подключения будет какой-то порт на вашей машине, скажем, 42312 и порт 80 на google.com. Вы можете видеть свои соединения с netstat -a . Чтобы получить более короткий список: netstat -an | grep ESTABLISHED " Показывает все установленные соединения без разрешения их IP-адресов на имена.

1 голос
/ 17 декабря 2011

AFAIK, Apache запускает новый поток для каждого запроса , что является большой причиной того, что управляемые событиями серверы, такие как Node.js, немного быстрее . Google и Yahoo также имеют ТОННЫ серверов и распределяют между ними эту большую нагрузку. То, что говорит Роджер, также имеет смысл, хотя я не уверен на 100% в деталях того, как именно Google, выводящий данные через порт 42312, достигнет вашего компьютера через порт 80: P

...