Розуміння портів: Як одночасно спілкуються кілька вкладок браузера? [зачинено]


18

Сьогодні я зрозумів, що я принципово не розумію, як працює порт-комунікація.

Якщо я запускаю примірник веб-сервера, який прослуховує порт 80, він може відповідати на багато запитів з багатьох різних вкладок браузера, всі вони спілкуються через порт 80.

Однак я не можу запустити два екземпляри сервера, обидва прослуховування на порту 80, оскільки це призводить до конфлікту портів.

Я завжди сприймав це як даність (лише один процес може прив’язатись до певного порту в будь-який момент часу), не розуміючи це - чи не існує декількох процесів, що спілкуються на порту 80? (тобто, кожна з вкладок, що працює в браузері?)

Відповіді:


24

В основному, лише один процес може ЛИСТИТИ на порт одночасно (технічно один провід призначений для прослуховування). Але порт може працювати з багатьма сокетами, що передають дані, сокет - це комбінація локального IP / порту та віддаленої IP-адреси / віддаленого порту. Таким чином, як тільки сервер приймає вхідне з'єднання під час LISTENing, він відкриває новий розетку, присвячену цій розмові, і передає обробку щось інше, а потім повертається до LISTENing.

Детальніше тут .


Насправді ви можете мати кілька процесів прослуховування в одному порту. Якщо ви зробите це, наприклад, з кількома читачами udp, ви отримаєте балансування навантаження на рівні ядра. Спочатку відкрийте розетку для прослуховування, потім роздрібніть і спробуйте recv()в кожному процесі.
viraptor

5
@viraptor: Правда, але оскільки UDP не має зв'язку, насправді немає різниці між "прослуховуванням" та "отриманням".
Адам Робінсон

Ця ж ідея працює з TCP, розгортаючи процес з прослуховуванням сокета і приймаючи () на обох.
viraptor

Власне, розетка - це лише одна «кінцева точка» для спілкування. Я думаю, що ви хотіли сказати, що підключений сокет - це комбінація локального IP / порту та віддаленого IP / адреси / віддаленого порту. Слово socket так часто використовується, що мені важко було зрозуміти, що це за фактичний опис
westoque

14

Браузер підключається від випадкового високого (тобто> 1024) порту на вашому комп'ютері до порту віддаленого сервера 80. Тому на вашій машині немає конфлікту портів.

Якщо ви використовуєте багато вкладок для підключення до одного і того ж віддаленого сервера (або є багато користувачів, які підключаються до сервера), всі вони переходять на один і той же порт і обслуговуються одним і тим же процесом (тобто веб-сервером сайту).


2
Це правильна відповідь. TCP-з'єднання мають номер порту на обох кінцях. Обидва комп'ютери, що займаються, можуть розрізняти веб-сайт для з'єднання: 80 <-> браузер: 12397 та різні веб-сайти підключення: 80 <-> браузер: 22958.
pjc50

7

Сервер, який прослуховує порт 80, НЕ МОЖЕ обробляти декілька процесів. Прості демони TCP старших років могли одночасно обробляти лише одне з'єднання. Ви можете наслідувати цю поведінку за допомогою програми, такої як netcatпрослуховування на певному порті, і спробувати підключити до неї дві машини. Один увійде, інший відскочить без зв’язку. Ці демони здебільшого марні, тому їх більше ніколи не бачиш.

Щось на зразок веб-сервера, воно прослуховує безпосередньо на порту. Що потрібно пам’ятати, це те, що він сидить зверху бібліотеки сокетів операційної системи. Коли встановлено нове з'єднання, бібліотека сокет передає абсолютно новий сокет програмному забезпеченню веб-сервера. У цей момент у веб-серверного програмного забезпечення є деякі варіанти.

Однією з можливостей є те, що він передає об'єкт socket новому потоку в тому ж процесі. Щоразу, коли спілкування відбувається через цю розетку, ця нитка буде обробляти її. Батьківський процес опосередковує, які потоки активні в будь-який момент часу, що може бути багато.

Інша можливість полягає в тому, що він запускає новий процес і передає об'єкт socket в процес. Наскільки я розумію, тепер справа в розетці операційної системи опосередковує зв'язок між цими дочірніми процесами та їх цілями. Батьківський процес все ще має певний контроль над процесами, такими як вбивство повішених та інші міжпроцесові комунікації.

Який із цих підходів є більш ефективним, залежить від операційної системи. IIRC, Apache може працювати в будь-якому режимі.

По суті, бібліотека сокет забезпечує рівень паралельної обробки веб-сервера. Він може працювати з декількома одночасними з'єднаннями, активно передаючи дані, все приймаючи нові з'єднання.

Для браузера, який може запускати кілька спроб підключення до веб-сервера, щоб покращити час завантаження, паралелізм застосовується і на кінці браузера, це добре і чудово. Веб-переглядач відслідковує стан сторінки під час її завантаження, і кілька спроб з’єднання, які вона закручує, - це частина процесу.


+1 за те, що ви
маєте

2

Фактично є два "типи" потокових розеток. У одного є "інший кінець" з макрою карткою, в іншого є специфічний хост: порт для іншого кінця.

Жодна з двох розеток не може (або, вірніше, коли-небудь) мати однакові ідентифікатори "цей кінець" та "інший кінець". Розділ, який "прослуховується" (приймає вхідні з'єднання), є тим, що має "інший кінець", маючи підкреслену картку, тому може існувати лише одна за одною. По мірі підключення acceptвідбувається анкета, повертаючи сокет з вузлом: кортеж порту для іншого кінця.


1

Ваше запитання нагадує мене про себе кілька років тому перед Cisco CCNA - були ті самі сумніви :)

По-перше, встановлення декількох HTTP-з'єднань не обов'язково прив'язується до кількості відкритих вами вкладок у вашому браузері. Наприклад, відвідуючи сайт з рекламою або кодом аналітики Google, ви підключатиметесь до кількох сайтів, незважаючи на те, що перебуваєте лише на одній вкладці.

У будь-якому випадку, коли ваш браузер спілкується з веб-сервером, портом призначення трафіку, що надсилається на веб-сервер, є порт 80, а вихідний порт - випадкове число. Порт джерела повинен повідомити веб-серверу, про який порт він повинен вам повідомляти. У кожного встановленого http-зв’язку на комп’ютері відкриється власний порт. Спробуйте запустити netstat з кількома веб-сайтами, і ви відразу побачите, що я маю на увазі.

Ви можете посміятися, але ця книга - це чудовий та швидкий спосіб знизити основи TCP / IP. Це мені дуже допомогло.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.