Как несколько клиентов одновременно подключаются к одному порту, скажем, 80 на сервере?

Я понимаю основы работы портов. Однако я не понимаю, как несколько клиентов могут одновременно подключаться, скажем, к порту 80. Я знаю, что у каждого клиента есть уникальный (для своей машины) порт. Отвечает ли сервер клиенту с доступного порта и просто заявляет, что ответ пришел с 80? Как это работает?


person IamIC    schedule 25.07.2010    source источник
comment
см. stackoverflow.com/questions/3638953/   -  person Ashkan Kh. Nazary    schedule 26.01.2012


Ответы (5)


Во-первых, «порт» - это просто число. Все, что на самом деле представляет собой «соединение с портом», - это пакет, номер которого указан в поле заголовка «порт назначения».

Теперь есть два ответа на ваш вопрос: один для протоколов с отслеживанием состояния и один для протоколов без отслеживания состояния.

Для протокола без сохранения состояния (например, UDP) проблем нет, потому что «соединений» не существует - несколько человек могут отправлять пакеты на один и тот же порт, и их пакеты будут приходить в любой последовательности. Никто никогда не находится в «подключенном» состоянии.

Для протокола с отслеживанием состояния (например, TCP) соединение идентифицируется 4-кортежем, состоящим из портов источника и назначения, а также IP-адресов источника и назначения. Итак, если две разные машины подключаются к одному и тому же порту на третьей машине, есть два разных соединения, потому что исходные IP-адреса различаются. Если одна и та же машина (или две за NAT или иным образом использующие один и тот же IP-адрес) дважды подключается к одному удаленному концу, соединения различаются по исходному порту (который обычно является случайным портом с большим номером).

Проще говоря, если я дважды подключаюсь к одному и тому же веб-серверу с моего клиента, два подключения будут иметь разные исходные порты с моей точки зрения и порты назначения с веб-сервера. Таким образом, нет двусмысленности, даже если оба соединения имеют одинаковые IP-адреса источника и назначения.

Порты - это способ мультиплексирования IP-адресов, чтобы разные приложения могли прослушивать одну и ту же пару IP-адрес / протокол. Если приложение не определяет собственный протокол более высокого уровня, мультиплексировать порт невозможно. Если два соединения, использующие один и тот же протокол, одновременно имеют одинаковые IP-адреса источника и назначения и идентичные порты источника и назначения, они должны быть одним и тем же соединением.

