HTTP & DNS

Jamangstangs·2022년 2월 7일
1

Network

목록 보기
1/1
post-thumbnail

From Web Browser

HTTP Protocol

URL

  • URL : Uniform Resource Locator -> 네트워크 상에 원하는 resource가 어디 있는지 알려주기 위한 프로토콜이다.

    • 브라우저는 웹 서버에 액세스 하는 용도로 사용된다.
    • 주요 URL의 종류와 작성 방법을 알아보자.
  • HTTP Protocol

    http://user:password@www.webserver.co.kr:8080/home/file.html

  • FTP protocol

    ftp://user:password@ftp.webserver.co.kr:8080/home/file.html

  • PC 자체의 데이터 가져오기

    file://localhost/c:/path/file.html

  • 메일 송신

    mailto:jmjm@naver.com

URL Decode

  • 작성한 URL은 브라우저가 해독한다.
  • 해독하여 Request Message를 작성한다.
  1. 해독하는 방법은 아래와 같다.

    http: // www.webserver.co.kr / dirname /..../ fileName

    • http -> 프로토콜 방식을 기록한다.
    • // -> 나중에 이어지는 문자열이 서버의 이름이다.
    • www.webserver.co.kr -> 웹 서버의 이름이 나온다.
    • 뒤에는 서버에 저장된 데이터의 경로명을 나타낸다.
  2. 해독할 때, fileName이 없으면 어떻게 하나?

    http: // www.webserver.co.kr / dirname /..../

    • 디렉토리 위치는 알지만, 어느 파일에 액세스 해야할지 모른다.

    • 대부분의 디렉토리에 기본 html파일을 설정해둔다.

      • default.html
      • index.html

      즉, 파일명을 생략하면, /dirname/index.html과 같은 방식으로 접근한다.

  3. 마지막에 / 생략된다면?

HTTP Protocol

Client -(HTTP Request)-> Server

Client <-(HTTP Response)- Server

HTTP Protocol : Client와 Server가 주고받는 메시지의 내용의 순서를 정의한 규약

  • HTTP Request 구성
    • URI : 파일의 이름, CGI 프로그램의 파일명, 무엇을 받을지
    • Method : 웹서버에 요구하는 행동
  • HTTP Response 구성
    • Status Code : Request의 결과가 어떻게 되었는지 알려주는 코드

자주 쓰이는 Method에 대해서 알아보자 .

  • GET
    • URI로 지정한 정보를 웹서버로부터 달라고 요청한다.
  • POST
    • Form형식의 데이터를 Web Server에 보낸다.
    • URI에는 Application Program의 파일명을 사용한다.

HTTP Request

Request 메세지의 작성 법을 알아보자.

METHOD  URL  HTTP_Version					# Request Line
FieldName : FieldValue						# Request Header 
...											# Request Header 
...											# Request Header 
											# Blank Line
Request Message Body 						# Request Message Body
  • Request Line : 어떤 리퀘스트인지 추측 가능
  • Request Header : Request의 부가적인 정보를 나타낸다.
  • Blank Line
  • Request Message Body : Form에 입력한 데이터, Client에서 Server로 보내는 데이터

HTTP Response

Responde 메세지의 작성법을 알아보자.

HTTP_Version  Status_Code Status_Phrase		# Status Line
FieldName : FieldValue						# Response Header 
...											# Response Header 
...											# Response Header 
											# Blank Line
Request Message Body 						# Response Message Body
  • Status Line : 어떤 리스폰스인지 추측 가능하다.
  • Response Header : Response의 부가적인 정보를 나타낸다.
  • Blank Line
  • Response Message Body : CGI에서 출력한 데이터, Server에서 Client로 보내는 데이터

유의점

  • 요청한 페이지의 정보가 문장으로만 이루어져 있다 -> 1개의 URI로 충분

  • 만약, 페이지에 영상, 사진 정보가 있다 -> 태그

    <img src = "image.png">

    따라서, 응답 받은 HTML에서 태그를 먼저 탐색한다 . 만약 태그가 있으면,

    1. **태그 자리를 제외하고** 문장을 먼저 표시한다. 
    1. 사진, 영상을 다시 한 번 **Request한다.** 이는 사진, 영상의 갯수만큼 다시 Request를 보낸다. 

Summary & Next

  1. HTTP Message를 만든다.

    • HTTP Request
    • HTTP Response

    의 종류가 있고, 우선 HTTP Request를 작성했다고 가정하자.

  2. HTTP Request Message를 작성하였으면, OS에게 의뢰해서 Web Server로 송신하게 한다.

    • 브라우저가 HTTP 메시지를 보낼 수 있는 방법은 없다.
    • OS에게 의뢰해서 보내달라고 해야한다.

