전체적인 흐름
- 브라우저 실행
- URL 입력
- 브라우저가 URL을 조사 후 리퀘스트 메시지 생성
- DNS 서버에 IP 주소 조사 신청
- OS에 웹 서버로 송신해주라고 의뢰
- 웹 서버 수신
이전 "1. HTTP" 글은 위 전체적인 흐름에서 "3. 브라우저가 URL을 조사 후 리퀘스트 메시지 생성"까지를 알아보았다. 이제 "4. DNS 서버에 IP 주소 조사 신청" 단계를 알아볼 차례이다.
IP
이전 글에 언급했듯이 브라우저는 메시지를 송신할때 OS에 의뢰를 해야한다고 했다. 이때 OS에 의뢰하기 전 URI에 작성되어있는 도메인명에서 IP 주소를 조사하고 그 IP 주소를 통해 메시지를 받을 상대를 지정한다.
TCP/IP
우선 TCP/IP에 대한 개념부터 알아보자.
TCP/IP 네크워크는 작은 서브넷을 라우터로 연결하여 전체 네트워크를 완성한 것이다. 여기서 '서브넷'은 허브에 몇 대의 PC가 접속된 하나의 단위이다. '라우터'는 데이터가 올바른 방향으로 갈 수 있게 해주는 중계 역할을 해준다.
여기서 서브넷과 서브넷 내에 있는 컴퓨터에 번호가 붙는데 이 번호들을 합치면 IP 주소가 된다. 서브넷에 붙은 번호는 "네트워크 번호"라 하고 각 컴퓨터에 붙은 번호는 "호스트 번호"라 한다. 비유하자면 '무슨 동 몇 번지'와 같이 실제 주소와 비슷한 구성을 가지고 있다고 생각하면 된다.동은 네트워크 번호, 번지는 호스트 번호에 해당 되겠다.
서버에 메시지를 운반할 때는 이 IP 주소에 따라 액세스 대상이 어디에 있는지 판단하고 운반한다. 송신측이 메시지를 보내면 서브넷 안에 있는 허브가 운반해서 가장 가까운 라우터에 넘겨준다. 그러면 라우터가 메시지를 받아야할 상대를 확인하여 다음으로 넘겨야할 라우터를 판단하여 보내도록 동작을 실행한다. 이 과정을 반복하면 최종적으로 데이터가 상대에게 도착한다는 원리이고 이것이 TCP/IP와 IP 주소의 기본적인 개념이다.
IP 주소 표기법
(a) IP 주소 본체의 표기 방법
10.11.12.13
(b) IP 주소 본체와 같은 방법으로 네트워크를 표기하는 방법
10.11.12.13/255.255.255.0 ("IP 주소 본체"/"넷마스크")
(c) 네트워크 번호와 비트 수로 넷마스크를 표기하는 방법
10.11.12.13/24 ("IP 주소 본체/넷마스크")
(d) 서브넷을 나타내는 주소
10.11.12.0/24 (호스트 번호가 0인 것은 서브넷 자체를 의미)
(e) 서브넷의 브로드캐스트를 나타내는 주소
10.11.12.255/24 (호스트 번호가 255 즉,모든 비트가 1인 것은 서브넷 전체에 대한 브로드캐스트를 의미)
브로드 캐스트란 "송신 호스트가 전송한 데이터가 네트워크에 연결된 모든 호스트에 전송되는 방식"을 말한다. 간단히 말하면 서브넷에 있는 모든 컴퓨터에 전송된다는 말인데 (e)에서는 해당 서브넷의 모든 컴퓨터를 나타낸다는 말이기도 하다.
실제 IP 주소는 32비트의 디지털 데이터로 (a)와 같이 8비트씩 점으로 구분하여 10진수로 표기한다. 하지만 이것만으로는 어느 부분이 네트워크 번호인지 호스트 번호인지 알 수 없다. 그래서 (b)처럼 IP 주소에 "넷마스크"라는 것을 덧붙여준다.
IP 주소와 넷마스크는 다음과 같이 표기된다.
10진수 표기 | 왼쪽의 10진수 표기를 비트로 고친 것 | |
---|---|---|
① IP 주소 | 10.1.2.3 | 00001010.00000001.00000010.00000011 |
② 넷마스크 | 255.255.255.0 | 11111111.11111111.11111111.00000000 |
↓ | ↓ | |
네트워크 번호 | 10.1.2. | 00001010.00000001.00000010 |
호스트 번호 | 3 | 00000011 |
보았듯이 넷마스크가 1인 부분은 네트워크 번호를 나타내고, 넷마스크가 0인 부분은 호스트 번호를 나타낸다. 하지만 이렇게 넷마스크를 (b)처럼 표기하면 너무 길기때문에 (c)처럼 10진수로 나타내어 줄일 수 있다.
DNS
DNS에 대해서는 그렇게 많이 설명할 필요가 없을 것 같다. DNS는 이름을 알면 IP 주소를 알 수 있거나 IP 주소를 알면 이름을 알 수 있는 원리, System이다.
보통은 이렇게 이름과 IP 주소를 대응 시키기 위해 가장 많이 DNS를 사용하지만 메일 주소와 메일 서버를 대응시키는 것 등 다양한 정보를 이름에 대응해서 등록할 수도 있다.
Socket 라이브러리
DNS 서버에 조회한다는 것은 DNS 서버에 조회 메시지를 보내고, 거기에서 반송되는 응답 메시지를 받는다는 것이다. 이것은 DNS 서버에 대해 클라이언트로서 동작한다고 할 수 있다. 이에 해당하는 것이 DNS 리졸버 또는 그냥 리졸버라고 한다.
DNS의 원리를 사용하여 IP 주소를 조사하는 것을 name resolution 이라고 하는데 이것을 실행하는 것이 리졸버(resolver)이다. 간단히 말해서 리졸버가 DNS 서버에 조회 메시지를 보내서 IP 주소를 얻어오는 것이라고 생각하면 된다.
리졸버의 실체는 Socket 라이브러리에 들어있는 부품화한 프로그램이다. 그렇다면 Socket 라이브러리는 무엇인가?
Socket 라이브러리는 OS에 포함되어 있는 네트워크의 기능을 애플리케이션에서 호출하기 위한 부품을 모아놓은 것이라고 생각하면된다. 그리고 리졸버가 그 속에 들어있는 부품 중 하나이다.
리졸버
위에서도 언급한 리졸버는 애플리케이션에서 간단히 호출하여 이용할 수 있다. 예를 들어서 다음과 같이 C언어로 작성한 네트워크 애플리케이션의 소스코드가 있다고 하자.
<애플리케이션 프로그램의 이름> (<매개변수>)
{
....
<메모리 영역> = gethostbyname("www.google.com");
....
<HTTP 메시지 송신>
....
}
위 코드와 같이 프로그램명(gethostbyname)과 웹 서버의 이름 "www.google.com" 을 쓰기만 하면 리졸버를 호출 할 수 있다. 이렇게 리졸버를 호출하면 리졸버가 DNS 서버에 조회 메시지를 보내고 DNS 서버에서 응답 메시지가 돌아온다. 이 응답 메시지 안에 IP 주소가 포함되어있어 리졸버가 추출하고 브라우저에 지정한 <메모리 영역>에 집어넣는다.
브라우저가 웹서버에 메시지를 보낼 때는 이 메모리 영역에서 IP 주소를 추출하여 HTTP의 리퀘스트 메시지와 함께 OS에 건네주어 송신을 의뢰한다.
그렇다면 리졸버 내부에서는 어떻게 작동될까??
- 우선 위에서 설명했듯이 애플리케이션에서 리졸버를 호출하여 사용한다. 이때 리졸버를 호출하면 애플리케이션의 동작이 일시적으로 정지한다. 그리고 Socket 라이브러리의 내용에 있는 리졸버가 작동되는 것이다.
- 작동된 리졸버는 DNS 서버에 보낼 메시지를 만든다. 예를 들어 "www.google.com"의 IP를 가르쳐 달라는 의미의 메시지를 만드는 것이다.
- 메시지를 만들었으면 이제 DNS 서버에 보내야된다. 하지만 리졸버는 송신 동작을 할 수가 없다. 이전에도 언급했듯이 송신하기 위해서는 OS에 의뢰를 해야한다. 이때 OS내부에 있는 프로토콜 스택이라는 녀석을 호출하여 실행한다.
- 메시지를 받은 DNS 서버에서는 해당 조회 내용을 조사하여 답을 찾는다. 이에 대한 설명은 나중에 설명하기로 한다.
- DNS 서버에서 답이 발견됬다면 당연히 돌려줄 것이다. 그러면 반대로 응답 메시지에 잡을 써서 프로토콜 스택을 경유하여 리졸버에게 건네지게 될 것이다.
- 응답 메시지를 받은 리졸버는 내용을 해독한 후 IP 주소를 추출하여 위에서 설명한 <메모리 영역>에 저장하여 애플리케이션에 넘겨준다.
여기서 DNS 서버에 메시지를 보낼 때에도 DNS 서버의 IP 주소가 필요하다. 하지만 DNS 서버의 IP 주소는 조사할 필요가 없다. 왜냐하면 TCP/IP 설정 항목의 하나하나로 컴퓨터에 미리 설정되어있기 때문이다.
'Network' 카테고리의 다른 글
[웹 브라우저의 동작] 4. 프로토콜 스택 (0) | 2021.05.16 |
---|---|
[웹 브라우저의 동작] 3. DNS (0) | 2021.05.15 |
[웹 브라우저의 동작] 1. HTTP (0) | 2021.05.12 |
HTTP 상태 코드 (0) | 2021.05.05 |
HTTP 메시지 (0) | 2021.05.04 |