(구체적으로) 웹 사이트에 접속하기까지 무슨일이 일어날까?

(구체적으로) 웹 사이트에 접속하기까지 무슨일이 일어날까?

안내:

단순하게 dns에서 도메인을 ip로 변환하여 그 ip를 이용해 웹 사이트에 접속한다 식의 간단한 설명이 아닙니다.

이해를 돕기 위해 실제 상황과는 다른 요소가 있을 수 있습니다.(데이터 처리 위치 등)

 

들어가기 전에 아래 내용을 눈으로 잘 익혀주시면 글을 이해하는 데 큰 도움이 될 수 있습니다.

image

image

인터넷 네트워크 세상에서는 상대와 1대1로 통신하기 위해서는 2가지 주소(IP & MAC)를 알아야 합니다.

  • IP 주소를 이용해 기기를 찾고자 한다. -> 라우터라는 기기는 해당 IP를 가진 컴퓨터를 찾기 위해 어느 라우터를 향해 가야 하는 지(또는 통해 가야 하는 지) 알고 있다.

  • MAC 주소를 이용해 기기를 찾고자 한다. -> 스위치라는 기기는 자신이 담당하는 해당 MAC을 가진 컴퓨터가 정확히 어디 연결되어 있는 지 알고 있다.

1대1로 정확히 통신하기 위해서는 두 컴퓨터가 모두 유효한 두 주소를 가지고 있어야 합니다.

 

 

 

 

여러분은 inflearn.com에 접속하려 합니다.

 

먼저 컴퓨터를 켜야겠죠?

여러분은 컴퓨터의 전원을 올렸습니다.

image

 

저런, 여러분의 컴퓨터는 고정 ip를 가지고 있지 않습니다.~ 통신사가 여러분의 컴퓨터가 필요할 때마다 동적으로 ip 주소를 빌려주는 사설 ip를 사용해야 하는군요.

그나마 다행히 mac 주소는 여러분의 컴퓨터를 출고할 때부터 메인보드의 네트워크 카드에 각인되어 있어서 따로 건드릴 것은 없네요.

 

사설 ip를 사용하기 때문에 방금 막 켜진 컴퓨터는 DHCP.exe를 실행시킵니다.

(물론 고정ip를 가지고 있어도, 컴퓨터가 자신과 가장 가까이 있는 라우터 장비를 찾기 위해 실행될 수 있습니다.)

image

 

DHCP.exe의 목적은 자신과 연결되어 있는 라우터라는 장비의 정보와, 도메인을 ip 주소로 변환해주는 dns 서버의 정보를 보내주며, 유동ip를 사용해야 하는 컴퓨터에게 ip를 할당해주는 서버와 통신하고 그 정보를 컴퓨터에 저장하는 역할입니다.

그래서 DHCP.exe는 DHCP 서버를 찾아야 합니다.

근데 우리의 컴퓨터는 현재 ip 및 DHCP, 라우터 정보가 아무것도 없습니다. 이럴 때에는 무식한 방법만이 해결책이 될 수 있습니다.

 

 

image

아무 기기에게나 '당신이 DHCP 서버입니까?'라고 물어봅니다. 진짜로 이렇게 물어봅니다.

 

상황별, 네트워크 기기별로 약간씩 다르지만 DHCP 과정이 일어날 때는 여러분의 컴퓨터가 인터넷을 이용하기에는 아직 미성숙(?)한 상태이기 때문에 해당 과정과 관련된 모든 요청과 응답은 LAN 전체에 전파되도록 되어있습니다.

물론 LAN 영역 전체에 요청과 응답을 할 때는 다음 제약 사항이 있긴 합니다.

  • 같은 Lan 영역 안에서만 물어봅니다. 다른 LAN 영역 친구들은 무슨 일이 일어나는 지 모릅니다. 보통의 경우 dhcp 서버는 같은 lan 영역 안에서 무조건 찾을 수 있습니다.

  • 물어볼 때 형식을 지켜 물어봅니다. 아래 가로 줄은 그 형식의 구체적인 부분을 이야기하고 있기 때문에 건너뛰어도 좋습니다.


