iBetter Books
수정

패킷의 일생 다시 따라가기

브라우저 주소창에 https://example.com을 입력하고 엔터를 누르는 순간, 여러분의 컴퓨터는 이미 엄청난 일을 시작합니다. 그 순간부터 화면에 페이지가 펼쳐지기까지, 이 책에서 배운 모든 것이 차례로 등장합니다. 한 편의 이야기로 다시 따라가 보겠습니다.

DNS — 이름을 주소로 바꾸다

가장 먼저 해야 할 일은 example.com이라는 이름을 IP 주소로 바꾸는 것입니다. 컴퓨터는 이름만으로는 목적지를 찾아갈 수 없습니다. 주소창에 사람이 읽을 수 있는 이름을 넣었지만, 네트워크는 숫자 주소만 이해합니다.

운영체제는 먼저 로컬 DNS 캐시를 뒤집니다. 예전에 방문한 적이 있다면 여기서 바로 답이 나옵니다. 캐시에 없으면 DNS 리졸버에 질의를 보냅니다. 리졸버는 루트 네임서버, TLD 네임서버, 권한 네임서버를 차례로 거쳐 최종적으로 IP 주소를 가져옵니다. 이 과정도 사실 UDP 패킷을 주고받는 네트워크 통신입니다. 이제 93.184.216.34처럼 생긴 숫자 주소가 손에 들어왔습니다.

TCP 핸드셰이크 — 연결을 맺다

IP 주소를 알았으니 서버와 연결을 맺을 차례입니다. 단순히 데이터를 던지는 것이 아니라, 먼저 악수를 해야 합니다. 전송 계층의 TCP가 담당하는 일입니다.

클라이언트가 SYN 패킷을 보냅니다. 서버가 SYN-ACK로 응답합니다. 클라이언트가 ACK를 돌려보냅니다. 이 세 번의 교환이 끝나면 연결이 수립됩니다. 이 과정에서 양측은 시퀀스 번호를 맞추고, 윈도우 크기를 협상하고, 이후에 패킷이 유실되더라도 재전송할 수 있는 준비를 마칩니다.

TLS 핸드셰이크 — 암호화 채널을 열다

주소가 https로 시작한다면 TCP 연결 위에 TLS 협상이 한 번 더 일어납니다. 서버는 인증서를 내밀고, 클라이언트는 그것이 신뢰할 수 있는 기관이 서명한 것인지 확인합니다. 대칭 키를 안전하게 교환하고 나면, 이후 모든 데이터는 암호화된 채널을 통해 흐릅니다. TLS가 만들어내는 것이 바로 여러분이 주소창에서 자물쇠 아이콘으로 보는 그 보안입니다.

HTTP 요청 — 진짜 내용을 보내다

이제 응용 계층이 등장합니다. 브라우저는 HTTP GET 요청 메시지를 만듭니다. GET / HTTP/1.1, Host: example.com 같은 줄로 이루어진 텍스트입니다. 이 메시지가 캡슐화의 출발점입니다.

전송 계층은 이 메시지 앞에 TCP 헤더를 붙입니다. 포트 번호 443(HTTPS)이 목적지로 적힙니다. 네트워크 계층은 IP 헤더를 붙이고 목적지 IP 주소를 기록합니다. 데이터링크 계층은 이더넷 프레임으로 감싸고, 다음 홉인 라우터의 MAC 주소를 적습니다.

IP 라우팅 — 목적지까지 이어달리기

프레임이 공유기로 전달되면, 공유기는 IP 헤더를 보고 목적지가 어느 방향인지 판단합니다. 라우팅 테이블을 참조해 인터넷 쪽 인터페이스로 내보냅니다. 프레임은 ISP 라우터, 백본 라우터들을 거치며 홉 하나씩 목적지에 가까워집니다. 각 라우터에서 MAC 주소는 다시 쓰이지만 IP 주소는 바뀌지 않습니다. 이것이 3계층과 2계층의 역할 분담입니다.

TTL 값은 홉을 거칠 때마다 하나씩 줄어듭니다. 혹시라도 패킷이 길을 잃어 영원히 떠돌지 않도록 하는 안전장치입니다.

역캡슐화 — 봉투를 벗기다

패킷이 서버에 도착하면 이번에는 반대 방향으로 봉투가 벗겨집니다. 서버의 데이터링크 계층이 이더넷 프레임을 벗기고, 네트워크 계층이 IP 헤더를 확인하고, 전송 계층이 TCP 세그먼트를 재조립하고, 응용 계층이 마침내 GET / 요청을 읽습니다. 서버는 응답을 만들고, 이번에는 반대 방향으로 똑같은 여정이 펼쳐집니다. 그 응답이 브라우저에 도착해 HTML이 파싱되고, 화면에 페이지가 그려집니다.

브라우저 주소창에 주소를 입력하고 엔터를 누른 순간부터 페이지가 뜨기까지, 이 모든 일이 1초 안에 일어납니다. 이 책에서 배운 것들이 그 1초 안에 모두 들어 있습니다.