DNS Server

IP Address

IP 주소는 왜 필요할까?

  • HTTP 메세지를 전송하기 위해 OS에게 의뢰할때, URL 안에 있는 서버의 Domain Name에서 IP주소를 알아내야 한다.
    • 왜? > Domain Name 으로 송신을 의뢰하지는 않는다.
    • 따라서 > Domain Name : IP address 와 같이 대응하는 IP address를 알아내야 한다.
  • OS가 IP주소를 기반으로 통신하기 때문이다.

Subnet이란?

  • Subnet : 작은 네트워크로, 제일 End Point에서 구성되는 요소라고 생각하자. Hub - PCs의 집합이라고 생각하자.

    • Hub : 패킷을 중계하는 장치
    • PC : hub와 연결된 컴퓨터라고 보자.

    Subnet - Router로 연결되어 전에 네트워크가 구성된다고 생각하자.

IP 주소의 비유적 표현

  • IP주소 : 101동 203호
    • Subnet : 101동 -> Network ID
    • 각 PC : 203호 -> Host ID
  • Netmask : Network ID 부분의 비트를 1로 치환한 것. 실제 IP 주소를 살펴보면 이해가 갈 것이다.
    • Netmask AND IPaddress = Network ID가 나온다.
    • 100.101.102.103 & 255.255.255.0 = 100.101.102.0
    • 비트로 바꿔서 생각해보면 쉽게 이해가 가능하다.

실제 IP 주소의 표현

  • 32비트의 디지털 데이터, 8bit를 . 으로 구분하여 10진수로 표기한다. 표현 방식은 아래와 같다.

    # IP 주소의 표기 방법 -> Network ID, Host ID 구분 불가능
    100.101.102.103
    
    # IP 주소 + Netmask 표기 방법 -> Network ID, Host ID 구분 가능
    100.101.102.103/255.255.255.0
    
    # Netmask 표기 방법 다르게 해보기.-> 24개의 비트가 Network ID라는 영역을 차지한다는 뜻이다. 
    100.101.102.103/24
  • Host ID가 모두 0 or 1인 경우는 다른 의미를 가진다.

    # Host ID가 모두 0 -> Subnet 자체이다. 
    100.101.102.0/24
    # Host ID가 모두 1 -> Broadcast를 나타낸다. Broadcast는 Subnet 기기 전체에 packet을 보내는 것이다. 
    100.101.102.255/24

DNS Resolver

왜 사용할까? -> 그다지 효율적이지 않다. 라우터에 부하가 걸릴 수 있다.

  • IP 주소 : 32비트
  • DNS : 수십 바이트 ~ 최대 255바이트

DNS : Domain Name System, 서버명과 IP주소를 대응 시켜준다.

  • IP주소를 검색하는 방법 -> DNS 서버에 서버명에 대응하는 IP주소를 직접 물어본다.
    1. DNS 서버에 조회 메세지를 보낸다.
    2. 응답 메세지를 받는다.
  • DNS Resolver : DNS의 원리를 사용하여 IP주소를 조사하게 도와주는 프로그램

DNS Resolver 호출하는 예시

Program(){
  ...
  ipaddress = gethostbyname("www.naver.com");
  ...
}
  • 이와 같이 Resolver를 호출하면, DNS 서버에서 조회하고 리턴값을 메모리에 저장한다.

DNS Server

DNS Server가 하는 일

  1. Client에서 DNS Query를 받는다.
  2. DNS Query에 부합하는 DNS Response를 회신한다.

DNS Query의 구성

  • Query Name
    • 서버의 도메인의 이름
  • Class
    • IN -> Internet을 의미한다. 사실상 인터넷 이외의 네트워크 클래스는 소멸했다.
  • Type
    • Query Name에 어떤 정보가 지원되는지 나타낸다. .
      • A : IP주소가 지원된다.
      • MX : 메일 배송 목적지가 지원된다.

DNS server는 DNS Query의 세 가지 정보가 일치하는 것을 찾고, 세 가지 정보가 일치하는 response를 Client에 회신한다.

  • QueryName | Class | Type | Response Data
  • Response Data를 요청한 한 Client에 회신한다는 의미이다.
  1. DNS 서버에 저장 가능한 정보가 제한되어 있다. -> 도메인 네임에 대응하는 IP주소가 없을수도 있다.
  2. 따라서, DNS 서버가 계층적으로 분산되어 있다.

