Чи веб-браузери використовують різні вихідні порти для різних вкладок?


58

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

Або браузер використовує один порт для управління всіма вкладками, а отже, і всіма доменами ?.


Під час підключення до веб-сайтів браузери використовують 2 порти, 80 - для підключення http, 443 - для з'єднань https. en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
Моаб

7
Я знаю порти, які використовувались для підключення до сервера, але мені було цікаво про номери портів, які використовуються для з'єднання з клієнтом (хост-комп'ютером).
yoyo_fun

2
Я думаю, що термін "вихідні порти" є неточним. Порти двонаправлені. Може, ти міг сказати. натомість "локальні порти". Локальні порти використовуються як вихідні (вихідні) порти для надсилання запитів, а цільові (вхідні) порти для отримання відповідей.
Рон Мопін

6
Порти призначаються ОС, а кожному новому з'єднанню присвоюється новий локальний порт, щоб він відрізнявся від усіх інших відкритих з'єднань.
Ex Exbrbris

1
@ExUmbris: Це може бути розумна і проста стратегія, але TCP-з'єднання ідентифікуються квадратиком {локальний IP, локальний порт, віддалений IP, віддалений порт}. Локальний порт не потрібен для унікальності, що добре: веб-сервер взагалі не може використовувати свій локальний порт для унікальності. І з точки зору веб-сервера, віддалений IP не є унікальним, оскільки кілька користувачів можуть бути розташовані за одним шлюзом / проксі.
MSalters

Відповіді:


55

Чи використовують браузери різні порти для підключення до різних веб-сайтів?

Так, вони роблять.

Ось приклад, який показує мої поточні підключення Firefox (у мене є 9 відкритих вкладок) у Windows 7:

введіть тут опис зображення

Примітки:

  • Видно, що локальні порти всі різні.

  • Зазвичай віддалені порти становлять 80 (HTTP), 443 (HTTPS) або 8080 (HTTP Alternate).

  • Повний процес надання веб-сторінки описаний нижче. Дивіться, зокрема, кроки 5, 6, 13 та 15 (які виділені жирним шрифтом):

    • У загальному випадку надання однієї веб-сторінки використовує декілька підключень, не всі з яких будуть мати однакову віддалену адресу.

    • Це тому, що веб-сторінки часто містять ресурси, розміщені в інших місцях (файли javascript тощо).

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


Надання веб-сторінки - поетапно

Примітка:

  • Кроки 5, 6, 13 та 15 (виділені жирним шрифтом) мають безпосереднє відношення до питання.

Ви коли-небудь замислювалися про те, що станеться, коли ви переглядаєте Інтернет? Це не так просто, як здається:

  1. Ви вводите URL-адресу в адресний рядок у вибраному веб-переглядачі.
  2. Браузер аналізує URL-адресу, щоб знайти протокол, хост, порт і шлях.
  3. Він формує HTTP-запит (це був, швидше за все, протокол)
  4. Щоб дістатися до хоста, спочатку потрібно перевести хост, прочитаний людиною, в IP-номер, і це зробити, зробивши пошук DNS на хості
  5. Тоді розетку потрібно відкрити з комп'ютера користувача на той номер IP на вказаний порт (найчастіше порт 80)
  6. Коли з'єднання відкрите, запит HTTP надсилається хосту
  7. Хост пересилає запит на серверне програмне забезпечення (найчастіше Apache), налаштоване на прослуховування на вказаний порт
  8. Сервер перевіряє запит (найчастіше лише шлях) і запускає серверний плагін, необхідний для обробки запиту (відповідає мові сервера, яку ви використовуєте, PHP, Java,. NET, Python?)
  9. Плагін отримує доступ до повного запиту та починає готувати відповідь HTTP.
  10. Для побудови відповіді база даних (швидше за все) доступна. Пошук у базі даних проводиться на основі параметрів у шляху (або даних) запиту
  11. Дані з бази даних разом з іншою інформацією, яку плагін вирішує додати, об'єднуються у довгий рядок тексту (можливо, HTML).
  12. Плагін поєднує ці дані з деякими метаданими (у вигляді заголовків HTTP) і відсилає відповідь HTTP назад у браузер.
  13. Браузер отримує відповідь і аналізує HTML (який з 95% вірогідністю порушено) у відповіді
  14. Дерево DOM будується з зламаного HTML
  15. Нові запити надсилаються до сервера для кожного нового ресурсу, який знаходиться у джерелі HTML (як правило, зображення, таблиці стилів та файли JavaScript). Поверніться до кроку 3 і повторіть для кожного ресурсу.
  16. Таблиці стилів аналізуються, і інформація відтворення в кожній з них приєднується до відповідного вузла в дереві DOM
  17. Javascript розбирається і виконується, і вузли DOM переміщуються, і інформація про стиль оновлюється відповідно
  18. Браузер відображає сторінку на екрані відповідно до дерева DOM та інформації про стиль для кожного вузла
  19. Ви бачите сторінку на екрані
  20. Ви дратуєтесь, весь процес був надто повільним.

