20191214_TIL

|

12/14 토요일

  1. 자바, 스프링
  • 백기선님의 <더 자바, 코드를 조작하는 다양한 방법> 강의 1,2강을 학습하였다.
  • JVM 구조에 대해 디테일하게 학습할 수 있어 좋았다.

20191213_TIL

|

12/13 금요일

  1. 알고리즘

    • 퀵 정렬의 개념과 avg,best, worst 경우 시간복잡도에 대해 학습하였다.
  • 소감
    • 퀵 정렬의 개념이 많고 복잡해서 생각보다 시간이 많이 걸렸다

프로토콜 스택의 데이터 송신과정

|

프로토콜 스택의 데이터 송수신 과정

  • IP 주소를 조사했으면 IP 주소의 상대, 여기에서는 액세스 대상 웹 서버에 메시지를 송신하도록
    OS 내부에 있는 프로토콜 스택에 의뢰한다. 이 행위는 socket 라이브러리에 의해 이루어 진다.

  • 송 수신 동작의 이미지를 그림으로 나타내면 아래와 같다.

데이터 송수신 과정

  • 해당 과정은 모두 OS 내부 프로토콜 스택에서 발생한다
  1. 클라이언트에서 소켓을 만든다
  2. 서버측의 소켓에 파이프를 연결한다
  3. 데이터를 송수신 한다
  4. 파이프를 분리하고 소켓을 제거한다

다음 과정을 사진으로 보며 이해해보자.

클라이언트에서 소켓을 만든다

  • socket 라이브러리의 socket() 메서드를 호출한다.
  • 운영체제 내부 프로토콜 스택은 소켓의 정보를 저장하기 위해 메모리 영역을 할당하고 그곳에 소켓 제어 정보(상대 IP, 소켓 상태 정보 등)를 저장한다.
  • 운영체제는 생성된 소켓의 정보의 파일 디스크립터를 사용자 프로그램에게 반환해준다.
    • 디스크립터
      • 프로토콜 스택의 내부에 이는 다수의 소켓 중 어느 것을 가리키는지를 나타내는 번호표와 같은 존재이다.

서비측의 소켓에 파이프를 연결한다

  • socket 라이브러리의 connect(디스크립터, 서버 IP 주소, 서버 포트 번호)를 호출하여 서버와 소켓을 연결한다.
  • 웹은 포트번호 80, 메일은 25이 default

메시지를 주고 받는 송∙수신 단계

  • socket 라이브러리의 write(디스크립터, 송신 데이터, 송신데이터 길이)를 호출하여 데이터를 송신한다.
  • socket 라이브러리의 read(디스크립터, 수신 버퍼 , …)를 호출하여 데이터를 수신한다.
    • 수신한 응답 메시지를 저장하는 영역을 수신 버퍼라 한다.

파이프를 분리하고 소켓을 제거 한다

  • 웹 서버가 응답 메시지를 송신 완료했을때 먼저 소켓을 제거한다.

    이 것이 클라이언트측에 전달되고 read()를 호출 했을때

    클라이언트는 소켓을 제거한다.

ref 성공과 실패를 결정하는 1% 네트워크 원리

브라우저의 역활

|

브라우저

  • 웹 서버(HTTP), FTP, MTP,SMTP 등등을 액세스하는 복합적인 클라이언트 소프트웨어
// HTTP 프로토콜
http://user(사용자명,생략가능):password(패스워드,생략가능)@www.cyber.co.kr(도메인):80(포트,생략가능)/dir/file1.htm(파일경로명,디렉토리/파일명)



// FTP 프로토콜
ftp://user(사용자명,생략가능):password(패스워드,생략가능)@ftp.cyber.co.kr(도메인):21(포트,생략가능)/dir/file1.htm(파일경로명,디렉토리/파일명)


// 파일명이 생략된 경우
http://www.lab.cyber.co.kr/dir/ -> dir 폴더의 기본 페이지로 이동 (ex. index.html)

http://www.lab.cyber.co.kr -> 루트 디렉토리의 기본 페이지로 이동

http://www.lab.cyber.co.kr/whatisthis -> 파일 먼저 찾고 없으면, 디렉토리로 찾는다.
...