요청을 보내기 위해 작성하는 형식은 일종의 택배 상자와 같습니다. 보내는 사람, 받는 사람, 택배 무게 등이 택배 상자에 적혀있죠. DHCP 서버를 찾는 상황에서는 3번의 포장 과정을 거치게 됩니다. 이 포장 과정을 마쳐야 전송할 수 있게 됩니다.

가장 먼저 실행되는 UDP.exe는 DHCP 요청이라는 문서를 포장합니다.

image초록색은 택배 내용물, 나머지는 택배 송장이라고 생각하시면 됩니다.

여기에서 포트라는 생소한 개념이 등장합니다.

포트는 UDP.exe 파일이 구체적으로 무얼 해야 하는 지 알려주는 역할입니다.

DHCP 서버는 67번(이 상황에서는 받는 컴퓨터의 포트에 들어가겠지요),

여러분의 컴퓨터는 68번(이 상황에서는 보내는 컴퓨터의 포트에 들어가겠지요)을 적어넣어주시면 됩니다.

67, 68번 포트처럼 미리 지정되어 있는 경우도 있고, 간혹 비어 있는 포트는 사용자 지정 작업을 수행하게 구성할 수 있습니다.

 

그다음 IP.exe가 실행됩니다.

ip 주소를 이용해 앞에서 포장한 udp 택배를 포장합니다.

image앞서 포장한 택배를 물류 센터에서 처리할 수 있게끔 다시 포장합니다.

여기서 앞서 나온 UDP 택배와 크게 다른 점은, 택배가 분리될 수 있다는 겁니다.

인터넷 세계에서는 택배가 너무 커서 다른 택배들이 처리되는 것을 방해하는 것을 경계합니다.

네트워크마다 받아들일 수 있는 택배 크기가 다르다면, 택배가 분리됩니다.

그리고 ip 택배는 송장에 내용물을 처리하기 위해 어떤 exe를 실행시켜야 되는가도 적습니다. 우리의 UDP를 처리하기 위해서는 17을 적어주면 됩니다. 17이 적힌 택배가 오면 UDP.exe를 실행시키라는 뜻입니다.

마지막으로 보내는 쪽 ip와 받는 쪽 ip를 적습니다. 현재 여러분의 컴퓨터는 ip 주소가 없는 상태이기 때문에 0.0.0.0을 적고, DHCP의 ip 주소를 모르기 때문에 lan 영역 전체로 택배를 보내는 255.255.255.255를 받는 컴퓨터의 ip 주소로 적습니다.

마지막에는 아까 포장해둔 UDP 택배를 잘 넣어둡니다.

 

그다음 이더넷.exe가 실행됩니다.

이더넷 택배로  ip 택배를 포장합니다. 이더넷 택배는 구체적으로(몇 동 몇 호) 어디로 가야하는 지 알려줍니다.

image택배 송장에 제일 먼저 이것은 이더넷 택배이므로 이더넷.exe가 처리해야 한다는 것을 알려줍니다.

그다음에는 받는 컴퓨터와 보내는 컴퓨터의 MAC 주소를 적어줍니다. 스위치라는, 여러분 집 어딘가 거실 또는 지하에 묻혀있을 수 있는 네트워크 장비는, MAC 주소를 통해 정확하게 지정된 컴퓨터로 택배를 보내줍니다.

보내는 컴퓨터의 MAC 주소에는 여러분 컴퓨터 MAC 주소를 넣어줍니다.

받는 컴퓨터의 MAC 주소에는 LAN 전체에 보내라는 FF:FF:FF:FF:FF:FF를 넣어줍니다.

그다음 송장에 적힌 내용은 이더넷 택배를 열고 어떤 exe를 실행시켜야 되는가 입니다. ip.exe를 실행시키기 위해서는 0x0800을 적어두면 됩니다.

마찬가지로 마지막에는 아까 포장해둔 UDP를 포장해둔 IP를 잘 넣어줍니다.

 

 


아무에게나 막 요청을 뿌리고 다닌 끝에 응답이 돌아왔습니다.

