본문 바로가기

CS

컴퓨터 네트워킹 하향식 접근[Chapter 2]

[2.1] 네트워크 애플리켕션의 원리

  • 네트워크 애플리케이션 개발의 중심은 다른 위치의 종단 시스템에서 동작하고 네트워크를 통해 서로 통신하는 프로그램을 작성하는 것
  • 사용자의 호스트(테스크톱, 태블릿, 스마트폰 등)에서 실행되는 브라우저 프로그램과 웹 서버 호스트에서 실행되는 웹 서버 프로그램

2.1.1 - 네트워크 애플리케이션 구조

  • 클라이언트-서버 구조(client-sever architecture)
    • 서비스는 클라이언트라는 호스트들로부터 서비스 요청을 받음
    • 고전적인 예는 클라이언트 호스트에서 실행되는 브라우저에서 웹 서버로 서비스를 요청하는 웹 애플리케이션이 있다.
    • 클라이언트들 끼리 직접적으로 소통하지 않는다
      • sns를 통해 메시지를 보낼 때 대상자에게 직접 메시지를 보내는 것이 아닌 '송신 클라이언트 -> 서버 -> 수신 클라이언트'의 과정을 예시로 들 수 있을 듯
    • 서버가 고정 IP주소라는 잘 알려진 주소를 갖는다
      • 이 이유때문에 클라이언트는 언제 어디서든 서버 주소로 패킷을 보내 연결할 수 있다 
      • 서버 주소가 계속해서 바뀌면 클라이언트들은 그 서비스를 이용하기 어려울 것이다.
    • 때로는 하나의 서버 호스트가 해당 서비스의 모든 클라이언트의 요청을 다 응답하는 것은 불가능하다
      • 이런 이유로 수 많은 호스트를 갖춘 데이터 센터가 이용됨
  • P2P구조(peer-to-peer)
    • 서버에 최소한으로 의존하는 방식
    • peer라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신하게 한다
    • 자가 확장성
      • 하나의 peer는 클라이언트가 되기도 하지만 서버의 역할을 하기도 함

2.1.2 - 프로세스 간 통신

프로세스

  • 운영체제에서 실제 통신하는 것(프로그램이 아닌 프로세스가 실제 통신을 한다)
  • 프로세스 간의 통신을 위한 규칙은 종단 시스템의 운영체제에 의해 좌우된다
  • 2개의 종단 시스템에서 프로세스는 메시지 교환으로 서로 통신한다
    • 송신 프로세스는 메시지를 네트워크로 보냄 -> 수신 프로세스는 네트워크로부터 메시지를 받음

클라이언트와 서버 프로세스

  • 네트워크 애플리케이션은 네트워크에서 서로 메시지를 보내는 두 프로세스로 구성된다
    • ex)ㅇ웹 애플리케이션에서 클라이언트 브라우저 프로세스는 웹 서버 프로세스와 메시지를 교환한다
  • P2P파일 공유 시스템에서는 한 피어의 프로세스에서 다른 피어의 프로세스로 파일을 전송한다
    • 각 쌍에 대해 하나는 클라이언트의 프로세스(클라이언트), 하나는 서버의 프로세스(서버)로 이름을 짓는다
    • 하나의 프로세스가 서버와 클라이언트의 역할을 다 할 수 있다

클라이언트와 서버 프로세스

  • 프로세스는 소켓(socket)을 통해 네트워크로 메시지를 보내고 받는다
  • 소켓은 호스트의 애플리케이션 계층과 트랜스포트 계층 간의 인터페이스다
  • 애플리케이션과 네트워크 사이의 API라고도 한다
  • 애플리케이션 개발자는 소켓의 애플리케이션 계층에 대한 모든 통제권을 갖지만, 소켓의 트랜스포트 계층에 대한 통제권은 거의 갖지 못한다.
    • 트랜스포트 계층에 대한 애플리케이션 개발자의 통제는
      • 트랜스포트 프로토콜의 선택
      • 최대 버퍼와 최대 세그먼트 크기 같은 약간의 트랜스포트 계층 매개변수의 설정

프로세스 주소 배정

  • 한 호스트의 프로세스가 패킷을 다른 호스트의 프로세스로 보내기 위해서는 수신 프로세스가 주소를 갖고 있어야 한다
    • 프로세스 주소 = 소켓 = IP주소 + 포트번호
      • 예를 들면 IP 주소는 내가 살고있는 건물의 주소지 이며 포트 번호는 내가 살고 있는 호수 이다
      • 웹 서버는 포트번호 80번으로 식별되며 메일 서버는 25번으로 식별됨
    • IP주소는 32비트로 구성되며 호스트를 유일하게 식별

