당신의 브라우저 주소창에 google.com을 치고 엔터를 누르면 어떤일이 일어날까?

이종호·2022년 12월 29일
0

https://github.com/SantonyChoi/what-happens-when-KR 글을 따라써보며 머리속으로 정리해보는 연습장입니다.

Table of Contents

  • "g"키를 누르면
  • "엔터"키가 쏙 들어갑니다.
  • 인터럽트 발생 [키보드가 USB가 아닌경우 예]
  • (Windows에서) WM_KETDONW메시지가 앱으로 전달되어요
  • (OS X에서) KeyDow NSEvent가 앱으로 전달되어요
  • (GNU/Linux에서) Xorg 서버가 키코드를 listen해요
  • URL 파싱하기
  • 검색어일까 URL일까?
  • 호스트명에서 ASCII 아닌 유니코드 문자열 변환
  • HSTS 리스트 점검
  • DNS 검색
  • ARP 프로세스
  • 소켓 열기
  • TLS handshake
  • HTTP 프로토콜
  • HTTP 서버의 요청 처리
  • 브라우저 이면에서
  • 브라우저
  • HTML 파싱
  • CSS 해석
  • 페이지 렌더링
  • GPU 렌더링
  • 윈도우 서버
  • 렌더링 후처리와 사용자에 의해 유도된 동작

"g"키를 누르면

이번 절에서 키보드의 물리적인 동작과 운영체에의 인터럽트에 대해 다룸
하지만 여기서 모드 동작을 설명하지 않음
우선 "g"키를 누르면 해당 이벤트가 브라우저에 전달
모든 자동완성 기능이 활성화됨
당신이 사용하는 브라우저의 알고리즘과 당신이 개인/익명 모드를 사용하는지에 따라 다양한 제안이 URL 창 아래에 드랍박스로 나타남
대부분의 알고리즘은 결과를 검색기록이나 즐겨찾기에 기반해 정렬
당신인 "google.com"을 입력할 것이기 때문에 상관없지만,

수 많은 코드가 당신이 입려을 다 마치기 전에 동작하며, 매 키를 누를 때마다 제안이 선별됩니다.

아마 당신인 다 치기도 전에 "google.com"을 제안할 것

몰랐던점

  • g키를 누르자마다 이벤트가 브라우저에 전달되고, 자동완성기능이 활성화된다.
  • 대부분의 알고리즘은 결과를 검색기록이나 즐겨찾기에 기반에 정렬한다.
  • 매 키를 누를 때 마다 제안이 "선별"된다.

"엔터"키가 쏙 들어갑니다

명확히 설명드리기 위해, 키보드의 엔터키가 끝까지 눌러졌다고 해봅니다.
여기서 엔터키가 할당된 전기회로가
(직접적으로든 정전식으로든)닫힙니다.갑분 전기회로..

이것이 적은 양의 전류를 키보드에서부터 각 키 스위치 상태를 확인하는 논리 회로 소자에 흐르도록 하고, 빠르고 간헐적인 스위치 차단으로 인한 전기적 잡음디바운싱하며,
신호를 키코드 정수 이경우에는 13으로 변환해줍니다.
키보드 컨트롤러는 곧, 키코드를 인코딩해 컴퓨터로 전달합니다.
이것이 지금은 대부분 유니버셜시리얼 버스(USB)혹은 블루투스 연결을 통해 이루어지며, 과거에는 PS/2 혹은 ADB 연결에서 통용되던 방법입니다.

DNS 검색

  • 브라우저는 도메인이 캐시에 들어있는 확인합니다.
    (크롬에서 DNS 캐시를 보려면, chrome://net-internals/#dns chrome://net-internals/#dns 으로 가보세요)
  • 만약 못 찾으면, 브라우저는 검색을 하기위해 (OS에 따라 상이하지만)gethostbyname 라이브러리 함수를 호출합니다.
  • gethostbyname은 DNS를 통한 호스트명 확인을 시도하기전에, 호스트명이 로컬의 (OS에 따라 위치가 다른 hosts파일에서 참조될 수 있는지 봅니다.)
  • gethostbyname이 캐시와 hosts 파일 모두에서 호스트명을 못 찾으면, 곧 네트워크 스택에서 정의된 DNS 서버에 요청을 보냅니다.
    일반적으로 로컬 라우터나 인터넷 공급자의 캐시 DNS 서버로 보내지죠
  • 만약 DNS 서버가 같은 서브넷에 존재한다면 이 네트워크 라이브러리는 DNS서버에 대해 ARP 프로세스를 거칩니다.
  • 만약 DNS 서버가 다른 서브넷에 존재한다면, 네트워크 라이브러리는 기본 게이트웨이 IP에 대해 ARP 프로세스를 합니다.

브라우저 캐시(chrome://net-internals/#dns) -> gethostbyname(hosts파일) -> DNS서버(로컬라우터, 인터넷 공급자의 캐시 DNS 서버)

그런데 만약, DNS서버가 같은 서브넷에 존재?
-> 네트워크 라이브러리는 기본 게이트웨이 IP에 대해 ARP 프로세스 실행

ARP 프로세스

APR(주소 결정 프로토콜, Address Resolution Protocol)

브로드캐스트를 보내기 위해서는 네트워크 스택 라이브러리가 검색할 목적지 IP의 주소를 알아야합니다.
또 ARP 브로드캐스트를 보내는 데 사용하는 인터페이스의 MAC 주소 역시 알아야합니다.

  • ARP 브로드캐스트(를 하고싶음)
  • 네트워크 스택 라이브러리 '가'
  • 검색할 목적기 IP주소 '를'
    알아야함

AND

  • ARP 브로드캐스트를 보내는데 사용하는
  • 인터페이스의 MAC주소 '도'
    알아야함

가장 먼저, ARP캐시가 목저기 IP의 ARP 항목을 가지고 있는지 점검합니다.
만약 캐시에 있다면, 라이브러리 함수는 다음의 형태로 결과를 리턴합니다.
: 목적지 IP = MAC

항목기 ARP캐시에 없다면,

  • 라우트 테이블을 검색해서 목적지 IP주고가 로컬 라우트 테이블의 서브넷에 존재하는지 봅니다.
    존재한다면, 라이브러리가 그 서브넷에 족하는 인터페이스를 활용합니다.
    없다면, 라이브러리는 우리 기본 게이트웨이의 서브넷에 속하는 인터페이스를 활용합니다.
  • 선택된 네트워크 인터페이스의 MAC 주소가 검색됩니다.
  • 네트워크 라이브러리는 레이어2 (OSI 모델에서 데이터링크 레이어)를 통해 ARP 요청을 보냅니다.

ARP Request::

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 Reply를 회신합니다.(아래를 확인하세요)

허브:

  • 컴퓨터가 허브에 연결되어 있으면, 허브가 ARP요청을 모든 포트에 브로드캐스트합니다.
    라우터가 동일한 "Wire"에 연결되어 있드면, 허브ㅏㄱ ARP Reply를 회신하게 되지요.(아래를 확인하세요.)

스위치:

  • 만약 컴퓨터가 스위치에 연결되어 있다면, 스위치가 자신의 로컬 CAM/MAC 테이블을 확인해 어떤 포트가 지금 찾고자 하는지 MAC주소를 가지고 있는지 봅니다.
    스위치에 해당 MAC 주소가 없다면 ARP 요청을 모든 포트에 다시 브로드캐스르하게 되지요.
profile
코딩은 해봐야 아는 것

0개의 댓글