DHCP 서버는 응답으로 여러분의 컴퓨터가 사용할 수 있는 IP 주소를 제시해줍니다.

(물론 이 과정에서도 응답을 보내는 DHCP 서버는 열심히 택배 포장을 합니다)

 

여러분의 컴퓨터는 이 DHCP 서버에게 '당신이 보내준 제안을 받아들이겠다'라는 택배를 보냅니다.

그리고 DHCP 서버는 마지막으로 정보를 업데이트(컴퓨터에게 제시한 IP를 컴퓨터가 승인하여 사용 중)하고 처리를 끝내게 됩니다. 마지막 요청에서 기본 게이트웨이(라우터)의 IP 주소와 DNS 서버의 IP 주소 등 네트워크를 본격적으로 이용하기 위해 필요한 정보를 보내주게 됩니다.

바로 DHCP 서버가 해당 IP 주소를 사용하라고 통보하는 방식을 사용할 수 있겠지만, 굳이 두 컴퓨터가 합의의 과정을 거치는 이유는 한 Lan 영역 안에 반드시 하나의 DHCP 서버가 존재한다는 보장이 없기 때문입니다. 물론 우리는 이상적인 상황을 가정하므로 그냥 넘어가겠습니다.

이 과정에서 많은 시스템-dhcp서버가 아닌 근처, 즉lan에 있는 다른 컴퓨터-에 필요 없는 요청이 가게 됩니다.

 

 

 

그런데 말입니다.

DHCP로부터 할당받은 IP 주소가 10.x.x.x 로 되어 있네요~?

해당 주소는 사설IP에 사용되는 주소로, 외부(LAN 밖)와 소통하기 위해서 반드시 거치는 기본 게이트웨이(라우터)가 약간 지능적으로 나와줘야 합니다.

image한 LAN 영역 안에 있는 기기들은 다른 LAN 영역으로 택배를 보낼 때 라우터의 ip 주소로 대신하여 보내게 됩니다. 물론 lan 안에서 서로 다른 기기들의 요청을 구분하기 위해 라우터가 포트 번호로 구분하여 요청을 보내고, 응답을 나누어 줍니다.

복잡하지만, 인류가 사용하기에는 숫자가 너무 적은 ipv4 주소를 아낄 수 있는 좋은 방법이기 때문에 많이 사용됩니다.

 

 

DHCP.exe는 최종적으로 종료되었으며, 여러분은 이제 브라우저를 켜게 됩니다.

image

브라우저에 http://inflearn.com을 입력하셨군요.

좋아요. 이제 여러분의 화면에 inflearn을 띄우기 위한 여정을 시작해 봅시다.

 

아마 위에서 보았겠지만, 외부와 통신하기 위해서는 기본 게이트웨이를 거치게 됩니다. 그리고 DNS 서버에게 요청을 보내 inflearn의 ip 주소를 알아올 수 있지요. DHCP 서버는 우리에게 기본 게이트웨이와 dns의 IP 주소를 알려주었고요. 그러나 완전한 통신을 하기 위해서는 ip주소와 mac 주소가 필요합니다.

즉, dns와 기본 게이트웨이의 mac 주소를 찾아야 합니다!

 이때 사용하는 프로그램은 ARP.exe입니다.

 


여담 

exe들은 각각 자신과 동급인 것들로 나눌 수 있습니다.

이렇게 동급인 것들로 나누면 총 7개의 분류가 완성되며, 고급지게 표현하면 이것이 OSI 7계층 모형입니다.

image7층에서 만들어진 택배를 외부로 보낼려고 하면 6층, 5층, 4층, 3층, 2층, 1층에서 순서대로 포장을 하게 됩니다.

7층 exe로 유명한 것이 HTTP입니다.

아까 보았던 UDP.exe는 4층입니다. 다른 4층으로는 TCP.exe가 있습니다.

IP.exe는 3층이고, 이더넷.exe는 2층입니다.

IP 주소는 3층 송장에 적고, MAC 주소는 2층 송장에 적는다는 것을 알 수 있죠.

