1. 사전작업

(1) 클라이언트: ISP와 연결

  • 먼저 클라이언트가 웹페이지 요청을 하기 전에 클라이언트 호스트가 ISP에 연결됐을 때 (a)자신의 IP 주소를 할당받고 (b)그 다음으로 웹 브라우저에 도메인 네입을 입력했을 때 이를 처리할 가장 가까운 로컬 DNS 서버의 IP 주소 정보를 ISP로부터 얻어오는 절차가 있어야 한다.

  • DHCP 서버에 접속해 자신의 IP 주소를 할당받는 과정에서 ARP 테이블에 인접한 호스트/라우터들의 IP 주소와 MAC 주소 대응관계를 채우는 과정이 있을 수 있다.

(2) 서버: 소켓 생성

  • 웹서버는 (a)클라이언트와 TCP 연결을 형성하기 위한 TCP 소켓을 생성하고 (b)이를 80번 포트(HTTPS는 443번 포트)에 binding 한 후 대기한다.

(3) HTTPS와 서버의 인증서 생성

  • HTTPS 프로토콜을 지원하고자 하는 웹서버는 이를 위해 CA에 자신의 public key를 담은 인증서를 만들어 둔다.

2. 웹 브라우저에 URL을 입력했을 때 일어나는 일

(1) 클라이언트: 로컬 DNS 서버로부터 도메인 네임에 대응되는 IP 주소 얻어오기

  • 사용자가 클라이언트인 웹브라우저에 URL을 입력했을 때는, 일단 가장 먼저 그 도메인 네임에 대응되는 IP 주소를 로컬 DNS 서버로부터 얻어온다.

  • 도메인 네임에 대응되는 IP 주소를 얻어오는 과정에서 로컬 DNS 서버가 여러 DNS 서버에 반복적으로 DNS 쿼리를 보내고 또 그에 대한 DNS 응답이 오가는 과정이 있을 수 있다. 이 과정은 transport 계층에서 일어난다.

  • DNS 쿼리가 IP 데이터그램으로 캡슐화될 때 로컬 DNS 서버의 IP 주소가 IP 데이터그램의 헤더에 추가되며, 이것이 프레임으로 캡슐화될 때에는 클라이언트 호스트와 연결된 다음 hop의 MAC 주소가 프레임의 헤더에 추가된다.

(2) 서버와 클라이언트의 TCP 연결

  • 로컬 DNS 서버로부터 IP 주소를 얻어왔을 때, 클라이언트는 일단 TCP 연결을 형성하기 위한 TCP 소켓을 생성하고 이를 통해 로컬 DNS 서버로부터 얻어온 IP 주소로 웹서버 호스트에 접속해 그 웹서버와 웹페이지 송수신을 위한 TCP 연결을 형성한다.

  • 이 과정에서 (a)클라이언트가 TCP 연결 형성을 위해 보낸 TCP SYN 세그먼트를 담은 IP 데이터그램이 라우팅 알고리즘을 거쳐 웹서버 호스트에 도달하게 되며, (b)이후 양단의 OS 사이에 클라이언트와 웹서버 사이 TCP 연결을 형성하는 3-way handshake 절차가 진행된다.

  • HTTPS 프로토콜로 TCP 연결이 형성된 경우, TCP 연결 형성 후 SSL/TLS handshake를 통해 인증서, public key, session key를 교환하고 생성하는 일련의 과정을 수행한다. 이후 서버/클라이언트 양측이 전송할 HTTP 메시지를 여기서 생성된 session key로 암호화해 전송하게 된다.

(3) 클라이언트의 HTTP 요청

  • TCP 연결이 형성 후 클라이언트는 그 TCP 연결을 통해 그 URL에 해당하는 웹페이지를 요청하는 HTTP 요청을 buffer에 write한 다음 이를 전송한다. (HTTPS 프로토콜로 URL을 요청했다면, 이 메시지를 TLS 프로토콜로 암호화한 다음 전송한다.)

  • HTTP 요청 메서드는 GET, PUT, POST, DELETE 4가지가 있으나, 이 경우와 같은 웹페이지 요청은 GET 메서드로 한다.

  • 클라이언트 웹 브라우저가 전송하는 HTTP 요청 메시지는 transport 계층에서 TCP 세그먼트로, network 계층에서 IP 데이터그램으로 캡슐화 돼 link, physical 계층으로 보내진다. 이 IP 데이터그램은 앞서 클라이언트에서 TCP SYN 세그먼트를 담은 IP 데이터그램이 전송됐을 때와 같은 과정을 거쳐 전송된다.

  • 클라이언트의 요청이 캐시 서버를 거치고 그 요청 메시지에 대응되는 응답 메시지가 캐싱돼있는 경우 요청이 해당 웹서버까지 도달하지 않고 캐시 서버가 대신 응답 메시지를 전송할 수 있다.

(4) 서버의 HTTP 응답

  • 클라이언트로부터 HTTP 요청을 전달받았을 때, 웹서버는 그 요청에 대응되는 HTTP 응답을 호스트의 저장장치에서 찾은 후 그 내용을 buffer에 write한 다음 이를 클라이언트에 전송한다. (HTTPS 프로토콜로 URL을 요청했다면, 이 메시지를 TLS 프로토콜로 암호화한 다음 전송한다.)

    • 만약 클라이언트의 HTTP 요청이 동적 컨텐츠 요청이라면, 웹서버는 그 요청에 대응되는 동적 컨텐츠를 생성한 후 이를 클라이언트에 전송한다. 단, 만약 캐싱돼 있는 메시지와 동일한 요청 메시지라면 그 응답 메시지를 동적 생성 않고 보낼 수도 있다.
  • 웹서버는 HTTP 응답 시 그 HTTP 요청이 적절했는지, 서버 측 상황이 어떠한지 등에 관한 정보를 상태코드로 담아 함께 전송한다. 각 상태코드의 의미는 다음과 같다.

    • 2xx: HTTP 요청이 적절했음

    • 3xx: HTTP 요청의 형식은 오류 없으나 요청된 자원이 해당 URL이 아닌 다른 URL에 있음

    • 4xx: HTTP 요청이 부적절

    • 5xx: 웹서버가 응답할 수 없음

  • 웹서버가 전송하는 HTTP 응답 메시지 또한 transport 계층에서 TCP 세그먼트로, network 계층에서 IP 데이터그램으로 캡슐화 돼 link, physical 계층으로 보내진다. 이 IP 데이터그램 또한 앞서 클라이언트에서 TCP SYN 세그먼트를 담은 IP 데이터그램, HTTP 요청 메시지를 담은 IP 데이터그램이 전송됐을 때와 같은 과정을 거쳐 전송된다.

(5) TCP 연결 종료 및 클라이언트의 HTTP 응답 메시지 분석

  • 웹서버로부터 클라이언트로 전송된 HTTP 응답 메시지는 network, transport 계층에서부터 웹 브라우저의 application 계층으로 올라오면서 차례대로 분석된다. 클라이언트는 HTTP 응답 메시지를 모두 전송받은 다음 (a)TCP 연결 종료 절차를 개시하고, 이와 함께 (b)분석 결과로 얻어진 HTTP 응답 메시지 내 웹페이지의 하이퍼텍스트 정보를 읽고 이를 브라우저 내 렌더링 엔진을 통해 렌더링을 시작한다. 이후 렌더링이 완료된 페이지가 최종적으로 클라이언트 호스트의 디스플레이에 나타난다.