person Borealid    schedule 25.07.2010
comment
Если вы дважды подключаетесь к одному и тому же веб-серверу со своего клиента, два подключения также будут иметь один и тот же порт назначения. Только порт источника отличается. - person notacat; 25.07.2010
comment
@notacat: и порты назначения на удаленном конце. С точки зрения сервера, соединения имеют разные исходные порты. Уточнено. - person Borealid; 25.07.2010
comment
Если два соединения, использующие один и тот же протокол, имеют одинаковые IP-адреса источника и назначения и одинаковые порты источника и назначения, они должны быть одним и тем же соединением. - Это должно быть в Википедии! - person Ritesh; 03.11.2011
comment
@Borealid - Теперь предположим, что в случае корпоративных сетей обычно порты заблокированы. У меня есть приложение P2P, которое должно обмениваться данными, поэтому в этом случае, чтобы заставить его работать, иначе ФИЛЬТРАЦИЯ ПОРТОВ остановит его, мне нужно открыть некоторый набор портов. Например: я открываю порт - 6881, и теперь начинается связь. Но в случае, когда несколько клиентов используют один и тот же порт (6881), тогда он работает одновременно для клиента, то есть клиент 1 и клиент 2 под одним и тем же NAT (6881 открыт) не могут общаться внутри, а также даже с CLient-X сидит под NAT-X [одновременно] ,. Почему так? - person bhuvin; 19.11.2013
comment
@bhuvin Не по теме, но ваше P2P-приложение похоже на Bittorrent-клиент :) Верно? - person talonx; 12.03.2014
comment
Что произойдет, если два компьютера с NAT случайно выберут один и тот же исходный порт? - person Hello World; 26.04.2014
comment
@HelloWorld В сценарии NAT задействованы два исходных порта. Порт источника, установленный на исходном компьютере, и порт внешнего источника на маршрутизаторе. Последний выбирается маршрутизатором, а не хостами. Поскольку внутри каждый хост имеет свой IP-адрес, конфликтов нет. - person Borealid; 27.04.2014
comment
@Borealid, это относится к симметричным NAT, но не к конусным NAT с ограничением портов. Большинство домашних маршрутизаторов являются коническими NAT с ограничением портов. Как это решить? - person Hello World; 27.04.2014
comment
@HelloWorld Я думаю, вы неправильно поняли, как работает DNAT. Пакет перезаписывается на маршрутизаторе, чтобы иметь другой порт источника, который выбирается маршрутизатором, а также другой IP-адрес источника. Количество одновременных подключений ограничено количеством доступных портов на общедоступных интерфейсах маршрутизатора. - person Borealid; 28.04.2014
comment
Мое замешательство возникло из-за того, что я не понимал разницы между конусным NAT с ограничением порта и симметричным NAT, я думал, что порт ограниченный NAT резервирует исходный порт, но это не так. Спасибо за разъяснения. - person Hello World; 29.04.2014
comment
Если на сервере есть кортеж ip: порт источника, как я могу открыть эту же страницу в двух разных экземплярах браузера? Привязан ли браузер к определенному номеру порта, и каждый экземпляр имеет свой порт? - person smolarek999; 27.08.2014
comment
TCP и UDP расширяют IP-адреса с помощью концепции, известной как порт, 16-разрядного числа, которое дополняет IP-адрес, чтобы указать конкретный канал связи. Это должно сделать его кратким и ясным. - person user3081519; 17.02.2015
comment
Прочитав это, мне стало интересно, работает ли и обратное (клиент повторно использует один и тот же порт для разных пунктов назначения), однако netcat не позволил мне: netcat: bind failed: Address already in use. Это сообщение в блоге привело меня к решению: ядро предотвращает повторное использование одного и того же исходного порта по соображениям надежности. Однако с опцией сокета SO_REUSEADDR это возможно. С помощью этой опции я смог создать два соединения с одним и тем же исходным IP / портом, используя socat: socat - TCP:127.0.0.1:9000,sourceport=8000,reuseaddr - person falstaff; 29.05.2017
comment
Интересные ответы. У меня новый вопрос. Когда есть один UDP-сервер (с одним портом прослушивания) и несколько UDP-клиентов, система будет работать нормально. Как справиться с тем же сценарием, когда нам нужна масштабируемая многосерверная система? - person Anand; 27.07.2017
comment
@Anand один из вариантов - просто поставить балансировщик нагрузки перед серверами. Он отправляет каждый входящий пакет UDP на сервер случайным образом. Сделанный. - person Borealid; 27.07.2017
comment
Если два одновременных соединения, использующих один и тот же протокол, имеют одинаковые IP-адреса источника и назначения и идентичные порты источника и назначения, они должны быть одним и тем же соединением. Я считаю, что это утверждение верно только в том случае, если в нем указано concurrent. Эфемерный порт, выбранный клиентом, может быть повторно использован позже для последующего соединения с тем же сервером, идентифицированным одним и тем же ip: port, тем самым достигнув одного и того же 4-кортежа, но это будут два разных соединения в два разных момента времени. . На самом деле я столкнулся с этой проблемой, когда пытаюсь восстановить TCP-соединения из трассировки пакетов. - person Janus Varmarken; 10.07.2018
comment
Вау, значит, на одном и том же порте с одним и тем же IP может быть только 65k * 65k возможных подключений? - person information_interchange; 05.11.2018
comment
Номера портов TCP составляют 16 бит каждый. Таким образом, одновременно может быть только 65536 TCP-соединений с одной и той же комбинацией IP-адрес-источник-IP-адрес назначения. Предоставление вашему компьютеру большего количества IP-адресов позволяет ему обрабатывать больше подключений одновременно. То, что вы сказали, не совсем верно, потому что исправление destinationPort и sourceIP, но при разрешении разных IP-адресов назначения дало бы как минимум 2 ^ 16 * 2 ^ 32ish (для IPv4) + 2 ^ 16 * 2 ^ 128ish (для IPv6) одновременных TCP-соединений. - person Borealid; 05.11.2018
comment
Я знаю, что отвечаю на действительно старый пост, у нас есть клиентские машины, подключающиеся к серверу через IP-адрес и порт назначения, мы заметили, что клиентская машина сохраняет сеансы на сервере, хотя на клиентской машине работает только один экземпляр . Есть идеи, как мы можем решить такие проблемы? Спасибо - person Suleman khan; 11.07.2021

