Что Именно Происходит, Когда Пользователь Вводит Google.com В Адресную Строку? Часть 1

Перевод первой части материал с github , в котором подробно объясняется, как работает Интернет: что именно происходит, когда пользователь вводит google.com в адресную строку?



Кнопка «Ввод» возвращается в исходное положение.

Чтобы начать обратный отсчет, выберите момент, когда кнопка «ввод» будет утоплена.

В этот момент замыкается цепь, отвечающая за эту кнопку.

Через логические схемы клавиатуры протекает небольшой ток.

Они сканируют состояние всех переключателей, нейтрализуют паразитные электрические импульсы и преобразуют нажатие в код ключа 13. Контроллер кодирует код для передачи на компьютер.

Сейчас это почти всегда делается через USB или Bluetooth, но раньше в этом процессе участвовали PS/2 или ADB.

Если это USB

USB в клавиатуре питается напряжением 5В через первый контакт хост-контроллера USB на компьютере.

Код клавиши хранится в памяти клавиатуры в регистре «конечная точка».

Каждые 10 миллисекунд USB-контроллер запрашивает данные из этого регистра.

Так он получает сохраненные коды.

Код отправляется в USB SIE (механизм последовательного интерфейса) и преобразуется в один или несколько пакетов протокола USB низкого уровня.

Пакеты передаются посредством дифференциального электрического сигнала на контактах D+ и D- с максимальной скоростью 1,5 Мбит/с, поскольку HID (Human Interface Device) считается низкоскоростным устройством.

Затем последовательный сигнал декодируется в контроллере и интерпретируется драйвером HID клавиатуры.

Значение кода передается на уровень абстракции оборудования операционной системы.



Если это виртуальная клавиатура (сенсорный экран)

Когда пользователь прикасается пальцем к емкостному экрану, между пальцем и пальцем проходит небольшой ток.

Это замыкает цепь в электростатическое поле проводящего слоя и создает падение напряжения в этой точке экрана.

Контроллер экрана вызывает прерывание, сообщая координаты печати.

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

Клавиатура вызывает прерывание для отправки сообщения о нажатии клавиши в ОС.



Происходит прерывание (не на USB-клавиатуре)

Клавиатура отправляет запрос прерывания (IRQ), который контроллер прерываний отображает в вектор прерывания.

ЦП использует IDT для сопоставления векторов с функциями обработчика прерываний, предоставляемыми ядром.

При поступлении прерывания ЦП запускает необходимый обработчик.

Так мы добираемся до сути.



(Windows) В приложение отправляется сообщение WM_KEYDOWN.

HID передает событие щелчка драйверу KBDHID.sys, который преобразует его в скан-код. В нашем случае он равен VK_RETURN (0x0D).

Этот драйвер взаимодействует с драйвером KBDCLASS.sys. Последний отвечает за безопасную обработку ввода с клавиатуры.

Он вызывает Win32K.sys (возможно, после прохождения сообщения через различные фильтры клавиатуры).

Это происходит в режиме ядра.

Win32K.sys знает, какое окно активно, через API GetForegroundWindow().

Этот API предоставляет обработчик входной строки браузера.

Затем система обмена сообщениями Windows вызывает SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam).

lParam – битовая маска, содержащая дополнительную информацию о нажатии – повторах, сканкоде, нажаты ли дополнительные клавиши и т.д. API SendMessage добавляет сообщение в очередь для указанного дескриптора окна (hWnd).

Позже для обработки очереди вызывается функция обработки сообщений WindowProc. Активное окно hWnd является окном редактирования, и в этом случае WindowProc имеет обработчик сообщений для WM_KEYDOWN. Поскольку был передан код VK_RETURN, он знает, что пользователь нажал Enter.

(OS X) KeyDown NSEvent отправляется в приложение

Сигнал прерывания запускает событие в драйвере набора ввода-вывода.

Он преобразует сигнал в код ключа и передает его процессу WindowServer. Он создает событие для активных приложений через их порт Mach. События ставятся в очередь этими приложениями.

Их читают оттуда потоки, имеющие соответствующий уровень доступа, с помощью функции mach_ipc_dispatch. Чаще всего это делается через основной цикл NSApplication с использованием NSEvent/NSEventType KeyDown.

(GNU/Linux) Сервер Xorg отслеживает коды

При использовании графического сервера X для получения кода будет использоваться драйвер evdev. По существующим правилам код ключа будет преобразован в сканкод. Затем символ передается оконному менеджеру (DWM, Metacity, i3 и т. д.), который, в свою очередь, передает символ окну, имеющему фокус.

Графический API окна получает символ и отображает соответствующий символ в окне, находящемся в фокусе.



Парсинг URL-адресов

Браузер теперь имеет следующую информацию из URL-адреса (унифицированный указатель ресурсов):
Протокол «http» — используйте «Протокол передачи гипертекста».

Ресурс "/" – запрос главной страницы



Это URL-адрес или поисковый запрос?

Если протокол не указан и строка не является допустимым именем домена, браузер передает этот текст поисковой системе по умолчанию.



Проверка списка HSTS

Браузер проверяет список HSTS (HTTP Strict Transport Security).

Это список сайтов, доступ к которым разрешен только через HTTPS. Если сайт есть в списке, то браузер отправляет запрос по протоколу HTTPS. В противном случае — через HTTP. Конвертируем в имени сервера символы, не принадлежащие таблице ASCII. Браузер проверяет наличие символов, не входящих в диапазоны a-z, A-Z, 0-9, -,.