2.1.3 - 애플리케이션이 이용 가능한 트랜스포트 서비스

  • 소켓은 애플리케이션 프로세스와 트랜스포트 프로토콜 간의 인터페이스
    • 이 소캣을 통해 송신 프로세스는 메시지를 보내고 수신 프로세스는 메시지를 받음
  • 트랜스포트 계층 프로토콜 그것을 이용하는 애플리케이션들에게 제공할 수 있는 서비스는
    '신뢰적 데이터 전송', '처리율', '시간', '보안' 이 네가지 차원으로 분류할 수 있음

신뢰적 데이터 전송

  • 패킷들은 네트워크 내에서 손실 될 수 있다.(큐가 꽉차서 버려버리는 현상 등으로 인해)
  • 하지만 전자메일, 파일 전송, 원격 호스트 접속, 재무 애플리케이션 등의 경우 데이터 손실은 위험한 결과를 초래함
  • 위의 경우 데이터가 올바르고 완전히 전달되도록 보장하기 위한 서비스를 제공해야하는데 이를 신뢰적 데이터 전송을 제공한다고 함
    • 트랜스포트 계층 프로토콜이 이 서비스를 제공할 때 데이터가 온전할 것이라는 확신을 갖는다
    • 트랜스포트 계층 프로토콜이 이 서비스를 제공하지 않을 때는 손실 허용 애플리케이션의 경우이다
      • 실시간 오디오/비디오와 같은 멀티미디어 애플리케이션(ex. 동영상을 보는데 네트워크 상황으로 품질 저하가 일어나도 크게 문제되지 않는 경우)

처리율

  • 네트워크 경로를 따라 두 프로세스 간의 통신 세션에서 비트를 전달할 수 있는 비율
  • 다른 세션들이 대역폭을 공유하고 생겼다 없어졌다 하기 때문에 가용한 처리율은 시간에 따라 변동
  • 대역폭 민감 애플리케이션(bandwidth-sensitive application)
    • 명시된 속도에서 보장된 가용 처리율을 제공한다
  • 탄력적 애플리케이션(elastic application)
    • 가용 처리율이 많으면 많은대로 적으면 적은대로 이용
    • 전자메일, 파일 전송, 웹 전송 등

시간

  • 송신자가 소켓으로 내보내는 모든 비트가 수신자의 소켓에 일정 시간 이내에 도착 할것이라는 시간보장
  • 인터넷 전화, 가상 환경, 원격회의, 게임 등
    • 예를들어 인터넷 전화의 긴 지연시간은 부자연스러운 대화로 이어지기 때문

보안

  • 트랜스포트 프로토콜은 애플리케이션에 하나 이상의 보안 서비스를 제공할 수 있다
  • 기밀성, 데이터 무결성, 종단 인증등의 보안에 대해서는 8장에서 다룸

 

2.1.4 - 인터넷 전송 프로토콜이 제공하는 서비스

TCP서비스(특징)

  • 연결지향형 서비스
    • 애플리케이션 계층 메시지를 전송하기 전에 TCP는 클라이언트와 서버가 서로 전송 제어 정보를 교환한다
      • 이 핸드셰이킹 과정은 패킷이 곧 도달할 테니 준비하라고 알려주는 역할
    • 위 핸드셰이킹 과정을 지나면 TCP연결이 두 프로세스의 소켓 사이에 존재한다고 말해줌
    • 이 연결을 통해 서로에게 메시지를 보내고 받을 수 있기에 '전 이중(full-duplex)연결이라고 한다
    • 통신이 끝나면 연결을 끊어야 한다
  • 신뢰적인 데이터 전송 서비스
    • 모든 데이터를 오류 없이 올바른 순서로 전달하기 위해 TCP에 의존
    • 데이터가 손실되거나 중복되지 않게 수신 소켓으로 전달
  • 혼잡 제어 방식
    • 통신하는 프로세스의 직접 이득보다는 인터넷의 전체 성능 향상을 위한 서비스
    • 각 TCP연결이 네트워크 대역폭을 공평하게 공유할 수 있게끔 제한하려고 함

UDP서비스(특징)

  • 최소의 서비스 모델을 가진 간단한 전송 프로토콜
  • 비연결형 -> 핸드셰이킹 안함
  • 비신뢰적인 데이터 전송 서비스 -> 데이터 송/수신이 온전하게 이루어지지 않을 수도 있으며 순서가 뒤바뀔 수도 있음
  • 혼잡 제어 방식 x