Важно:

С сожалением вынужден сказать, что ответ от "Borealid" неточен и несколько неверен - во-первых, нет никакого отношения к сохранению состояния или без него, чтобы ответить на этот вопрос, и, что наиболее важно, определение кортежа для сокета неверно.

Сначала запомните два следующих правила:

  1. Первичный ключ сокета: сокет идентифицируется {SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL}, а не {SRC-IP, SRC-PORT, DEST-IP, DEST-PORT}. Протокол является важной частью определения сокета.

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

Пример 1: Два клиента, подключающиеся к одному и тому же порту сервера, означают: socket1 {SRC-A, 100, DEST-X,80, TCP} и socket2{SRC-B, 100, DEST-X,80, TCP}. Это означает, что хост A подключается к порту 80 сервера X, а другой хост B также подключается к тому же серверу X к тому же порту 80. Теперь то, как сервер обрабатывает эти два сокета, зависит от того, является ли сервер однопоточным или многопоточным (я объясню позже). Важно то, что один сервер может одновременно прослушивать несколько сокетов.

Чтобы ответить на исходный вопрос сообщения:

Независимо от протоколов с отслеживанием состояния или без него, два клиента могут подключаться к одному и тому же порту сервера, потому что для каждого клиента мы можем назначить другой сокет (поскольку IP-адрес клиента определенно будет отличаться). Один и тот же клиент может также иметь два сокета, подключающихся к одному и тому же порту сервера, поскольку такие сокеты различаются на SRC-PORT. Честно говоря, "Borealid", по сути, упомянул тот же правильный ответ, но ссылка на state -less / full была излишней / сбивала с толку.

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

Еще немного для полноты:

Пример 2: Это очень интересный вопрос: «могут ли два разных процесса на сервере прослушивать один и тот же порт». Если вы не рассматриваете протокол как один из параметров, определяющих сокет, то ответ - нет. Это так, потому что мы можем сказать, что в таком случае один клиент, пытающийся подключиться к серверу-порту, не будет иметь никакого механизма, чтобы указать, к какому из двух прослушивающих процессов клиент намеревается подключиться. Это та же тема, что утверждается правилом (2). Однако это НЕПРАВИЛЬНЫЙ ответ, потому что «протокол» также является частью определения сокета. Таким образом, два процесса в одном узле могут прослушивать один и тот же порт, только если они используют разные протоколы. Например, два несвязанных клиента (скажем, один использует TCP, а другой - UDP) могут подключаться и взаимодействовать с одним и тем же серверным узлом и с одним и тем же портом, но они должны обслуживаться двумя разными серверными процессами.

Типы серверов - один и несколько:

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

Предлагаемые книги и остальные два тома, если можете .

Примечание о родительском / дочернем процессе (в ответ на запрос / комментарий Иоана Александру Куку)