Поскольку у нас есть google.com, таких символов не будет. В противном случае к имени сервера будет применена кодировка Punycode.

DNS-запрос

Браузер проверяет, находится ли домен в KЭShe. Если нет, вызывается библиотечная функция gethostbyname (в зависимости от ОС).

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

Если это не помогает, делается запрос к DNS-серверу, который указан в настройках сети.

Это либо локальный роутер, либо DNS-сервер провайдера.

Если DNS-сервер находится в одной подсети, библиотека работает с сервером по ARP. В противном случае запрос отправляется на IP-адрес стандартного шлюза.



ARP (протокол разрешения адресов)

Чтобы отправить широковещательный ARP-запрос, сетевому стеку необходимо знать IP-адрес получателя и MAC-адрес интерфейса, который будет для этого использоваться.

Сначала ARP-кеш проверяется на наличие IP-адреса получателя.

Если он есть в кеше, возвращается результат «IP получателя = MAC».

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

Если он есть, используется интерфейс, назначенный этой подсети.

В противном случае библиотека использует интерфейс подсети шлюза по умолчанию.

Затем ищется MAC-адрес выбранного интерфейса и отправляется запрос ARP уровня 2:

  
   

Sender MAC: interface:mac:address:here Sender IP: interface.ip.goes.here Target MAC: FF:FF:FF:FF:FF:FF (Broadcast) Target IP: target.ip.goes.here

Если компьютер подключен к маршрутизатору напрямую, маршрутизатор выдает ответ ARP. Если соединение идет через хаб, он передает запрос на все порты.

Если там есть роутер, он даст ответ. Если соединение осуществляется через коммутатор, он определит по своей таблице CAM/MAC, какой порт имеет требуемый MAC-адрес.

Если не найдет, то разошлет запрос по всем портам.

А если найдет, то отправит запрос на порт, где находится нужный MAC. Ответ АРП:

Sender MAC: target:mac:address:here Sender IP: target.ip.goes.here Target MAC: interface:mac:address:here Target IP: interface.ip.goes.here

Теперь у библиотеки есть IP-адрес либо DNS-сервера, либо шлюза по умолчанию.

Вы можете продолжить процесс распознавания домена.

Порт 53 открывается и на сервер отправляется UDP-запрос (при больших запросах используется TCP).

Если DNS-сервер не имеет информации, то запрашивается рекурсивный поиск, который проходит по списку DNS-серверов, пока не достигнет SOA и не будет найден нужный ответ.

Открытие розетки

Когда браузер получает IP-адрес целевого сервера, он вместе с портом (для HTTP порт по умолчанию — 80, для HTTPS — 443) использует их как параметры для вызова функции сокета и запрашивает TCP-поток сокетов — AF_INET и СОК_СТРИМ.

Этот запрос сначала передается на транспортный уровень, где создается сегмент TCP. Порт назначения добавляется в заголовок, а порт источника выбирается динамически из списка портов ядра (в Linux это ip_local_port_range).

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

Затем пакет поступает на канальный уровень.

К нему добавляется заголовок кадра, который содержит MAC-адрес компьютера и шлюза (локального маршрутизатора).

Если ядру неизвестен MAC-адрес шлюза, для его выяснения отправляется широковещательная рассылка ARP. И теперь наша посылка готова к отправке через Ethernet, Wi-Fi или мобильное соединение.

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

Этот сигнал может передаваться по телефону, кабелю или беспроводному соединению.

Принимающий модем преобразует его обратно в цифровую форму, откуда он поступает на следующий узел сети, где происходит дальнейший анализ адресов отправителя и получателя.

Иногда пакет отправляется напрямую через Ethernet или оптоволокно, тогда он остается цифровым и достигает следующего узла сети.

В конце концов сигнал достигает маршрутизатора локальной подсети.

Оттуда он проходит через пограничные маршрутизаторы AS, другие AS и достигает сервера назначения.

Каждый маршрутизатор на своем пути извлекает IP-адрес назначения и передает пакет следующему узлу.

В этом случае TTL в пакете уменьшается на единицу.

Пакет отбрасывается, если он достигает нуля или если на текущем маршрутизаторе заканчивается место в очереди.

Пакеты отправляются и принимаются несколько раз в рамках TCP-соединения.

Сначала клиент выбирает начальный порядковый номер (ISN) и отправляет пакет на сервер, устанавливая бит SYN, чтобы было ясно, что это ISN. Если сервер получает SYN и находится в хорошем настроении, он выбирает свой ISN, устанавливает SYN, чтобы указать, что пакет содержит ISN, копирует ISN+1 клиента в поле ACK и добавляет флаг ACK для подтверждения получения.

первого пакета.

Клиент подтверждает соединение, отправляя пакет, в котором увеличивается его ISN, увеличивается ISN отправителя и устанавливается поле ACK. Данные передаются следующим образом: когда одна сторона отправляет N байт, она увеличивает SEQ на это число.

Когда другая сторона подтверждает получение пакета (или их цепочки), она отправляет пакет ACK, где значение ACK равно последней последовательности, полученной от другой стороны.

Чтобы закрыть соединение, закрывающая сторона отправляет пакет FIN, другая сторона подтверждает получение пакета и отправляет свой FIN, а первая сторона подтверждает его получение.

Теги: #Google.com #usb #ARP #ethernet #irq #http #HTTPS #mac #IP #socket #socket #browsers

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.