Используя терминологию 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).