Где бы я ни упоминал какую-либо концепцию в отношении двух процессов, например A и B, учитывайте, что они не связаны отношениями родитель-потомок. ОС (особенно UNIX) по своей конструкции позволяют дочернему процессу наследовать все файловые дескрипторы (FD) от родителей. Таким образом, все сокеты (в UNIX, подобных ОС, также являются частью FD), которые прослушивает процесс A, могут прослушиваться гораздо большим количеством процессов A1, A2, ..., если они связаны отношениями родитель-потомок с A. Но независимый процесс B (т.е. не имеющий отношения родитель-потомок к A) не может прослушивать тот же сокет. Кроме того, также обратите внимание, что это правило запрета двум независимым процессам прослушивать один и тот же сокет лежит в ОС (или ее сетевых библиотеках) и, безусловно, соблюдается большинством ОС. Однако можно создать собственную ОС, которая вполне может нарушить эти ограничения.

person KGhatak    schedule 05.07.2012
comment
Отличное объяснение. Еще одна вещь, используя SO_REUSEADDR, два процесса могут использовать один и тот же сокет, но это многоадресная рассылка. Если у меня есть новый ServerSocket (80) и я охватываю новый поток для каждого accept (), тогда я обслуживаю одного клиента за раз (я не могу отправлять пакеты данных одновременно даже с неблокирующей очередью). Таким образом, единственная реальная разница между однопоточным / многопоточным веб-сервером заключается в том, что один процесс не может обслуживать второго клиента, пока HTTP-запрос для первого не будет завершен. - person d1val; 09.10.2012
comment
Чтобы прояснить OP, я думаю, что это порт 80 многих разных машин, возможно, кластер серверов и / или несколько сетевых карт. - person d1val; 09.10.2012
comment
Вы сказали, что без procol в качестве определяющего параметра сокета клиент, пытающийся подключиться к порту сервера, не будет иметь никакого механизма, чтобы указать, какой из двух процессов прослушивания клиент намеревается использовать. Теперь мой вопрос, не будет ли клиентского порта нет. поможет различить, на какой сокет отвечать, даже если два разных процесса слушают один и тот же порт, без необходимости видеть для него протокол? - person Zohaib; 21.08.2013
comment
Не уверен, что, таким образом, два процесса в одном узле могут прослушивать один и тот же порт, только если они используют разные протоколы, на самом деле это правда ... Вы можете заставить процесс прослушивать порт, а затем разветвляться. В результате вы получите два процесса, прослушивающих один и тот же порт. Когда приходит новое соединение, ОС должна решить, какой из двух процессов будет обрабатывать запрос. - person Ioan Alexandru Cucu; 29.09.2013
comment
@Ioan Alexandru Cucu - Вы правы, и, чтобы учесть подобные проблемы, я добавил примечание к своему ответу. Спасибо, что подняли этот вопрос. Однако обратите внимание, что ОС не является ответвлением от процесса, который уже прослушивает сокет (по крайней мере, я не знаю об этом), а скорее от прикладной программы, которая может выполнить ответвление. В таких случаях программа должна быть осторожна при прослушивании и обработке входящих данных родительским и / или дочерним процессом. - person KGhatak; 30.09.2013
comment
Теперь предположим, что в случае корпоративных сетей порты обычно заблокированы. У меня есть приложение P2P, которое должно обмениваться данными, поэтому в этом случае, чтобы заставить его работать, иначе ФИЛЬТРАЦИЯ ПОРТОВ остановит его, мне нужно открыть некоторый набор портов. Например: я открываю порт - 6881, и теперь начинается связь. Но в случае, когда несколько клиентов используют один и тот же порт (6881), тогда он работает одновременно для клиента, то есть клиент 1 и клиент 2 под одним и тем же NAT (6881 открыт) не могут общаться внутри, а также даже с CLient-X сидит под NAT-X [одновременно] ,. Почему так? - person bhuvin; 19.11.2013
comment
@BuckCherry - Посоветуйте, пожалуйста, правильно ли я понял. Кстати, отличное объяснение! Я не использую веб-службу. Я использую буферы протокола Google для потоковой передачи данных непосредственно в сокет / порт HTTP на удаленном компьютере. Нас беспокоит, что если два клиента попытаются подключиться к удаленному приложению одновременно? Сможет ли ОС с этим справиться? Или мне нужно обрабатывать каждое соединение в другом потоке? Спасибо, что разъяснили мою путаницу. - person Patricia; 10.12.2014
comment
Стоит добавить, что независимый процесс B по-прежнему имеет механизм для передачи сокета от процесса A, если processA передает дескриптор файла сокета процессу B через локальный сокет домена unix в качестве вспомогательного сообщения (также известного как управляющее сообщение) с использованием sendmsg() system позвонить с SCM_RIGHTS. Это верно не только для сокетов, но любой файловый дескриптор, принадлежащий процессу, может быть передан другому процессу, даже если он не является дочерним процессом. - person Tuxdude; 27.04.2015
comment
@ Zohaib - Ответ на сообщение @ 21 августа 2013 г. По замыслу сокет поддерживает протокол, и, таким образом, возможен сценарий, когда несколько сокетов сервера прослушивают один и тот же порт. Это означает, что нам нужно создать механизм, чтобы один клиентский сокет мог указывать, какой из нескольких серверных сокетов, прослушивающих один и тот же порт, должен быть выбран. В этом ключе, как вы можете видеть, нет разногласий по поводу src-port клиентского сокета; и решение лежит в протоколе клиентского сокета. Выбран серверный сокет из всех прослушивающих порт, который соответствует протоколу клиентского сокета. - person KGhatak; 19.07.2015
comment
@ Мисс Люси - я полагаю, ваш вопрос должен быть новым постом, но я все равно отвечу быстро. Я не знаю конкретно о «буферах протокола Google», но в целом транспортный уровень, который входит в состав ОС, позволяет открывать и управлять несколькими одновременными подключениями. Однако то, как сервер будет их обрабатывать, - это ответственность прикладного уровня. Если сервер не является многопоточным, он будет без необходимости заблокирован для обслуживания предыдущего соединения. Надеюсь, это поможет! - person KGhatak; 19.07.2015
comment
потрясающее объяснение. Спасибо. - person DrunkenMaster; 04.11.2016
comment
голосовать за ненужные безгосударственные / полные протоколы. - person weefwefwqg3; 02.03.2017
comment
Сокет TCP может быть идентифицирован по 4-кортежу, поскольку часть TCP уже подразумевается. Вы все время говорите о «привязке» клиента, где вы, кажется, имеете в виду «соединение». Два процесса могут прослушивать один и тот же TCP-порт, если они оба привязаны к разным локальным IP-адресам, и ни один из них не является INADDR_ANY. - person user207421; 30.05.2017
comment
@EJP: Спасибо, что указали на неправильное использование «привязки» - я скоро отредактирую, чтобы заменить их на «подключиться». По поводу двух других моментов - вы правы, и они также соответствуют идее кортежа сокетов, о котором я упоминал. Если вы зафиксируете протокол как UDP, TCP и т. Д., То кортеж уменьшится до 4 элементов. - person KGhatak; 30.05.2017
comment
Утверждение A, которое слушает, может быть прослушано многими другими процессами A1, A2, .., пока они связаны отношениями родитель-потомок с A., неверно для UNIX-подобных систем, как сказал @Tuxdude, возможно совместно использовать файловые дескрипторы сокета с сообщениями локального домена UNIX, таким образом, совместно используя несвязанный процесс. - person Johnny Willer; 18.08.2017
comment
приятные объяснения, чувак! - person atiqkhaled; 01.03.2018