Відображення джерел веб-сторінки - поетапно


63

Кожне з'єднання з веб-сайтом використовує інший сокет з портом призначення TCP за замовчуванням 80 для звичайного HTTP та 443 для HTTPS. Щоб сокет був унікальним, комбінація IP-адреси вихідного сигналу, вихідного TCP-порту, IP-адреси призначення та порту TCP-призначення повинна бути різною.

Якщо у вас є кілька підключень до одного веб-сайту (якщо припустимо, що веб-сайт використовує лише 1 IP-адресу) з одного комп’ютера, слід використовувати інший вихідний порт TCP. Таким чином, кожне з'єднання є унікальним.

Однак слід зазначити, що, як і для HTTP 1.1, всі з'єднання є стійкими протягом певного періоду часу (якщо не заявлено інше). Це означає, що ваш веб-переглядач може повторно використовувати одне і те ж з'єднання, якщо запитується декілька ресурсів з одного веб-сайту (наприклад, файли css / js). Це також стосується, якщо у вашому браузері є кілька примірників одного веб-сайту.

Якщо ви працюєте в Windows, netstat -no -p TCPкоманда покаже вам всі активні сокети TCP та їх відповідний ідентифікатор процесу, включаючи дані вашого браузера:

введіть тут опис зображення

Якщо ви перебуваєте на Unix / Linux (у цьому випадку Debian), ви можете скористатися командою netstat -ntpабо ss -t:

введіть тут опис зображення


4
Зауважте, що netstat також відображатиме підключення, що не є веб-переглядачем, наприклад підключення електронної пошти для клієнта електронної пошти, з'єднання новин для зчитування новин. Ці з'єднання будуть на різних віддалених портах.
DavidPostill

Якщо я щось не пропускаю, здається, ви робите припущення, що запитувач використовує Windows, хоча він не згадував про операційну систему. Також добре перелічити, на яку ОС ви звертаєтесь, коли надаєте команди консолі.
user45623

9
@ user45623: Хоча скріншот є екраном Windows, він netstat -nповинен працювати в більшості операційних систем, включаючи Linux та Mac OS.
Хайнзі

1
У Windows (можливо, і в інших ОС) ви можете використовувати, netstat -n -oщоб побачити, який процес створив з'єднання. Або ви можете запустити tcpview SysInternal, щоб переглянути список у графічному інтерфейсі, з іменами процесів та піктограмами та всім іншим .
Джонатан

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

11

Що стосується вкладок для різних веб-сайтів, то в TCP немає нічого, що вимагає, щоб локальний порт був різним, доки кортеж {local IP, local port, target IP, target port} є унікальним. Що стосується вкладок на той же веб-сайт, ситуація набагато складніша.

Браузер, як і будь-який інший фрагмент клієнтського програмного забезпечення, використовує інший локальний порт за вихідне з'єднання до тієї ж цілі. Загалом, він формуватиме декілька підключень до будь-якого веб-сайту, щоб отримати вбудовані ресурси, такі як зображення, CSS, JavaScript тощо. Він також об'єднає ці з'єднання для можливого повторного використання.