인터넷 트랜스포트 프로토콜이 제공하지 않는 서비스

  • 많은 방화벽이 UDP트래픽을 차단하도록 설정되어 있기 때문에 UDP방식의 애플리케이션은 UDP통신이 실패할 경우를 대비해 TCP를 사용하도록 설계됨

2.1.5 - 애플리케이션 계층 프로토콜

애플리케이션의 프로세스가 서로 메시지를 보내는 방법

  • 애플리케이션 계층의 프로토콜을 아래와 같은 걸 정의함
    • 교환 메시지 타입(ex. 요청 메시지와 응답 메시지, request&response)
    • 여러 메시지 타입의 문법(ex. 메시지 내부의 필드와 필드 간의 구별 방법, json과 같은...)
    • 필드의 의미, 즉 필드에 있는 정보의 의미
    • 언제, 어떻게 프로세스가 메시지를 전송하고 메시지에 응답하는지 결정하는 규칙
  • RFC에 명시되어있음
  • 만약 브라우저 개발자가 HTTP RFC 규칙을 따르면 HTTP RFC규칙을 따르는 어떠한 웹 서버와 통신 가능
  • 독자적은 프로토콜을 이용하는 애플리케이션도 많다

[2.2] 웹과 HTTP

온디맨드 방식 : 사용자들이 원할 때 원하는 것을 수신

 

2.2.1 - HTTP 개요

HyperText Transfer Protocol. 즉, 하이퍼 텍스트를 전송하는 프로토콜(request와 response를 통해서)

 

웹 용어

  • 웹 페이지(web page) : 객체로 구성된 페이지
  • 객체(object) : 단일 URL로 지정할 수 있는 하나의 파일(이미지, HTML텍스트 등등)
    • HTML텍스트는 그 안에 다른 객체를 URL로 참조한다

 

  • HTTP는 웹 클라이언트가 웹 서버에게 웹 페이지를 어떻게 요청하는지와 서버가 클라이언트로 어떻게 웹 페이지를 전송하는지를 정의
    • 브라우저는 페이지 내부의 객체에 대한 HTTP요청 메시지를 서버에게 보내고 서버는 그 객체를 포함하는 HTTP응답값을 메시지로 응답
  • HTTP는 TCP프로토콜 사용
    • HTTP클라이언트는 서버에 TCP연결 시작
    • 연결이 이루어지면 데이터를 주고받을 소켓 인터페이스를 통해 접속
    • 클라이언트는 요청 메시지를 소켓으로 보내고 서버는 소켓으로 응답값을 보낸다
  • 서버가 클라이언트에게 요청 파일을 보낼 때, 클라이언트에 대한 그 어떤 정보도 저장하지 않는다 -> 비상태 프로토콜(stateless protocol)

2.2.2 - 비지속 연결과 지속 연결

  • RTT : TCP연결을 위해 작은 패킷이 가고 돌아오는데 걸리는 시간

 

  • 각 요구/응답 쌍이 분리된 TCP연결을 통해 주고 받는 것 - 비지속 연결(non-persistent connection)
    • 요구/응답 할 때 마다 RTT만큼의 시간이 계속 증가
  • 모든 요구/응답들이 같은 TCP연결을 통해 주고 받는 것 - 지속 연결(persistent connection)
    • HTTP는 디폴트 모드로 지속 연결을 사용(but, 비지속 연결 설정은 가능함)
    • RTT 한 번만 소요됨
    • 서버는 일정시간 사용되지 않으면 연결을 닫음

2.2.3 - HTTP 메시지 포멧

HTTP 요청 메시지

  • 첫 줄은 요청 라인으로 method, URL, 버전으로 이루어짐
    • method : GET, POST, HEAD, PUT, DELETE, PATCH 등

HTTP 응답 메시지

  • 상태라인, 헤더라인, 개체 몸체(응답 데이터)로 이루어짐

2.2.4 - 사용자간 서버 간의 상호작용 : 쿠키

  • 사이트가 사용자를 추적하기 위해 HTTP는 쿠키를 사용한다
    • 처음으로 어떤 사이트에 접속하게 되면 HTTP응답에 식별 번호를 답고있는 'Set-cookie'가 헤더에 포함되고 클라이언트는 이를 저장한다
    • 저장된 쿠키는 서버로 요청 보낼 때 이 식별 번호를 헤더에 담아 보내고 서버는 이 식별번호를 토대로 데이터 베이스에 정보를 수집한다
  • 쿠키는 인터넷 쇼핑등 편의성을 제공하지만 사생활 침해로 이어질 수 있어 논쟁거리가 된다

2.2.5 - 웹 캐싱