Прослушивание TCP / HTTP на портах: как многие пользователи могут использовать один и тот же порт

Итак, что происходит, когда сервер прослушивает входящие соединения через порт TCP? Например, предположим, что у вас есть веб-сервер на порту 80. Предположим, что ваш компьютер имеет общедоступный IP-адрес 24.14.181.229, а человек, который пытается подключиться к вам, имеет IP-адрес 10.1.2.3. Этот человек может подключиться к вам, открыв TCP-сокет на 24.14.181.229:80. Достаточно просто.

Интуитивно (и ошибочно) большинство людей предполагает, что это выглядит примерно так:

    Local Computer    | Remote Computer
    --------------------------------
    <local_ip>:80     | <foreign_ip>:80

    ^^ not actually what happens, but this is the conceptual model a lot of people have in mind.

Это интуитивно понятно, потому что с точки зрения клиента у него есть IP-адрес, и он подключается к серверу по IP: PORT. Поскольку клиент подключается к порту 80, то его порт тоже должен быть 80? Это разумная мысль, но на самом деле не то, что происходит. Если бы это было правильно, мы могли бы обслуживать только одного пользователя на каждый внешний IP-адрес. После подключения удаленного компьютера он будет подключать порт 80 к порту 80, и никто другой не сможет подключиться.