1층은 실제 전선을 따라 이동하는 비트들에 대해 다루므로 여기에서는 다루지 않겠습니다.

또한 반이중, 전이중 통신을 담당하는 5층과 인코딩과 디코딩을 다루는 6층 또한 생략하도록 하겠습니다.

한편 지금 알아볼 ARP.exe는 2층이냐 3층이냐 논쟁이 있습니다. 서적과 인터넷 문서에서는 작성자의 취향(?)에 따라 2층, 3층 중 하나로 표기하고 있습니다.

여기에서는 이 논쟁은 다루지 않도록 하겠습니다.



ARP.exe는 택배 포장을 합니다.

택배 내용은, 해당 ip 주소를 가지고 있는 컴퓨터는 컴퓨터의 MAC 주소를 나에게(내 컴 MAC 주소로) 보내달라는 의미를 담고 있습니다.

image

당연히 LAN 영역 전체에 보내도록 되어 있습니다.

.

.

.

 

열심히 택배를 보낸 끝에 기본 게이트웨이(라우터)가 우리의 요청에 응답하였군요. 이 응답을 통해 우리는 기본 게이트웨이로 완전한 1대 1 통신을 할 수 있게 되었습니다.

 

 

이제 DNS 서버와 통신을 하여서, inflearn.com의 IP 주소를 알아와야 합니다.

마찬가지로 DNS 서버의 MAC 주소를 알아올려고 합니다.

그러나 일반적으로 DNS 서버는 LAN 영역 밖에 있습니다. arp 택배가 유효하게 전송될 수 있는 곳은 여러분의 컴퓨터가 속해 있는 LAN 영역 안인데 어떡해야 할까요?

 

 

 여러분의 컴퓨터는 이 상황을 신경쓰지 않아도 됩니다.

왜냐고요? LAN 외부 영역과의 통신은(택배 주고받기는) 기본 게이트웨이가 해주기 때문입니다.

같은 LAN 영역이 아닐 때에는 IP 주소만 제대로 적고, MAC 주소에는 아까 ARP.exe 프로그램을 실행시켜서 알아온 기본 게이트웨이의 mac 주소를 적어주면 됩니다.

 

기본 게이트웨이가 목적지 MAC 주소로 적혀 있으면 스위치는 택배를 기본 게이트웨이로 전달합니다.

 기본 게이트웨이(라우터)는 다음 라우터에게 이 택배를 보낼 때, 마찬가지로 목적지 MAC 주소에는 다음 라우터의 MAC 주소를 적어줍니다. 이러한 과정이 통신하고자 하는 대상이 있는 LAN 영역의 기본 게이트웨이에 도착할 때까지 지속됩니다. 마지막으로 이제 목적지 MAC 주소에 그 대상의 MAC 주소가 들어가게 되고(그쪽 컴퓨터 또는 라우터에서도 ARP.exe가 잘 작동한다면요), 그쪽 영역의 스위치가 최종적으로 택배를 전달해주게 됩니다.

 

 

우선 우리의 컴퓨터는 스터브리졸버.exe를 실행시킵니다..

스터브리졸버.exe는 UDP.exe를 실행시켜 53번 포트로 설정하고 질의문을 작성합니다.

inflearn.com의 주소를 알려주십시오.

마찬가지로 UDP 택배는 IP.exe, 이더넷.exe를 실행시켜 순차적으로 포장되고, DHCP 서버가 알려준 DNS 서버의 IP주소를 향해 택배를 보내게 됩니다.

image

 

 

DNS 서버에 택배가 잘 도착하였군요.

놀랍게도 이 DNS 서버는 inflearn.com의 IP 주소를 모릅니다.

단지 inflearn.com의 IP 주소를 찾는 일을 대행해주는 일을 하는 것뿐입니다. DNS 서버가 이 일을 할 때 사용하는 프로그램을 폴리졸버.exe라고 하겠습니다.

 

폴리졸버.exe는 ICANN의 루트 서버에게 먼저 질의 요청을 보냅니다. 내용은 스터브리졸버.exe가 DNS 서버에 보낸 것과 동일합니다.

 