웹 캐시(Web cache, 혹은 프록시 서버(proxy server))는 기점 웹 서버를 대신해 HTTP요구를 충족시키는 네트워크 개체

  • 자체의 저장소를 갖고 있어 요청된 객체의 사본을 저장 및 보존함
    • 브라우저 웹은 프록시서버와 TCP연결을 하고 요청을 보냄
    • 프록시 서버는 사본이 저장되어있으면 사본을 전달하고 없으면 기점 서버로 TCP연결을 설정해 데이터를 받아와 웹 브라우저로 전달(이 때 사본을 저장)
  • 일반적으로 프록시 서버는 ISP구입하고 설치함
    • 예를 들어 대학교가 ISP일 때 이 대학교는 프록시 서버를 설치해 캠퍼스의 브라우저가 이 프록시로 요청하도록 설정함
    • 가정에서는 로컬 ISP가 위 역할을 함
  • 프록시 서버는 클라이언트의 요구에 대한 응답 시간을 줄일 수 있다
  • 기점 서버의 트래픽을 낮출 수 있다
  • 전송률 늘리기 vs 프록시 서버 설치
    • 전송률을 늘리기 위해 선로 작업등의 막대한 비용이 들며 이렇게 한다고 해도 그 늘린 만큼의 이용자가 접속하게 되면 또 전송률이지연이 발생한다
    • 프록시 서버를 설치하면 실질적으로 링크에 남아있는 사용자는 없으므로 속도도 향상되고 더 효율적임

조건부 GET

  • 웹 캐싱이 속도는 빠를 수 있지만 이 데이터가 기점 서버에서 수정된다면 사본은 더 이상 신뢰가 가능한 데이터가 아님(일관성이 없음)
  • 그렇기에 프록시 서버가 기점 서버로 "이 데이터가 변경됐니?" 에 대한 조건을 담은 요청을 보내고 변경되었으면 새로운 객체를 아니라면 "변경되지 않았어"라는 응답값을 받고 사본을 클라이언트에게 건내줌

2.2.6 - HTTP/2

  • HTTP/2는 1997년에 표준화된 HTTP/1.1 이후 새로운 첫 번째 HTTP버전
  • 2020년 기준 주요 웹사이트의 40%가 HTTP/2를 지원
  • HTTP/2의 주요 목표는 TCP 연결상에서 멀티플렉싱 요청/응답 지연 시간을 줄이기
    • 요청 우선순위화, 서버 푸시, HTTP헤더 필드의 효율적인 압축 기능
    • HTTP메소드는 변경되지 않았으나 클라이언트와 서버 간의 데이터 포맷 방법과 전송 방법을 변경
  • 웹 페이지당 하나의 TCP연결을 가짐으로써 소켓 수를 줄여 전송되는 각 웹페이지는 공정한 대역폭을 가질 수 있었으나 블로킹 문제 발생
    • 10개 요청중 첫 요청의 응답값의 크기가 크다면 나머지 9개는 기다리는 현상
  • 3장에서 논의 예정

HTTP/2 프레이밍

  • 각 메시지를 작은 프레임으로 나누고 같은 TCP연결에서의 요청과 응답 메시지를 끼워 넣는다
  • 모든 프레임은 고정된 길이를 갖고 비디오 클립은 1000개의 프레임으로 구성되고 나머지는 2개의 프레임으로 구성된다고 가정(비디오 한 개 나머지 10개)
    • 비디오 2/1000 (2개 프레임) -> 1번 객체 (2개 프레임) -> 2번 객체 (2개 프레임)....->9번 객체 (2개 프레임)-> 비디오 4/1000 (2개 프레임) -> 비디오 6/1000 (2개 프레임).....비디오1000/1000 (2개 프레임)
    • 원래 같으면 비디오 1000개 프레임을 다기다려야만 다음 화면을 불러올 수 있는데 이렇게 프레이밍을 하면 사용자는 상대적으로 기다리는 시간이 줄어들게 느껴짐

메시지 우선순위화 및 서버 푸싱

  • 1~256사이의 가중치를 부여해 요청에 우선순위를 매김
  • 서버는 가장 높은 우선순위의 요청을 위한 프레임을 제일 먼저 보낼 수 있음

HTTP/3

  • 새로운 트랜프포트 프로토콜인 QUIC
    • UDP프로토콜 위에 위치하는 애플리케이션 계층에 구현되어 있으며 완전히 표준화된 상태는 아님
    • 3장에 서논의