Следует понимать три вещи:

1.) На сервере процесс прослушивает порт. Как только он получает соединение, он передает его другому потоку. Связь никогда не перегружает порт прослушивания.

2.) Соединения однозначно идентифицируются операционной системой с помощью следующих пяти кортежей: (локальный IP, локальный порт, удаленный IP, удаленный порт, протокол). Если какой-либо элемент в кортеже отличается, то это полностью независимое соединение.

3.) Когда клиент подключается к серверу, он выбирает случайный неиспользуемый исходный порт высокого порядка. Таким образом, один клиент может иметь до ~ 64 КБ подключений к серверу для одного и того же порта назначения.

Итак, это действительно то, что создается, когда клиент подключается к серверу:

    Local Computer   | Remote Computer           | Role
    -----------------------------------------------------------
    0.0.0.0:80       | <none>                    | LISTENING
    127.0.0.1:80     | 10.1.2.3:<random_port>    | ESTABLISHED

Глядя на то, что происходит на самом деле

Во-первых, давайте с помощью netstat посмотрим, что происходит на этом компьютере. Мы будем использовать порт 500 вместо 80 (потому что на порте 80 происходит много всего, так как это общий порт, но функционально это не имеет значения).

    netstat -atnp | grep -i ":500 "

Как и ожидалось, результат пуст. Теперь запустим веб-сервер:

    sudo python3 -m http.server 500

Теперь вот результат повторного запуска netstat:

    Proto Recv-Q Send-Q Local Address           Foreign Address         State  
    tcp        0      0 0.0.0.0:500             0.0.0.0:*               LISTEN      - 

Итак, теперь есть один процесс, который активно прослушивает (Состояние: LISTEN) порт 500. Локальный адрес - 0.0.0.0, что означает "прослушивание для всех". Легкая ошибка - это прослушивание адреса 127.0.0.1, который будет принимать соединения только с текущего компьютера. Итак, это не соединение, это просто означает, что процесс запросил привязку () к IP-адресу порта, и этот процесс отвечает за обработку всех подключений к этому порту. Это намекает на ограничение, согласно которому на каждом компьютере может быть только один процесс, прослушивающий порт (есть способы обойти это с помощью мультиплексирования, но это гораздо более сложная тема). Если веб-сервер прослушивает порт 80, он не может использовать этот порт для других веб-серверов.

Итак, теперь давайте подключим пользователя к нашей машине:

    quicknet -m tcp -t localhost:500 -p Test payload.