ICANN은 국제인터넷주소관리기구로 여러분이 인터넷 세상에서 도메인을 사용하고 싶다면 복종해야 되는 비영리 기관입니다. 다양한 도메인 등록 대행사들은 ICANN의 승인과 검증을 거치게 됩니다.


 

전세계 각지에 배치되어 있는 ICANN 루트 서버는 폴리졸버.exe가 보낸 요청에 대해 com 도메인을 관리하는 서버의 IP 주소를 알려주고 여기에다가 물어보라고 응답해줍니다.

 

폴리졸버.exe는 다시 com 도메인 관리 서버에 질의 요청을 보냅니다.

com 도메인 관리 서버는 응답으로 inflearn.com을 관리하는 DNS 서버의 IP 주소를 알려줍니다.

 

마지막으로 폴리졸버.exe는 com 도메인 관리 서버가 알려준 서버에 질의를 하고, 그 결과를 스터브리졸버.exe로 전달을 해줍니다. 이제 우리는 inflearn.com의 IP 주소를 얻어오게 되었습니다!

 

참고로 폴리졸버.exe는 이제 inflearn.com의 IP 주소를 일정 시간 동안 저장해두면서 다른 곳에서 요청이 왔을 때 바로 응답해주게 됩니다.

 

 

 

 이제 외부와의 통신과 관련된 부분은 끝났으니, 이 글의 하이라이트인 http 관련 내용이 시작되겠습니다.👏

먼저 TCP.exe가 실행이 됩니다. 앞서 말한 듯이 UDP와 같은 층인 4층 프로그램입니다. TCP 택배는 항상 외부로 나가기 전에 IP와 이더넷으로 포장된다는 것을 잊지 마세요!

TCP는 UDP와 달리 안정적인 통신을 우선합니다. 통신을 하는 양쪽이 통신을 완전히 준비하는 것을 확인한 상태에서 통신을 진행하는 것이죠.

imagetcp 택배에서 udp에서 보이지 않았던 부분들이 있습니다.

시퀀스 번호는 택배 내용물이 많아 택배가 분리될 때, 분리된 것에 몇 번째인가를 나타내주는 부분입니다. tcp의 경우 tcp 포장 단계에서 미리 택배를 분리하게 됩니다. 택배가 분리될 때에는 분리된 각 택배에 송장이 각각 생기죠. 이때 각 송장에 시퀀스 번호가 순서대로 들어가게 됩니다. 이는 UDP보다 훨씬 더 큰 안정성을 가질 수 있게 해줍니다.

 

택배의 목적을 통해 tcp.exe가 구체적으로 무엇을 해야 하는 가를 알 수 있습니다. 택배의 목적에는 SYN, ACK, FIN 등이 들어갑니다.

 

여러분의 컴퓨터의 TCP.exe는 서버와의 통신에서 안정성을 확보하기 위해 다음 과정을 거칩니다.

  1. 여러분의 컴퓨터에서 택배의 목적에 SYN이 적힌 TCP 택배를 보냅니다. SYN은 연결을 허용해도 되는 가를 물어보는 역할을 합니다. HTTP 연결을 하려면 받는 컴퓨터의 포트는 80으로 넣으면 됩니다.

  2. 서버는 SYN 요청에 응답하기 위해 택배의 목적에 ACK를 넣어서 보냅니다. 또한 서버는 여러분의 컴퓨터를 향해 SYN 패킷을 보냅니다.

  3. 여러분의 컴퓨터는 서버가 보낸 SYN에 대한 응답으로 ACK를 보내고, 연결 시작을 완료합니다.

image이제 처리해야 되는 데이터를 가진 TCP 택배를 자유롭게 보내면 됩니다. 큰 데이터가 분리되어도 다시 합칠 수 있고, 중간에 택배가 손상되어도 택배를 다시 달라고 해서 안정성을 가질 수 있게 됩니다. 

 

 

이제 여러분은 http 연결을 완료한 겁니다.(정확히는 http 메시지를 주고받을 수 있는 준비가 완료된 것이죠)