[2.3] 인터넷 전자메일

  • 전자메일은 비동기적인 통신 매체(상대방이 대기중인것과 상관없이 메시지를 보냄)
  • 메일 시스템의 3개의 주요소
    • 사용자 에이전트(user agent)
      • 사용자가 메일을 읽고 응답하고 전달하고 저장하고 구성하게 해줌
      • 애플 메일, 웹용 지메일, 스마트폰용 지메일 등
    • 메일 서버(mail server)
      • 각 유저의 메일 박스를 갖고 있음
      • A가 B에게 메일을 보내면 B메일의 회사의 서버는 B의 메일박스에 그 메일을 저장
      • 만약 B메일 서버가 고장나면 A메일 회사의 서버는 30분마다 재전송을 하다가 성공하지 못하면 A에게 통보하는 등의 조치를 취함
    • SMTP(simple mail transger protocol)(2.3.1 내용 포함)
      • 전자메일을 위한 주요 애플리케이션 계층 프로토콜
      • 한 메일 회사의 서버는 메일을 보낼 때는 클라이언트로서, 메일을 받을 대는 서버로서 작동
      • ASCII로 주고 받기에 이미지, 영상같은걸 보낼때는 인코딩-디코딩 과정이 필요
      • 두 메일 서버가 멀리떨어져 있더라도 중간 서버를 사용하지 않음

2.3.2 - 메일 메시지 포멧

  • 모든 헤더는 From헤더라인과 To헤더 라인을 반드시 가져야 한다

2.3.3 - 메일 접속 프로토콜

  • 메일 회사의 서버간 통신은 SMTP를 사용하지만 사용자가 메일을 확인 할 때는 메일 회사의 서버로 HTTP요청을 통해 주고 받는다

[2.4] DNS : 인터넷의 디렉터리 서비스

  • 호스트의 식별자는 IP도 있지만 '호스트 이름'도 있다
    • 예시로 "안녕하세요 저는 000101-1011351 입니다" 하고 인사하는 것 보다 "안녕하세요 저는 김ㅇㅇ입니다"하고 인사를 하는게 서로가 편할 것이다

2.4.1 - DNS가 제공하는 서비스

  • 호스트 이름을 IP로 변환해주는 서비스
    • DNS서버들의 계층 구조로 구현된 분산 데이터 베이스
    • 호스트가 분산 데이터베이스로 질의하도록 허락하는 애플리케이션 계층 프로토콜
    • UDP상에서 수행되고 포트번호 53을 이용
  • 제공하는 서비스
    • 호스트 이름 IP주소로 변환
    • 호스트 에일리어싱(host aliasing)
      • 복잡한 호스트 이름을 가진 호스트는 하나 이상의 별명을 가질 수 있다(정식 호스트 이름 - 별칭으로 구분)
    • 메일 서버 에일리어싱(mail sever aliasing)
      • 전자메일 호스트를 기억하기 쉽게 제공
    • 부하 분산(load distribution)
      • 중복 웹 서버 같은 여러 중복 서버 사이에 부하를 분산하기 위해서도 사용

2.4.2 - DNS 동작 원리 개요

  • 클라이언트는 호스트 이름을 명시하여 DNS측의 클라이언트를 호출
  • 사용자 호스트의 DNS는 네트워크에 질의 메시지를 보냄
  • 해당 요청의 매핑에 해당하는 응답 메시지를 보냄
  • 하나의 서버로 하기에는 문제가 있음
    • 고장나면 인터넷 전체가 작동하지 않는다
    • 트래픽양이 많아지면 지연이 발생
    • 먼 거리의 중앙 집중 데이터베이스로 인해 거리가 멀 수록 지연이 발생
    • 데이터베이스가 거대해짐에 따라 유지관리가 어려워짐

분산 계층 데이터베이스

  • 루트 DNS 서버
    • 루트서버는13개의 다른 루트 서버 복사체이고 12개의 다른 기관에서 관리됨
    • 루트 서버는 TLD서버의 IP주소를 제공
  • 최상위 레벨 도메인(TLD)서버
    • com, org, net, edu, gov같은 상위 레벨 도메인과 kr, uk,fr,ca,jp같은 국가의 상위 레벨 도메인에 대한 TLD서버
    • TLD서버는 책임 DNS서버에 대한 IP를 제공
  • 책임 DNS 서버
    • 접근하기 쉬운 호스트를 가진 모든 기관은 호스트 이름을 IP주소로 매핑하는 공개적인 DNS레코드를 제공해야 한다
    • DNS서버에 이 레코드를 저장하도록 비용을 지불한다
    • 대부분의 대학과 큰 기업들은 기본 책임 DNS와 보조 책임 DNS서버를 운영한다
  • 로컬 DNS서버
    • DNS서버 계층에 엄격하게 포함되지는 않지만 중요함
    • 호스트 질의를 먼저 확인해 저장되어있어주면 전달함(프록시 방식으로 동작)
  • 작동 박싱
    • 클라이언트가 로컬 DNS서버에게 호스트 네임으로 질의함
    • 로컬 DNS 서버에 저장되어있으면 전달하고 없으면 루트 DNS에 물어봄
    • 해당 정보에 해당하는 TLD서버 정보를 줌(Type A + Type NS -> 아래 작성될 예정)
    • 로컬 DNS는 이 정보를 가지고 해당 TLD서버에게 또 물어봄
    • TLD서버는 해당 정보에 해당하는 책임 DNS서버 정보를 줌(Type A + Type NS)
    • 로컬 DNS는 이 정보를 가지고 책임 DNS서버에게 또 물어봄
    • 책임 DNS서버는 결과를 돌려줌(Type A)
    • 로컬 DNS 서버는 이 결과를 클라이언트에게 전달함