계층적으로 분산되어 있다는 것을 어떻게 알 수 있을까?

www.gist.ac.kr

  • .을 기준으로 계층을 나눈다.
  • 오른쪽에 위치한 것이 상위의 계층이다.

Domain을 어떻게 이해할까?

  • kr Domain 아래 ac Domain이 있다.
  • ac Domain 아래 gist Domain이 있다.
  • gist Domain 아래 www라는 이름이 있다.

Domain Server에 어떻게 저장이 될까 : 도메인 한 대를 등록한다.

  • kr Domain <- www.gist.ac.kr
  • ac Domain <- www.gist.ac.kr
  • gist Domain <- www.gist.ac.kr

DNS 서버에 등록되어 있는 IP주소릐 방식

  • www.gist.ac.kr
    • www의 DNS 서버의 IP 주소 -> gist의 DNS 서버에 등록
    • gist DNS 서버의 IP 주소 -> ac의 DNS 서버에 등록
    • ac의 DNS 서버의 IP 주소 -> kr의 DNS 서버에 등록
  • kr, com 위에는 루트 도메인이 있다.
    • www.gist.ac.kr. 마지막에 .이 루트 도메인이지만, 보통 생략한다.

DNS 서버에서 조회하는 방법

  • Client PC에서 www.gist.ac.kr. 의 IP 주소를 조회하고자 한다.

    1. 루트 도메인

      1-1. 있다. -> IP 주소를 준다.

      1-2. 없다. -> kr 도메인에서 물어봐라

    2. kr 도메인

      2-1. 있다 -> IP 주소를 준다.

      2-2. 없다. -> ac 도메인에서 물어봐라.

    3. .. 이와 같이 상위 도메인에 IP주소가 없으면, 하위의 DNS 서버의 IP주소를 알려주고 찾아가게 한다.

Protocol Stack

Socket

  • IP주소 DNS 서버에서 조회해서 접근하고자 하는 애플리케이션에 메시지를 송신해야한다.
  • 이때, OS 내부의 프로토콜 스택에 의뢰한다.
  • 송수신 동작은 다음과 같다.
    • Client <=(socket)=(Protocol Stack)=(Network)=(Protocol Stack)=(socket)=> Server
    • Socket : 데이터의 출입구
  • 구체적인 순서는 다음과 같다.
    1. 서버측에서 소켓 만든다.
    2. 클라이언트 측에서 소켓 만들고 서버측의 소켓과 연결한다.
    3. 준비가 완료되면 소켓에서 데이터 송수신을 실행한다.
    4. 송수신이 끝나면, 파이프를 분리한다.
  • 위의 4가지 동작 -> OS 내부의 Protocol Stack이 해준다.
  • Socker 라이브러리 <=> Protocol Stack : 같은 것으로 보고 이해하자.

Client <-(Data)-> Server

  • Application -> DNS Resolver 호출
  • Application -> socket library 호출

Socket도 DNS Resolver와 같이 부품을 호출한다는 개념으로 생각하자.

  • DNS와 함께, Socket을 사용하여 Protocol Stack에서 어떻게 송수신이 이루어지는지 알아보자. 아래 코드 순서대로 연결과 데이터가 송수신 된다고 알고 있으면 된다.
# DNS resolver 호출 -> IP address 알아내기
IPaddress = gethostbyname("www.gist.ac.kr")

# Socket 호출 -> Discriptor 가져온다. 
Discriptor = socket(IPaddress, ... )

# connect에 의뢰하기 -> 파이프를 연결한다. -> 연결이 되었으므로 데이터를 송수신하자. 
connect(Discriptor, IPaddress&Port)

# case 1 : 송신
write(Discriptor, HTTP Request, ...)
# case 2 : 수신
read(Discriptor, Receive_Buffer)

# 송수신이 끝났으므로 파이프 끊기
close(Discriptor)
  • Discriptor : Socket을 식별하기 위한 것, 이것으로 어느 소켓을 사용하여 접속할지 판단한다.

  • Connect에서 필요한 3가지

    1. Discriptor : 어느 소켓을 서버측의 소켓(이전에 받은 Discriptor)에 접속할지 판단하기 위함이다.
    2. IPaddress : 어느 컴퓨터인지 특정하기 위함이다.
    3. Port Number : 어느 application의 socket인지 특정하기 위함이다.
      • 웹 : 80, 메일 : 25
profile
자망스탕스

0개의 댓글