브라우저가 하는 일(웹 서버 기준)

    1. URL을 해석하여 HTTP 리퀘스트 메시지를 작성한다.

      • 리퀘스트 메시지는 Header + URI + 메서드로 이루어져 있다.

      • 리퀘스트 메시지의 첫 번째 행을 리퀘스트 라인이라 한다.

        // 리퀘스트 라인
        GET(메서드) /cgi/sample.cgi?Field1=abc&SendButton=SEND(URI) HTTP/1.1(HTTP 버전)
               																					
        
    2. DNS 서버에 도메인의 IP주소를 알아내기 위한 리퀘스트 메시지를 작성한다.
      (name resolution, 이름 확인)

      • DNS 클라이언트에 해당하는 것을 DNS 리졸버라 부른다
      • 리졸버는 소켓 라이브러리에 존재한다.
    3. 리졸버는 메시지 송신을 위해 OS의 프로토콜 스택을 호출한다.

    4. LAN 어댑터를 통해 메시지가 DNS 서버로 송신된다.

    5. 응답이 프로토콜 스택을 경유하여 리졸버에 건네지고, 리졸버는 브라우저에게 IP주소를 건네준다.

  1. 리졸버를 통해 얻은 IP 주소와 HTTP 리퀘스트 메시지를 OS의 프로토콜 스택에 건네준다.

  2. 5와 같은 과정이 일어난다.

  3. 웹 서버에서 돌아온 응답을 화면에 표시한다

    • 응답 내용에 추가 리퀘스트가 필요한 내용이 존재하면(사진,동영상 등등) 그 부분을 비워놓고 순차적으로 다시 리퀘스트 한다.

      (리퀘스트 시 URI는 하나만 존재하므로 한 번에 여러 요청을 할 수 없다)

