과정을 즐기자

웹 브라우저가 메세지를 만든다(feat. HTTP, DNS, OS 프로토콜 스택, 소켓) 본문

Network

웹 브라우저가 메세지를 만든다(feat. HTTP, DNS, OS 프로토콜 스택, 소켓)

320Hwany 2023. 6. 29. 12:47

이 글은 '성공과 실패를 결정하는 1%의 네트워크 원리' 책의 1장으로 보고 정리한 내용입니다.

HTTP Request Message를 작성한다

먼저 사용자가 브라우저에 URL을 입력합니다. URL에는 프로토콜, 웹서버명, 디렉토리명, 파일명 등이        

정의되어 있습니다.        
프로토콜에는 http, ftp, file, mailto 등이 있지만 여기서는 가장 많이 사용하는 http로 설명하겠습니다.
이제 브라우저는 URL의 정보를 보고 HTTP Request Message를 만듭니다.           
이렇게 브라우저가 만든 HTTP Request Message를 서버에 전송하고 서버로부터             

HTTP Response Message를 받습니다. HTTP 구조에 대한 자세한 내용은 이전 글을 참고해주세요.       

HTTP 특징
HTTP 메소드
HTTP Status Code
HTTP header

웹 서버의 IP 주소를 DNS 서버에 조회한다

IP 주소

IP 주소란 32 비트의 디지털 데이터로 네트워크 번호, 호스트 번호를 합친 것을 말하며 기기에 장착된
각각의 네트워크용 하드웨어를 구분하기 위해 사용합니다.
IP 주소 규칙에서는 네트워크 번호와 호스트 번호의 2가지를 합쳐 32비트로 한다는 것만 결정되어 있고
어디까지가 네트워크 번호인지, 호스트 번호인지는 결정되어 있지 않습니다.
이러한 내역을 나타내는 정보가 필요하여 IP 주소에 덧붙이는데 이 정보를 '넷마스크'라고 합니다.
예를들어 다음과 같이 작성할 수 있습니다.

10.11.12.13/255.255.255.0
(IP 주소 본체) (넷마스크)

10진수를 비트 수로 나타냈을 때 1인 부분이 네트워크 번호이고 0인 부분이 호스트 번호입니다.
참고로 호스트 번호 부분이 모두 0인 IP 주소는 서브넷 자체를 나타내고 모두 1인 IP 주소는
서브넷에 있는 기기 전체에 패킷을 보내는 '브로드캐스트'를 나타냅니다.

DNS 서버에 조회하여 IP 주소를 찾아낸다

IP 주소는 기억하기 어렵기 때문에 보통 도메인을 사용하며 이러한 도메인과 매칭되는 IP 주소를 찾아야합니다.
브라우저는 HTTP Request Message를 만들기 위해서는 도메인과 매칭되는 IP 주소를 찾아야 합니다.
하지만 브라우저는 DNS 서버에 조회하는 네트워크 송출 기능은 없기 때문에 OS에 의뢰합니다.
이렇게 OS에 의뢰하기위해 Socket 라이브러리를 사용합니다.


DNS 서버에 조회를 요청할 때는 Socket 라이브러리의 리졸버를 사용합니다.
브라우저가 리졸버를 호출하면 리졸버에서 DNS 서버에 조회하기 위한 메세지를 만듭니다.
이때 만든 메세지를 DNS 서버에 전송하기 위해서 리졸버는 OS 내부의 프로토콜 스택을 호출하여 실행합니다.
DNS 서버에서 IP 주소를 찾고 역순으로 다시 브라우저는 IP 주소를 받습니다.

 

전 세계의 DNS 서버가 연대한다

리졸버가 만든 메세지를 OS 내부의 프로토콜 스택을 통해 DNS 서버에 전달하고 IP주소를 받았습니다.
이때 DNS 서버가 IP 주소를 반환하는 과정에 대해 자세히 알아보겠습니다.
우선 DNS 서버로 조회하는 메세지는 3가지 정보가 포함되어 있습니다.

  • 이름 = 320hwany.tistory.com
  • 클래스 = IN (인터넷)
  • 타입 = A (address의 약자)

DNS 서버는 서버에 등록된 도메인명과 같은 3가지 항목을 IP 주소의 대응표를 조사하여 일치하는 IP 주소를
클라이언트에 반환합니다.


하지만 인터넷에는 막대한 수의 서버가 있으므로 이것을 전부 1대의 DNS 서버에 등록하는 것은 불가능합니다.
따라서 정보를 분산시켜서 다수의 DNS 서버에 등록하고 다수의 DNS 서버가 연대하여 어디에 정보가 등록되어        