보안 향상을 위해 사용하는 https의 경우, tcp를 통해 통신 준비를 한 뒤, tls라는 것을 이용해 암호화 준비 과정을 거치게 됩니다. 이 과정은 생략하도록 하겠습니다.

이제 여러분의 컴퓨터의 브라우저는 inflearn 서버를 향해 GET 요청을 보내게 됩니다.(택배 포장을 하게 됩니다. http 요청을 tcp 택배 안에 넣고, ip 택배 안에 이 tcp 택배를 넣고, 이더넷 택배에 ip 택배를 넣고,,,,)

image

 

 

http에서 요청 명령을 분리하는 방법은 줄 바꿈 문자를 사용하는 것입니다.

GET 요청은 다음과 같은 문자열들을 넣어서 보냅니다. 줄 바꿈 문자를 사용해 각 명령을 구분하지요.

GET / HTTP/1.1
HOST: inflearn.com

 

인프런 서버의 응답은 다음과 같을 겁니다.

HTTP/1.1 200 OK
DATE: 지금 날짜와 시각
Server: node.js(Express) 어쩌고
Content-Length: 응답 크기(용량)
Content-type: text/html
<HTML>
어쩌고 저쩌고................
</HTML>

 

이 응답을 받은 웹 브라우저는 여러분에 인프런 메인 페이지를 보여 줄 겁니다.

 

아직 안 끝났습니다. 여러분은 인프런 메인 페이지에서 오랜 시간 아무것도 안하고 그냥 보고 계시는군요. 컴퓨터는 불필요한 TCP 연결 통로를 해지할 겁니다.

  1. 여러분의 컴퓨터는 택배의 목적에 FIN을 넣어서 보내줍니다. TCP 연결을 종료하겠다는 의미입니다.

  2. 서버는 종료에 대한 확인의 ACK 택배를 보냅니다. 그리고 서버도 FIN 택배를 보냅니다.

  3. 마지막으로 여러분의 컴퓨터가 서버의 FIN에 대한 응답으로 ACK를 보내고, 연결을 종료하게 됩니다.

 

 

3줄 요약

  1. 컴터를 키면 LAN 안에 있는 DHCP 서버를 찾아서 네트워크 기본 정보를 받아온다.

  2. 기본 게이트웨이 라우터의 도움을 받아 DHCP 서버가 알려준 DNS 서버에 도메인의 ip 주소를 물어본다.

  3. 기본 게이트웨이 라우터의 도움을 받아 DNS 서버가 알려준 ip주소로 tcp 연결을 하여 안정성을 확보하고 http 데이터를 교환한다.

 

 

 



다루고 싶었지만 분량 상의 문제, 전문 지식 부족의 문제로 다루지 못한 것들이 많았습니다. HOP, 서브넷마스크, Time To Live, Tls, BGP, IPv6 등등...

또한 실제 운용 환경에서는 생각 이상으로 많은 경우들을 만나야 하기 때문에 단순히 서적을 참고하는 것만으로는 작성하는 데 어려움이 있었던 것 같습니다. 와이어샤크로 시작하는 데이터분석! 이쪽분야 고인물들 보면 참 부럽습니다......

실제와 미묘하게 다른 부분이 있음에도 맥락적 이해를 돕고자 실제와 살짝 다르게 작성해놓은 것도 있으니 양해를 구하며, 네트워크 관련 전문 지식을 습득하고자 하시는 분들은 꼭 RFC 문서를 참고하시길 권장드립니다.

이 글을 보시는 분들께 조금이라도 도움이 되었다면 감사하겠습니다.

어려운 용어들의 최대한 사용을 자제하였지만, 글에서 다룬 내용 중 추가적으로 더 알아보실 분들은 다음 키워드로 찾아보시면 되겠습니다.

  • 프로토콜

  • RFC 문서

  • 패킷 포맷

  • 브로드캐스트, 유니캐스트

  • NAT

  • 패킷

  • 패킷 헤더

  • 권한이 있는 DNS 서버, 권한이 없는 DNS 서버

  • DNS 재귀적 질의, 비재귀적 질의

 

 

 

 

 

 

댓글을 작성해보세요.