Неможливо сказати, чи будуть використовувати різні вкладки на одному веб-сайті різні з'єднання, оскільки (а) як правило, не існує жодного з'єднання на вкладку, і (b) залежно від часу та автентифікації, з'єднання можуть бути повторно використані між вкладками; і як неможливо ідентифікувати з'єднання, тому і локальні порти неможливо ідентифікувати.


Дякую. Що означає "об'єднання" з'єднання?
yoyo_fun

Замість того, щоб закривати його, поверніть його до пулу та закрийте його лише тоді, коли він залишається там простою протягом певного інтервалу очікування; і спочатку загляньте в пул, перш ніж створити нове підключення до цієї цілі. Ось як реалізується HTTP-режим зберігання.
користувач207421

Отже, пул - це структура даних у пам'яті, яка зберігає відкриті та ще не закриті з'єднання?
yoyo_fun

Це правильно, як правило, карта, введена цільовим IP: портом.
користувач207421

2
@EJP: Зауважте, що для HTTPS не можна захищати карту цільовим IP-адресом та портом; Вам також потрібно розрізняти з'єднання з різними іменами хостів, навіть якщо вони трапляються для одного і того ж IP та порту. Можливо, веб-переглядач також повинен тримати з'єднання для різних вкладок, якщо хоча б одна вкладка перебуває в режимі анонімного перегляду.
Геннінг Макгольм

6

Так. Ні, можливо. Це залежить.

По-перше, браузер може використовувати будь-яку з цих стратегій для з'єднань:

  1. Єдине підключення (малоймовірно для будь-якого веб-переглядача останніх 1995 року)
  2. Одне підключення на вкладку (в основному таке ж, як №1, просто трохи краще)
  3. Одне з'єднання на ресурс (наївне, але працює не так погано)
  4. Басейн з'єднань з підтримкою "живого", повторне використання з'єднань
  5. Щось інше (читайте як: дивні речі)

У вас немає способу знати, яку стратегію використовуватиме браузер, хоча використання пулу з'єднань (і повторне використання з'єднань) є розумним припущенням.

По-друге, як працює TCP, ви маєте вихідний порт і порт призначення для кожного з'єднання. Пара джерела і адреса призначення / порт визначає з'єднання.
Ви завжди [1] використовуєте відомий порт (наприклад, 80 або 443) для підключення до сервера (до якого він слухає свою рекламну адресу), але інший порт вибраний випадковим чином. Таким чином, залежно від того, з якої сторони ви дивитесь на з'єднання, він або має один, або багато можливих портів.

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

Оскільки в питанні прямо згадується вихідний , у "нормальному" випадку номери портів будуть однаковими незалежно від того, на якій вкладці вони перебувають, або одного з двох можливих портів (80 та 443). Хоча, звичайно, можна явно попросити інший порт (наприклад, 8080) в URL-адресі. Хоча це рідко.


[1] Ну не завжди ... але давайте не надто ускладнювати це.


Ще один фактор ... порт клієнта зазвичай обирається ОС, а не браузером; і порт клієнта, який бачить сервер, може відрізнятися від того, який бачить браузер, якщо з'єднання проходить через NAT-пристрій. Більшість ОС виділяють лінійно або випадковим чином у межах (налаштовується) ефемерних портів, але браузер може запросити один і той же вихідний порт через кілька підключень до різних серверів. (І ОП запитує про клієнтські порти, а не про порти сервера.)
David

@david: Важко сказати, хто з них правильний (або на що відповісти), оскільки питання Q неоднозначно, отже, моя дещо тривала екскурсія. ОП запитує про вихідний порт клієнта. "Клієнт" припускає, що ми говоримо про вихідний порт (в термінах TCP), який вибирається вільно або випадковим чином (впровадженням), але "вихідний" говорить про те, що мова йде саме про порт призначення . Що набагато краще описано як "порт на сервері" простими словами. Ваш коментар щодо NAT правильний, як видно з сервера, але не впливає на клієнта.
Деймон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.