있는 지를 찾아내는 구조입니다.


320hwany.tistory.com 처럼 점으로 구분되어 있는데 이 점이 계층을 구분합니다.
하위의 도메인을 담당하는 DNS 서버의 IP 주소를 그 상위의 DNS 서버에 등록합니다.
예를들어 320hwany.tistory.com 이라는 도메인을 담당하는 DNS 서버의 IP 주소를 tistory.com 의 DNS 서버에 등록하고
tistory.com DNS 서버의 IP 주소는 com 도메인의 DNS 서버에 등록합니다.
또한 com 이나 kr의 상위에 또하나의 루트 도메인이 있습니다. 이 루트 도메인의 DNS 서버를 인터넷에 존재하는
모든 DNS 서버에 등록합니다.


정리해보면
(1) 하위 DNS 서버의 IP 주소를 상위 DNS 서버에 등록합니다.
(2) 루트 도메인의 IP 주소를 모든 DNS 서버에 등록합니다.

DNS 서버 찾기 예시

브라우저에 320hwany.tistory.com 를 입력하면 가장 가까운 DNS 서버(A)에 요청합니다.
A에 320hwany.tistory.com의 IP 주소가 없다면 루트 도메인 DNS 서버에 요청을 합니다.
루트 도메인 DNS 서버에서 com의 DNS 서버의 IP 주소를 A에 알려줍니다.
A는 com DNS 서버에 요청을하고 여기에도 없다면 com DNS 서버는 A에 tistory.com의 IP 주소를 알려줍니다.
A는 tistory.com DNS 서버에 요청을 하고 여기에도 없다면 tistory.com DNS 서버는 320hwany.tistory.com
DNS 서버의 주소를 알려주고 A는 320hwany.tistory.com에서 IP 주소를 받아옵니다.
이때 DNS 서버는 한 번 조사한 이름을 캐시에 기록할 수도 있습니다.

프로토콜 스택에 메세지 송신을 의뢰합니다

DNS 서버에 조회를 할 때 OS 내부의 프로토콜 스택에 의뢰를 합니다. 마찬가지로 메세지를 송신할 때도
OS 내부의 프로토콜 스택에 의뢰를 합니다. 이때도 Socket 라이브러리 프로그램 부품을 결정된 순서대로 호출합니다.
TCP의 경우 통신을 할 때 파이프의 양끝에 있는 데이터 출입구인 소켓이 있습니다.

OS 내부의 프로토콜 스택이 다음을 실행합니다

소켓을 만듭니다(소켓 작성 단계)

클라이언트 측의 소켓을 만드는 것은 Socket 라이브러리의 socket이라는 프로그램 부품만 호출하면 됩니다.
소켓이 생기면 디스크립터라는 것이 돌아옵니다.
한 컴퓨터에는 복수의 소켓이 존재하고 이러한 소켓을 구분하기위한 것이 디스크립터입니다.

서버측의 소켓에 파이프를 연결합니다(접속 단계)

애플리케이션 Socket 라이브러리의 connect라는 프로그램 부품을 호출하여 동작을 의뢰합니다.
여기서 connect를 호출할 때 디스크립터, 서버의 IP 주소, 포트 번호 3가지 값을 지정합니다.
- 디스크립터 : 애플리케이션이 소켓을 식별하는 것
- IP 주소와 포트 번호 : 클라이언트와 서버 간에 상대의 소켓을 식별하는 것

데이터를 송수신합니다(송수신 단계)

Socket 라이브러리의 write라는 프로그램 부품을 호출하여 동작을 의뢰합니다.
소켓에는 연결된 상대가 기록되어 있으므로 디스크립터로 소켓을 지정하면 연결된 상대가 판명되어
그곳을 향해 데이터를 송신합니다.

파이프를 분리하고 소켓을 말소합니다(연결 끊기 단계)

Socket 라이브러리의 close라는 프로그램 부품을 호출하여 연결 끊기 단계로 들어갑니다.
소켓 사이를 연결한 파이프와 같은 것이 분리되고 소켓도 말소됩니다.


출처 : 성공과 실패를 결정하는 1%의 네트워크 원리

'Network' 카테고리의 다른 글

물리 계층(L1), 데이터 링크 계층(L2)이 하는 일  (0) 2023.07.20
TCP/IP를 이용한 통신 알아보기(feat. 소켓, LAN 어댑터, UDP)  (0) 2023.07.04
HTTP header  (0) 2022.12.27
HTTP Status Code  (0) 2022.12.17
HTTP 메소드  (0) 2022.12.17