DNS 캐싱

  • 로컬 DNS는 성능 향상을 위해 캐싱을 사용
  • 호스트 DNS와 IP주소 매핑은 영구적인것이 아니기에 특정 기간(흔히 2일)을 설정해놓고 이 이내에 요청된 정보라면 그걸 클라이언트로 전달 -> TTL(time to live)

2.4.3 - DNS 레코드와 메시지

  • DNS서버들은 호스트 이름을 IP주소로 매핑하기 위해 자원 레코드(resource record, RR)을 저장함
  • 자원 레코드는 (Name, Value, Type, TTL)의 필드를 포함하며 Type은 아래와 같음
    • Type=A : Name은 호스트 이름이고 Value는 호스트 이름에 대한 IP주소
    • Type=NS : Name은 도메인 이고 Value는 도메인 내부의 호스트에 대한 IP주소
    • Type=CNAME : Name은 별칭 호스트 이름이고 Value는 정식 호스트 이름
    • Type=MX : Name은 별칭 호스트 이름이고 Value는 해당 메일 서버의 정식 이름

DNS메시지

  • 처음 12바이트는 헤더 영역
  • 질문 영역
    • 현재 질의에 대한 정보를 포함
      • 질의 되는 이름을 포함하는 이름 필드와 질문타입을 나타내는 타입 필드를 포함
  • DNS 서버로부터의 응답에서 답변 영역
  • 책임 영역 : 다른 책임 서버의 레코드를 포함
  • 추가 영역 : 다른 도움이 되는 레코드를 포함

즉, Type=A 자원 레코드와 Type=MX레코드 둘 다 DNS메시지에 포함 될 수 있음

 

DNS 데이터베이스에 레코드 삽입

  • 새로운 기업을 설립해 도메인을 만들었으면 도메인 네임을 등록기관에 등록해야함
  • 등록기관은 도메인 네임의 유일성을 확인하고 그 도메인 이름을 데이터베이스에 넣고 요금을 받음
  • 도메인 네임 등록시 주책임 서버와 부책임 서버의 이름과 IP주소를 등록기관에 제공해야함
  • 등록기관은 Type NS와 Type A레코드가 TLD서버에 등록되도록 확인해야함

[2.5] P2P파일 분배

  • P2P구조는 서버에 최소한으로 의존하는 대신 간헐적으로 연결되는 호스트 쌍들(피어)이 서로 직접 통신
  • 만약 서비스가 서버 <-> 클라이언트 방식에 의존한다면 클라이언트가 늘어나면 시간이 무한정으로 증가하고 어떤 클라이언트는 다운도 못하고 기다리고 있을 것이다
  • P2P방식에서는 파일을 여러개의 조각(청크chunk)로 나눈 뒤 공유한다
  • P2P방식은 아래와 같다
    • 최초에는 서버로부터 A클라이언트가 파일을 공유 받는다
    • A는 다운로드 스트림을 통해 청크를 공유받는대로 해당 청크를 업로드 스트림을 통해 B클라이언트에게 공유한다
    • B클라이언트는 다운로드 스트림을 통해 A클라이언트로 부터 청크를 받는 대로 B의 업로드 스트림을 통해 C에게 공유한다.
    • 위 과정을 다운로드를 시도하는 클라이언트에게 무한히 반복
  • 위 과정을 토대로라면 A가 서버로부터 다운로드가 끝났을 때 B로의 공유가 끝나기 전에 연결을 끊는다면 문제가 발생하는 데 '비트 토렌트'는 아래와 같이 해결
    •  각 피어들에게 '트래커'라고 부르는 노드를 갖고있게 한다
    • 이 노드를 통해 각 피어가 활성화 되어있음을 주변에게 알린다
    • 만약 A가 연결을 끊었을 때 트래커가 활성화 되어있는 사람을 찾아 남은 파일을 공유 받는다
      • 이 과정에서 '가장 드문 것 먼저' 찾고 해당 클라이언트에게 공유를 요청한다
      • 가장 드문 것 먼저 : 실제로 공유가 제일 잘 안돼서 먼저 받아두면 좋은 거

