Сокет веб-сервера - PullRequest
       13

Сокет веб-сервера

1 голос
/ 18 декабря 2009

Когда клиент отправляет запрос на веб-сервер. Открывает ли веб-сервер новый сокет? Или существующий открытый сокет используется для нового запроса? Если он открывает сокет для каждого нового запроса, как это происходит, поскольку Http является протоколом без сохранения состояния. Также это то же самое для всех веб-серверов или разные веб-серверы обрабатывают это по-разному?

Ответы [ 4 ]

8 голосов
/ 18 декабря 2009

Используя терминологию Unix (которая почти универсальна - сокеты были введены в BSD-разновидности Unix и распространены повсеместно оттуда), практически любой сетевой сервер TCP (веб- или иной) будет слушать на сокете, привязанном к «общеизвестному порту» (обычно, но не обязательно, к порту 80 для HTTP-серверов). Когда клиент подключается s, сервер уведомляется (в зависимости от ОС), и он может затем сделать accept на слушающем сокете, который создает новый сокет.

В зависимости от уровня используемого протокола HTTP (обычный 1.1 или старого, но все еще используемого 1.0) и некоторых заголовков в запросе, клиент может запросить одноразовый сокет (который будет работать только с одним request and one response) или, чаще в наши дни, постоянный (также известный, с более старой терминологией, датируемой поздним HTTP 1.0, как соединение "keep alive"). Сервер не должен выполнять запрос клиента на постоянство соединения, но обычно пытается, потому что это делает производительность клиента НАСТОЛЬКО лучше. Каждый сервер может определенно выбрать свою собственную эвристику о том, когда он слишком загружен (слишком много запросов приходит одновременно), чтобы удовлетворить запросы на постоянные соединения.

HTTP по-прежнему не имеет состояния даже при использовании постоянных соединений - клиент может делать разные запросы на все еще открытом сокете и / или пытаться открыть разные сокеты, а HTTP просто обрабатывает каждую пару запрос / ответ отдельно. Постоянство сокета только экономит время с точки зрения рукопожатий TCP & c (так как HTTP работает поверх TCP, каждое новое соединение TCP требует своего собственного рукопожатия, & c).

0 голосов
/ 18 декабря 2009

Сокет прослушивает один порт, и все запросы, вероятно, поступают на веб-сервер через один и тот же порт. Таким образом (вообще говоря) существует один сокет, который принимает все входящие запросы, каждый из которых затем передается потоку обработчика. Обычно эти потоки обработчиков объединяются и используются повторно, поскольку их уничтожение и создание обходятся дорого.

Редактировать: Я исправлен. Согласно ответу Алекса Мартелли, socket.accept () создает новый сокет. И тогда становится актуальным говорить о постоянных соединениях.

Вот хороший маленький пример (из http://devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=396), хотя он не использует пул потоков:

import java.io.*;
import java.net.*;
import java.util.*;

public final class WebServer {
    public static void main(String args[]) throws Exception {

        //Establish the listen socket
        int PORT = 5306;     //select your favorite number > 1123
        ServerSocket listenSocket = new ServerSocket(PORT);

        //Process HTTP service requests in an infinite loop
        while(true) {
            //listen for TCP connection request
            //Construct an object to process the HTTP request message
            HttpRequest request = new HttpRequest(listenSocket.accept());
            Thread thread = new Thread(request);
            thread.start();
        }
    }
}

Что касается безгражданства, такие вещи, как файлы cookie и сеансы, используются для идентификации пользователя от одного запроса к другому. Файл cookie - это данные, записанные клиенту, которые отправляются на сервер при каждом запросе, а сеанс представлен идентификатором, который можно вставить в URL-адрес или отправить другим способом.

0 голосов
/ 18 декабря 2009
0 голосов
/ 18 декабря 2009

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

Хотя точно не знаю, как различные веб-серверы справляются с этим.

Надеюсь, это чем-то поможет.

...