브라우저 URL 입력 시 일어나는 일
** 아래 글은 owlgwang 님의 글 웹 브라우저에 URL을 입력하면 어떤 일이 일어날까 을 보고 정리한 글입니다.
URL 엔터 후 일어나는 일
0. 엔터 입력
1. 웹 브라우저가 URL을 해석함.
Scheme: [//[user:password@]host[:port]][/]path[?query][#fragment]
2. 문법에 맞으면 punycode encoding 을 url 부분에 적용.
punycode : 유니코드 문자열을 호스트 이름에서 허용된 문자만으로 인코딩하는 방법 RFC 3492
3. HSTS 목록을 로드해서 확인.
HTTP Strict Transport Security : http 대신 https 만을 사용하여 통신해야한다고 웹사이트가 브라우저에 알리는 보안 기능
4. DNS 조회
1. 요청 보내기 전 Domain cache 되어 있는지 확인
2. 없으면 로컬 hosts 파일에서 참조 가능한 Domain 있는지 확인
3. 1,2 둘 다 없으면 network stack에 구성돼 있는 DNS로 요청을 보냄. 일반적으로 Local router, ISP 캐싱 DNS
5. ARP로 대상 IP & MAC Address를 알아낸다.
ARP broadcast를 보내 확인해야 함.
ARP broadcast : ARP 를 broadcast 하는 것 = mac address 통신 시도 , broadcast : 로컬 랜 상 붙어 있는 네트워크 통신을 하는 것.
6. 대상과 TCP 통신을 통해 socket을 연다.
7. HTTPS인 경우 TLS Handshake
8. http 프로토콜로 요청한다.
http라면 connection set-up 이후, https라면 handshake 한 이후
9. http 서버가 응답한다.
httpd 서버가 요청을 수신
요청을 매개변수로 구분(ex. http method(get,put), 도메인, 요청 경로)
가상 호스트 있는 지 확인
get 요청 수락 가능 확인
클라이언트가 ip, 인증을 통해 method가 사용가능한 지 확인
rewrite module 이 설치 되어 있으면 요청 rule 중 하나와 일치하도록 시도
서버 요청에 해당하는 콘텐츠 가져옴
핸들러에 따라 파일 구문 해석
10. 웹 브라우저가 그린다. 랜더링
11. 렌더링이 완료된 후 브라우저는 Javascript 실행을 통해 DOM과 CSSOM이 변경 될 수 있는데, 레이아웃이 수정 되는 경우 페이지 렌더링 및 페인팅을 다시 수행함.
추가 설명 중 기억하고 싶은 것.
*5. ARP broadcast를 보내 확인.
ARP broadcast : ARP 를 broadcast 하는 것 = mac address 통신 시도
(broadcast : 로컬 랜 상 붙어 있는 네트워크 통신을 하는 것.)
-
ARP cache 있는 경우
- MAC 주소 반환
-
ARP cahce 없는 경우
-
대상 IP address가 local subnet 에 있는 지 확인하기 위해 routing table 조회
-
있으면 subnet 연관 interface 사용, 없으면 기본 gateway subnet 과 연관된 interface 사용
-
network libary 가 link layer(2)에 ARP 요청을 보냄.
-
응답에서 target의 MAC address와 IP address 로 DNS 프로세스 다시 시작
-
DNS 53번 포트 열어 UDP 요청 [응답 데이터가 크면 TCP]
-
Local router/ ISP DNS 에 없는 경우 SOA에 도달할 때까지 재귀요청을 보내 응답을 받는다.)
-
*6. 브라우저가 TCP 통신 시도
-
브라우저가 대상 서버 IP주소를 받아 URL에서 해당 포트 번호를 가져와 TCP socket stream 요청
-
TCP segment가 만들어지는 Transport Layer(4)로 전달. 대상포트 header에 추가, source port 가 동적 포트 범위내에서 임의 지정됨.
-
tcp segment를 Network Layer(3)로 전달. segment header에 대상 컴퓨터 IP주소, 현재 컴퓨터 IP주소가 삽입된 packet 구성.
-
packet이 Link Layer(2)로 전달. MAC address 와 gateway MAC Address를 포함하는 Frame header 추가 (gateway MAC address 모르면 ARP로 찾아야함.)
-
packet이 ethernet, wifi, cellular data network 중 하나로 전송
-
packet local subnet router 도착, as 경계 router들을 통과 –> router에서는 packet IP header에서 target address 추출해 적당하고 hop으로 routing IP header의 TTL 필드는 통과하는 라우터에 대해 하나씩 감소 –> TTL 필드가 0이 되거나 현재 router 대기열에 공간 없으면 네트워크 정체로 packet 삭제
-
TCP 통신. Connection Set-Up –> Data Transfer –> Connection Close
*10-1. 서버가 리소스(HTML, CSS, JS, Image 등)를 브라우저에 제공
-
구문 분석 - HTML, CSS, JS
-
랜더링 –> DOM Tree 구성 (dynamic object model) –> 렌더 트리 구성 –> 렌더트리 레이아웃 배치 –> 렌더 트리 그리기.
*10-2. 브라우저 구조
-
User Interface : 주소 표시줄, 뒤/앞 버튼, 북마크 등등 (요청 페이지가 표시도니 창 제외한 모든 부분)
-
Rendering Engine : 요청된 콘텐츠를 표시함.
-
Browser Engine : UI와 Rendering Engine사이 작업 통제
-
Networking : 독립적 구현, http 요청과 같은 network 호출을 처리
-
UI backend : 콤보 상자, 창과 같은 기본 위젯을 그리는데 사용, 운영체제 사용자 인터페이스 method 사용
-
Jacascript Engine : Javascript 코드를 구문 분석하고 실행하는 데 사용.
-
Data Storage : 쿠키같이 로컬 저장해야하는 데이터들, localStorage, indexedDB, webSQL, FileSystem 같은 수단이 있음.
*10-3-1. HTML parsing
-
렌더링 엔진이 요청된 문서의 내용을 네트워킹 계층에서 가져옴. 8kb 단위로 이루어짐.
-
HTML 마크업을 parse tree로 만드는 HTML parser 기본 작업
-
생성된 parse tree는 DOM노드와 속성 노드의 트리. HTML 문서의 객체 표현과 HTML 요소의 인터페이스, 트리 root는 “Document” 객체이다.
-
스크립팅 조작전에는 마크업, DOM은 거의 일대일 관계를 유지한다.
*10-3-2. HTML parsing 알고리즘
-
HTML은 regular top-down 방식이나 bottom-up parsers를 사용할 수 없음. (이유 : 1. 관대한 언어, 2. 브라우저가 일반적 오류 허용 범위를 갖고 있다. 3. HTML 파싱되는 동안 변경 가능성이 있음.)
-
일반적 parsing 기술을 사용할 수 없어 사용자 정의 parser를 사용한다.
-
토큰화, 트리구조화 2단계로 구성.
*10-4. CSS parsing
-
CSS lexical and syntax grammar를 사용해 css 파일, style 속성 값을 parsing 함.
-
각 css file이 stylesheet object로 parsing 됨. 각 object에는 css syntax에 해당하는 선택자, 객체가 일치하는 css syntax이 있다.
-
css 는 regular top-down 또는 bottom-up parsers 가능
*10-5. Page Rendering
-
DOM 노드 탐색, 각 노드에 대한 css값 계싼해 “frame tree” 또는 “render tree”를 만듬.
-
자식 노드 width와 수평 margin, border, padding을 함해 frame tree 아래 쪽 각 노드 기본 너비를 계산.
-
각 노드의 사용 가능한 너비를 자식 노드에 할당하여 각 노드 실제 width 값 계산
-
텍스트 배치 적용 하위 노드 height, margin, border, padding 을 합해 각 노드 높이 상향식 계산. (자식 -> 부모)
-
각 노드 좌표 계산.
-
float, absolutely, relatively 같은 속성이 있을 경우 더 복잡하게 적용 됨.
-
페이지 어느 부분을 그룹으로 애니메이션 화 할 수 있는지 설명하는 레이어를 만듬. frame object/render object는 레이어에 할당.
-
텍스처가 페이지 각 레이어에 할당
-
frame object/render object를 통해 각 레이어 별로 그리기 명령 실행
-
1-9 모든 단계를 웹페이지 렌더링 된 마지막 시간에 계산 된 값을 재사용할 수 있기에 점진적 변경을하면 작업이 덜 필요해짐.
-
페이지 레이어가 합성 프로세스로 보내져 시각적 레이어(chrome, iframe,addon panels 등)와 결합됨.
-
최종 레이어위치가 계산되고 direct3D / OpenGL을 통해 합성 명령이 실행됨. GPU 명령 버퍼가 비동기 렌더링을 위해 GPU로 출력, frame은 window server로 전송됨.
*10-6. GPU Rendering
-
렌더링 프로세스 동안에 graphical computing layers가 CPU나 GPU 사용 가능.
-
graphical rendering 계산에 GPU를 사용하는 경우 그래픽 소프트웨어 레이어에서 작업을 여러조각으로 분할하여 렌더링 프로세스에 필요한 부동 소수점 계산을 위해 GPU 대용량 병렬 처리 사용 가능.