[2.6] 비디오 스트리밍과 콘텐츠 분배 네트워크

넷플릭스, 유튜브, 아마존 프라임등 스트리밍 비디오가 2020년 인터넷 트래픽의 80%를 차지했다

2.5.1 - 인터넷 비디오

  • 스트리밍 비디오 애플리케이션에는 미리 녹화된 비디오를 서버에 저장되어 사용자가 비디오 시청을 서버에게 온디맨드로 요청한다
  • 비디오 매체
    • 비디오는 이미지의 연속으로서 일반적으로 초당 24개 또는 30개의 이미지로 일정한 속도로 표시된다
    • 비디오 품질과 비트 전송률은 서로 반비례한다
  • 스트리밍 비디오에서 가장 중요한 성능 척도는 평균 종단 간 처리량이다
  • 연속적으로 재생을 제공하기 위해, 네트워크는 압축된 비디오의 전송률 이상의 스트리밍 애플리케이션에 대한 평균 처리량을 제공해야 한다
  • 300kbps, 1Mbps, 3Mpbs등의 속도로 동일한 비디오의 여러 버전을 만들어놔 사용자의 인터넷 환경에 맞게 보고싶은 버전을 결정할 수 있다
    • 3G환경에서는 300kbps버전 영상을, 와이파이 환경에서는 3Mpbs버전을

2.6.2 HTTP 스트리밍 및 DASH

  • 사용자가 비디오 시청을 원하면 클라이언트는 서버에게 TCP연결을 하고 해당 URL에 대한 GET요청을 보낸다
  • 클라이언트 쪽에서는 애플리케이션 버퍼에 전송된 바이트가 저장되고 이게 임곗값을 넘어가면 재생을 시작한다(버퍼링)
  • 정리
    • 서버는 동영상을 몇 초 단위의 청크로 저장함 
    • DASH방식은 네트워크 속도를 감지하고 그 속도에 맞는 품질의 URL로 해당 청크를 요청
    • 예)
      • 집에 오는길에 3G상태로 영상을 보면서 올 때 480p로 보면서 왔다
      • 집에 들어와 네트워크가 와이파이에 연결되자 화잘이 1080p로 바뀐다

2.6.3 콘텐츠 분배 네트워크(CDN)

  • 스트리밍 서비스 제공하는 가장 단순한 방법은 단일 거대한 데이터 센터 구축 후 운영
    • 클라이언트가 데이터 센터로부터 멀면 많은 링크를 거쳐 결국 속도가 느려짐
    • 인기있는 비디오는 요청이 많아 느려짐
    • 서버 문제 생기면 그냥 서비스가 중단됨
  • 콘텐츠 분배 네트워크(Content Distribution Network, CDN)
    • 다수의 지점에 분산된 서버들을 운영하며 복사본을 분산 서버에 저장
    • 철학
      • Enter Deep
        • Akamai에 의해 주장됨
        • 서버 클러스터를 세계 곳곳의 접속 네트워크에 구축함으로써 ISP의 접속 네트워크로 깊숙이 들어가는 것
        • 이 방식의 목적은 서버를 최대한 사용자 가까이에 위치시켜 사용자와 서버 사이의 링크 및 라우터 수를 줄이고 지연시간 개선
        • 비용이 커진다는 문제가 있음
      • Bring Home
        • Limelight와 다른 회사들에 의해 적용된 것
        • 좀 더 적은 수의 핵심 지점에 큰 ㅋ규모의 서버 클러스터를 구축하여 ISP를 Home으로 가져오는 것
        • 접속 ISP에 연결하는 대신, 이러한 CDN들은 일반적으로 그들의 클러스터를 인터넷 교환 지점에 배치
        • 유지 관리 비용이 줄어드는 대신 사용자의 지연시간은 상대적으로 나빠짐
    • 서버 클러스터는 모든 비디오를 저장 할 필요는 없고 인기있는 비디오나 특정 국가에서만 인기있는 비디오를 저장
    • 공간이 가득차면 자주 사용되지 않는 비디오는 제거

CDN 동작

  • 클라이언트가 비디오 재생 요청
  • CDN은 그요청을 가로채 그 시점에서 클라이언트에게 가장 적당한 CDN클러스터를 선택하고 해당 클러스터의 서버로 연결
  • 보통 링크가 가장 적은곳으로(가까운곳?)연결하나 서버 부하를 줄이기 위해 일부러 먼곳으로 배정하기도 함