라우터

  • 라우터(router[a] 혹은 라우팅 기능을 갖는 공유기패킷의 위치를 추출하여, 그 위치에 대한 최적의 경로를 지정하며, 이 경로를 따라 데이터 패킷을 다음 장치로 전향시키는 장치이다. 간단히 말해 서로 다른 네트워크 간에 중계 역할을 해준다.

IP 주소

  • 네트워크 번호 + 호스트 번호
    • 네트워크 번호 : 서브넷 주소
    • 호스트 번호 : 서브넷에 존재하는 각각의 컴퓨터 주소
  • IP 주소는 32비트의 디지털 데이터로 8비트씩 점으로 구분하여 10진수로 표기

    • 10.11.12.13
  • 어느 것이 네트워크 번호인지, 호스트 번호인지 알 수 없으므로 넷마스크를 통해 구분한다

    • 10.11.12.13/255.255.255.0

    • 넷마스크가 1인 부분은 네트워크 번호를 나타내고, 0인 부분은 호스트 번호를 나타낸다

      255 -> 11111111 (네트워크 번호)

      0 -> 00000000 (호스트 번호)

    • 10.11.12.13/255.255.255.0 = 10.11.12.13/24 (네트워크 번호의 비트 수로 넷마스크를 표기할 수 있다)

    • 호스트 번호 부분의 비트 값이 모두 0 or 1인 경우는 특별한 의미를 가진다.

      • 0 : 서브넷 자체
      • 1 : 서브넷에 있는 기기 전체에 패킷을 보내는 브로드캐스트

도메인명과 IP 주소를 구분하여 사용하는 이유

  • IP 주소는 기억하기 어렵다

  • IP 주소 대신 도메인을 통신하면 IP주소(32비트) 대비 비효율적이다.

ref 성공과 실패를 결정하는 1% 네트워크 원리

DNS 서버

|

DNS 서버

DNS 서버의 기본동작

  • DNS 서버가 받는 Request가 포함하는 정보

    1. 이름
      • 서버나 메일 배송 목적지와 같은 이름
    2. 클래스
      • DNS의 구조를 고안했을 때 인터넷 이외에도 네트워크에서의 이용까지 검토하여 식별하기 위해
        클래스라는 정보가 존재한다. 그러나 지금은 인터넷 이외의 네트워크는 소멸되었으므로 클래스는
        항상 인터넷을 나타내는 ‘IN’이라는 값이 된다.
    3. 타입
      • 이름에 어떤 타입의 정보가 지원되는지를 나타낸다.
        예를 들어 타입이 A이면 이름에 IP주소가 지원되는 것을 나타내며,
        MX이면 이름에 메일 배송 목적지가 지원된다는 것을 나타낸다.
        또한 이 타입에 따라 클라이언트에 회답하는 정보의 내용이 달라진다.
    • 예시

      • www.lab.cyber.co.kr인 서버의 IP 주소를 조사할 때 클라이언트는 이름 = www.lab.cyber.co.kr
        클래스=IN

        타입=A 3가지 정보를 DNS 서버에 보낸다.

  • DNS 서버의 응답내용
    • request 정보로 찾은 리소스 레코드(사진 참고)의 내용(192.0.2.226)을 반환한다.

서브 도메인

  • 예를들어, 도메인 opentutorials.org 는 오픈튜토리얼스의 서버를 가리킨다. 만약 오픈튜토리얼스의 내부 구성원들간에 커뮤니케이션을 위해서 게시판을 운영해야 하고, opentutorials.org 와는 다른 서버를 사용해야 한다면, 도메인을 새로 구입해야 할까? 아니다. DNS 서버에 bbs.opentutorials.org에 대한 IP를 등록하면 opentutorials.org와 bbs.opentutorials.org가 가리키는 IP를 서로 다르게 설정해서, 각각의 도메인이 서로 다른 서버를 가리키게 할 수 있다. 이런 것을 서브 도메인이라고 부른다.

도메인의 계층

  • 인터넷에는 막대한 수의 서버가 있으므로 이것을 전부 1대의 DNS 서버에 등록하는 불가능하다.

    따라서 정보를 분산시켜 다수의 DNS 서버에 등록하고 DNS 서버끼리 연대하여 원하는 정보를 찾아내는 구조로 이뤄져있다.

  • DNS 서버에 등록된 정보는 도메인명이라는 계층적 구조를 가진다.

    • www.opentutorials.org 처럼 점으로 계층을 구분한다.
    • 오른쪽에 위치한 것이 상위 계층이다.
    • 각각을 도메인이라 한다. (org 도메인, opentutorials 도메인, www 도메인 …)
    • 위의 그림에서 www, bbs, file을 서브 도메인이라고 부르고, 위의 예제에서는 서버를 식별하기 위해서 사용됐다. 그리고 opentutorials는 서브 도메인인 www, bbs, file를 포괄하는 상위 도메인으로 사용되고 있고, .org는 최상위 도메인으로 opentutorials가 영리를 목적으로 하지 않는 비영리의 단체나 서비스라는 점을 의미한다. 그리고 최상위 도메인의 상위 도메인이 하나 더 있는데, 이것을 루트 도메인(root domain)이라고 부른다. 루트 도메인은 모든 도메인의 뿌리이기 때문에 ‘.org’의 org나 ‘.com’의 com과 같은 도메인 이름이 없고 그냥 ‘.’으로 표시된다. 그런 이유로 도메인을 표기할 때 일반적으로 생략한다. 하지만, opentutorials.org. 과 같이 주소를 입력해도 정상적으로 잘 작동한다. 이해를 돕기 위해서 비유하자면 루트 도메인 ‘.’에는 ‘.org’라는 디렉토리가 들어 있고, ‘.org’ 안에는 ‘.opentutorials’라는 디렉토리가 있고 ‘.opentutorials’ 안에는 다시 www, bbs, file이 있는 셈이다. 이 관계를 그림으로 나타내면 아래와 같다.

최상위 도메인

최상위 도메인

  • 최상위 도메인은 도메인을 구분하는 가장 큰 카테고리인데, 도메인을 성격에 따라서 분류한 것이다. 이것은 국제기구인 ICANN에서 관리하기 때문에 도메인을 구입하려면 미리 정해져있는 최상위 도메인 중의 하나를 골라야 한다. 도메인을 고르는 방법은 생활코딩의 도메인 수업을 참고하자. 아래는 몇가지 대표적인 항목이다. 전체 목록은 위키백과를 참조하자.
    • com
    • net
    • org
    • co.kr
    • ac.kr

    이제 DNS 서버가 어떻게 동작하는지 알아볼 차례다. 전세계에는 수만대의 DNS 서버가 있다. 한대의 DNS 서버가 모든 도메인에 대한 정보를 가지고 있는 것을 어려운 일이다. 그래서 인터넷에서는 도메인 정보를 분산해서 저장하고 있다. 예를들어 lab.opentutorials.org의 IP 주소를 조회한다고 해보자. 이 도메인에서 가장 상위에 있는 도메인은 무엇일까? 루트 도메인이다. 루트 도메인은 전세계에 13개가 존재하고, 이 도메인의 IP는 잘 변경되지 않기 때문에 모든 DNS 서버는 루트 도메인을 알고 있다. 여기가 출발점이 되는 것이다. 아래 그림을 보자.

클라이언트는 브라우저가 설치된 컴퓨터다. 사용자가 URL을 주소창에 opentutorials.org를 입력하고 엔터를 치면,

  • (1) 브라우저가 설치된 컴퓨터는 opentutorials.org의 IP를 알아내기 위해서 가장 가까운 곳에 위치한 DNS에 opentutorials.org의 IP를 문의 한다.
  • (2)가장 가까운 DNS 서버가 IP를 알고 있다면 즉시 IP 주소를 알려준다.
    하지만 IP 주소를 모르면 루트 도메인 네임서버에게 문의한다.
  • (3) 루트 네임서버는 도메인의 최상위 도메인이 .org인 것을 보고 .org가 등록된 네임서버의 IP를 전달한다.
    이것은 이런 의미가 된다. “나는 IP 주소를 가지고 있지 않지만, .org 네임서버에게 물어보면 도와줄꺼야”
  • (4) 가장 가까운 DNS는 org 도메인을 관리하는 네임서버에게 문의한다.
  • (5) org 네임서버는 opentutorials의 네임서버 IP 주소를 알려준다.
  • (6) 가장 가까운 DNS 서버는 opentutorials의 네임서버에게 문의하고,
  • (7) www 의 네임서버를 알려준다.
  • (8) 최종적으로 www 네임서버에게 문의 후
  • (9) www.opentutorials.org의 IP 주소를 얻는다.
  • (10) 가장 가까운 DNS 서버는 이 IP 주소를 클라이언트에게 알려준다.
    클라이언트 컴퓨터는 이 IP를 브라우저에게 알려주면 브라우저는 이 IP에 해당하는 컴퓨터에 접속 할 수 있게 된다.

가장 가까운 DNS 서버

  • 위의 그림에서 가장 가까운 DNS 서버의 의미는 클라이언트에 기본적으로 등록되어 있는 DNS 서버를 의미한다. 클라이언트는 최소 한개 이상의 DNS 서버가 등록되어 있어야 이 DNS 서버를 이용해서 접속하고자 하는 도메인에 대한 IP를 알아낼 수 있다. 기본 DNS라고도 하는데 이 정보는 인터넷에 연결하면 인터넷 서비스 제공자(KT, SK브로드밴드 등)에 의해서 자동으로 설정된다. 기본 DNS를 직접변경하려면 아래의 자료를 참조한다. 이전 단락에서 언급한 분류법에 의하면 ‘가장 가까운 DNS’는 cache DNS에 해당된다.

캐쉬

  • 전세계에 흩어져 있는 네임서버들은 이렇게 협력해서 도메인과 IP를 연결해주고 있는 것이다. 이것은 마치 낮선 곳을 찾아갈 때 그 동네 사람들에게 물어 물어서 목적지를 찾아가는 것과 흡사하지 않은가? 그런데 실제로 네임서버는 이것 보다 조금 더 복잡하게 동작한다. 한번 조회한 IP 주소는 각 단계의 네임서버들에 저장되어 있어서, 다음 요청이 들어올 때 다른 네임서버에 방문할 필요가 없이 저장된 IP 주소를 알려줘서 시간과 네트워크 트래픽 부담을 줄인다. 한번 처리 한 작업을 보존해서 속도와 비용을 절감하는 행위를 캐쉬(cache)라고 한다. 이러한 캐쉬 메커니즘은 브라우저를 비롯해서 클라이언트 각 단계의 DNS 서버가 모두 가지고 있다. 그런 이유로 도메인의 IP 주소가 변경되었는데도 불구하고, IP가 변경되지 않는 경우가 있다. 이런 경우 1~2일 정도 경과된 후에는 자동으로 캐쉬들이 새로 만들어지기 때문에 자동으로 해소된다. 또는 도메인의 소유자가 자신의 도메인의 캐쉬 갱신 주기를 저정 할 수 있다.

ref. 생활코딩

ref 성공과 실패를 결정하는 1% 네트워크 원리