Это простой скрипт (https://github.com/grokit/dcore/tree/master/apps/quicknet), который открывает сокет TCP, отправляет полезные данные (в данном случае «тестовые данные»), ждет несколько секунд и отключается. Повторное выполнение netstat во время этого процесса отображает следующее:

    Proto Recv-Q Send-Q Local Address           Foreign Address         State  
    tcp        0      0 0.0.0.0:500             0.0.0.0:*               LISTEN      -
    tcp        0      0 192.168.1.10:500        192.168.1.13:54240      ESTABLISHED -

Если вы подключитесь к другому клиенту и снова выполните netstat, вы увидите следующее:

    Proto Recv-Q Send-Q Local Address           Foreign Address         State  
    tcp        0      0 0.0.0.0:500             0.0.0.0:*               LISTEN      -
    tcp        0      0 192.168.1.10:500        192.168.1.13:26813      ESTABLISHED -

... то есть клиент использовал другой случайный порт для соединения. Таким образом, между IP-адресами никогда не бывает путаницы.

person N0thing    schedule 28.11.2014
comment
это должен быть главный ответ - person cha; 16.04.2015
comment
Страница github.com/grokit/quickweb выдает ошибку 404 - person Alexandre Santos; 03.07.2015
comment
127.0.0.1 - это адрес, а не порт. - person user207421; 19.01.2016
comment
@ N0thing Мой сервер создает только один процесс, без потоков для обработки нескольких подключений. Это почему ? - person Danish Bin Sofwan; 03.10.2016
comment
telnet localhost 500 - это более простой способ создать постоянное соединение. - person Devs love ZenUML; 18.03.2017
comment
Вы говорите «5-кортеж: (локальный IP, локальный порт, удаленный IP, удаленный порт, протокол)», так можно ли запустить два сервера с разными протоколами на 1 порте? например один TCP и один HTTP? Почему, если нет? - person voltento; 17.01.2018
comment
можно просто использовать nc 0.0.0.0 500 для подключения к серверу, а если вы используете python 2, `python -m SimpleHTTPServer 500` запускает http-сервер. - person Jayhello; 25.10.2018
comment
Строка 127.0.0.1:80 | 10.1.2.3:<random_port> | ESTABLISHED невозможна. - person user207421; 16.06.2019

Обычно для каждого подключающегося клиента сервер создает дочерний процесс, который взаимодействует с клиентом (TCP). Родительский сервер передает дочернему процессу установленный сокет, который отвечает клиенту.

Когда вы отправляете данные в сокет с вашего дочернего сервера, стек TCP в ОС создает пакет, возвращающийся клиенту, и устанавливает для параметра «порт отправителя» значение 80.

person m1tk4    schedule 25.07.2010
comment
Итак, если бы сервер сказал, что 1000 одновременных подключений (я знаю, что это высокий уровень), ему пришлось бы бороться с 1000 потоков !? Это кажется неконтролируемым. Или используются волокна (нарезка резьбы). - person IamIC; 26.07.2010
comment
@IanC Не все веб-серверы являются многопоточными (Apache с рабочим модулем) или многопроцессорными (Apache с модулем pre-fork). Ищите Lighty (формально Lighttpd) и NginX для некоторых очень способных непоточных веб-серверов. Даже в многопоточной среде вам не нужно обрабатывать все входящие соединения одновременно. Вы можете использовать очередь с заранее установленным максимальным размером. - person Ashkan Kh. Nazary; 26.01.2012
comment
Итак, поскольку считается, что пакет, отправленный обратно клиенту, поступает с порта 80, означает ли это, что данные проходят через главный сервер, чтобы их можно было снова направить соответствующему дочернему процессу? - person Griffin; 28.01.2012
comment
Таким образом, поскольку заголовок в пакете, который возвращается клиенту, называется портом 80, это не означает, что клиентская программа будет постоянно искать - person Griffin; 28.01.2012
comment
@ m1tk4, значит ответ на самом деле идет с порта 80.? Более того, поскольку клиент использует конвейерную обработку HTTP / 1.1, то есть несколько GET через один и тот же сокет. Таким образом, даже если HTTP не имеет состояния, а сокет клиент-сервер / TCP - нет, ответ должен исходить от того же дочернего процесса. - person d1val; 09.10.2012

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

Когда клиент пытается подключиться к серверу через порт 80, в сокете сервера вызывается вызов accept. Это создает новый сокет для клиента, пытающегося подключиться, и аналогично новые сокеты будут созданы для последующих клиентов, использующих тот же порт 80.

Слова, выделенные курсивом, - это системные вызовы.

Ссылка

http://www.scs.stanford.edu/07wi-cs244b/refs/net2.pdf

person pumpkin_cat    schedule 04.03.2016