2.6.3 사례연구 : 넷플릭스, 유튜브

넷플릭스

  • 아마존 클라우드와 자체 CDN 인프라 구축
    • 아마존 클라우드의 역할
      • 회원가입, 로그인, 결제, 검색, 추천 서비스등을 처리하는 웹사이트의 기능
      • 콘텐츠 수집 : 사용자에게 제공할 영화 드라마등을 수집
      • 콘텐츠 처리 : 위에서 수집된 영상을 플랫폼, 네트워크등 상황에 맞춰 여러 버전으로 생성
      • CDN으로의 버전 업로드
  • 넷플릭스는 풀캐싱 방식으로 CDN서버를 채우기에 사용량이 적은 시간에 비디오를 푸시함
  • 전체 영상을 보유할 수 없는 곳의 경우 매일매일 가장 많이 보는 비디오만 푸시

유튜브

  • 구글은 자체 비공개 CDN을 사용해유튜브 동영상을 배포하고 수백가지의 위치에 서버 클러스터를 설치함
  • 해당 위치에서 거대한 데이터 센터에서 직접 동영상을 배포
  • 유튜브는 DASH대신 사용자가 직접 영상 버전을 선택하도록함

[2.7] 소켓 프로그래밍 : 네트워크 애플리케이션 생성

  • 일반적인 네트워크 애플리케이션은 클라이언트와 서버 프로세스가 생성되고, 두 프로세스가 소켓으로부터 읽고 쓰기를 통해 서로 통신함
  • TCP는 연결지향형 서비스이고 신뢰적 바이트 스트림 채널 제공
  • UDP는 비연결형이고 다른 곳으로 데이터를 독립적인 패킷으로 만들어서 보내는데 전송에 대한 보장은 하지 않음
  • RFC에 정의된 프로토콜을 사용할 때는 잘 알려진 포트 번호를 사용해야하고 독점적으로 개발할 때는 잘 알려지지 않은 포트 번호를 사용해야한다

2.7.1  UDP를 이용한 소켓 프로그래밍

  • 연결 없은, 무엇을 어디로(ip, 포트번호) 보낼지만 정해서 보냄, 유실에 대한 고민 x
  • 서버는 클라이언트의 메시지를 수신하고 응답할 수 있도록 준비하고 수행되고 있어야 한다(즉, 프로세스가 실행되고 있어야 한다)

UDPClient.py

  • 첫 번째 라인은 'serverName'은 호스트이름을 할당
  • 두 번째 라인 'serverPort'는 소켓 포트 번호 할당
  • ClientSocket = socket(AF_INET, SOCK_DGRAM) 라인은 소켓을 생성하는 라인
    • AF_INET: 네트워크가 IPv4를 사용하고 있음을 나타냄
    • SOCK_DGRAM은 이 소켓은 UDP소켓임을 나타냄
  • 이 후 서버로 메시지를 보내고 통신하게 되며 통신이 끝나면 꼭 close()를 해줘야 함

UDPServer.py

  • 첫 번째 라인은 'serverName'은 호스트이름을 할당
  • 두 번째 라인 'serverPort'는 소켓 포트 번호 할당
  • ClientSocket = socket(AF_INET, SOCK_DGRAM) 라인은 소켓을 생성하는 라인
  • bind(('', serverPort(포트번호))
    • 포트 번호를 서버의 소켓에 할당함
  • 이 후 클라이언트로 부터 메시지를 받고 통신하게 되며 통신이 끝나면 꼭 close()를 해줘야함

2.7.2  TCP를 이용한 소켓 프로그래밍

  • 클라이언트와 서버가 데이터를 보내기 전에 TCP연결을 설정해야함
  • TCP연결 소켓을 통해 연결하면 새로운 소켓으로 데이터를 주고 받음
  • 서버가 TCP연결을 위한 포트를 열고 기다림
    • soket(AF_INET, SOCK_STREAM) : 소켓 정보를 통해 소켓 생성
    • bind() : 해당 포트 번호를 서버의 소켓에 할당
    • listen() : 서버 소켓을 리스닝 상태로 만들고 데이터 받을 준비
    • accept() : 대기 중인 요청을 수락
    • 그 뒤로 통신 주고받고 마무리 할 때 close()
  • 클라이언트는 서버의 TCP연결 요청을 먼저함
    • soket(AF_INET, SOCK_STREAM) : 서버의 특정 포트에 연결되는 소켓 생성
    • connect() : 서버간 연결 시작
    • 그 뒤로 통신 주고받고 마무리 할 때 close()