Skip to main content

4 posts tagged with "book"

View All Tags

· 8 min read

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

클라이언트/서버 구조

  • 웹 애플리케이션과 같이, 항상 켜져있는 서버 호스트가 다른 많은 클라이언트 호스트의 요청을 처리하는 구조
  • 클라이언트는 직접 통신하지 않음
  • 서버가 고정 IP주소라는 잘 알려진 주소를 가짐
  • 하나의 서버 호스트가 클라이언트의 모든 요청을 처리하기 어려울 경우, 데이터 센터 등으로 가상 서버를 생성

P2P 구조

  • 항상 켜져있는 기반 서버에 최소 의존 또는 전혀 의존하지 않음
  • 간헐적으로 연결된 호스트 쌍이 서로 직접 통신
  • 클라이언트-서버 구조와 P2P 요소를 결합한 하이브리드 구조도 존재
  • 자가 확장성을 가지며, 비용 효율적

프로세스 간 통신

  • 서로 다른 2개의 종단 시스템에서 각각의 프로세스는 메시지 교환을 통해 통신

프로세스 - 네트워크 인터페이스

  • 프로세스는 소켓(socket, 호스트의 애플리케이션 레이어와 트랜스포트 레이어 간 인터페이스)을 통해 네트워크로 메시지를 주고받음
  • 애플리케이션 개발자는 트랜스포트 계층에는 트랜스포트 프로토콜의 선택과 약간의 매개변수만 통제가 가능

TCP와 UDP

TCP

  • 연결 지향형 서비스: 클라이언트와 서버는 전송 제어 정보를 교환하는 핸드셰이크 단계를 거친 후에 연결이 생성되어 양방향 메시지 전달이 가능해지고, 메시지 전송이 끝나면 연결을 끊는다.
  • 신뢰적 데이터 전송 서비스
  • SSL: 암호화를 제공하지 않는 TCP에 보안성을 갖추기 위해 애플리케이션 레이어에 구현된 암호화 프로토콜
  • 혼잡 제어 방식: 인터넷의 전체 성능 향상을 위해 각 연결의 대역폭 조정 및 제한

UDP

  • 최소 서비스 모델: 비연결형, 비신뢰적 데이터 전송 서비스
  • 혼잡 제어 방식 미포함

HTTP

  • HTTP는 클라이언트 프로그램(웹 브라우저)과 서버 프로그램(웹 서버)으로 구현된다.
  • 웹 페이지를 구성하는 각 객체의 URL은 1)해당 객체가 존재하는 서버의 호스트 네임과 2)객체의 경로 이름을 가진다.
  • HTTP는 TCP를 기반으로 하며, 브라우저와 서버의 프로세스는 소켓 인터페이스를 통해 TCP 통신을 진행한다.
  • HTTP는 상태가 없다(stateless).

HTTP 메시지 포맷

HTTP req 메시지

  • request 라인: HTTP req 메시지의 첫 번째 줄이다.
    • 메서드 필드(GET, POST, HEAD, PUT, DELETE, etc.)
      • GET: URL에 해당하는 객체를 요청한다.
      • POST: 사용자가 입력한 form 정보를 전달을 포함한 객체를 요청한다.
      • HEAD: GET과 유사하나, 객체는 보내지 않고 HTTP 메시지 res만 요청한다.
      • PUT: 웹 서버에 업로드할 객체가 필요한 애플리케이션이 사용한다.
      • DELETE: 웹 서버에 있는 객체의 삭제를 요청한다.
    • URL 필드
    • HTTP 버전 필드
  • header 라인: HTTP req 메시지의 나머지 줄이다.
    • Host: 객체가 존재하는 호스트 네임이며, 웹 프록시 캐시가 요구하는 정보이다.
    • Connection: 지속 연결을 사용할지 여부
    • User-agent: 브라우저 타입
    • Accept-language: 선호 언어
  • entity body: GET에서는 empty 상태이며, POST에서는 사용자가 입력한 form 정보를 포함한다.

HTTP res 메시지

  • 초기 상태 라인
    • HTTP 버전 필드
    • 상태 코드 및 메시지
      • 200 OK
      • 301 Moved Permanently
      • 400 Bad Request
      • 404 Not Found
      • 505 HTTP Version Not Supported
  • header 라인:
    • Connection: 클라이언트에게 메시지를 보낸 후 연결을 지속할지 여부
    • Date: 서버가 HTTP res를 생성하고 보낸 시간
    • Server: 웹 서버 타입(req의 User-agent와 유사)
    • Last-Modified: 객체 생성 또는 최근 수정 시간이며, 캐싱 기능에 중요하게 사용된다.
    • Content-Length: 객체 크기
    • Conent-Type: 객체 타입
  • entity body

쿠키

  • HTTP는 stateless하므로, 서버가 사용자를 추적하기 위해 쿠키(cookie)를 사용한다.
  • 쿠키는 아래와 같은 4개 요소로 작동한다.
    • HTTP res 메시지 쿠키 헤더 라인: 서버는 사용자 식별을 위한 ID를 생성하고 Set-cookie: 헤더에 이를 포함한다.
    • 브라우저 쿠키 파일: 브라우저는 이를 자신이 관리하는 쿠키 파일에 저장한다.
    • HTTP req 메시지 쿠키 헤더 라인: 브라우저는 쿠키 파일에 현재 사이트에서 발급받은 쿠키가 있을 경우 이를 Cookie: 헤더로 포함하여 req 메시지를 전달한다.
    • 서버(사이트) 백엔드 데이터베이스: 쿠키로 식별한 각 사용자의 활동 정보가 저장된다.

웹 캐싱

  • 웹 캐시는 프록시 서버라고도 불리며, origin을 대신하여 HTTP req를 처리해줄 수 있는 네트워크 개체이다.
  • 이를 위해 자체 저장 디스크를 갖추고 최근 호출된 객체의 사본을 저장한다.
  • 브라우저 설정을 통해 모든 HTTP 요청을 웹 캐시를 거치도록 구성할 수 있다.

· 5 min read

구성요소로 본 인터넷

  • 인터넷은 여러 개의 컴퓨팅 장치(종단 시스템)를 연결하는 컴퓨터 네트워크
  • 종단 시스템은 통신 링크(물리 매체)와 패킷 스위치의 네트워크로 연결
  • packet = segment(데이터의 조각) + header
  • 가장 널리 사용되는 패킷 스위치는 라우터와 링크-레이어 스위치로, 최종 목적지 방향으로 패킷을 전달하는 역할을 수행하며, 링크-레이어 스위치는 주로 액세스 네트워크에서, 라우터는 네트워크 코어에서 사용

서비스 측면에서 본 인터넷

  • 인터넷에 접속된 종단 시스템(출발지)은 인터넷 인프라 구조에게 다른 종단 시스템(목적지)에서 수행되는 프로그램에 데이터를 어떻게 전달하도록 요구하는지 명시하는 API(Application Programing Interface)를 제공
  • API는 송신 프로그램이 따라야 하는 규칙의 집합이며, 인터넷은 이 규칙에 따라 데이터를 목적지로 전달

액세스 네트워크, 네트워크 코어

  • 액세스 네트워크: 종단 시스템 간 경로 중 출발지와 첫 번째 라우터를 연결하는 네트워크
  • 네트워크 코어: 패킷 스위치와 링크의 메시(mesh)
  • 링크, 스위치의 네트워크를 통한 데이터의 전송에는 회선 교환과 패킷 교환 방식이 존재

인터넷 프로토콜 스택

  • 네트워크 프로토콜은 레이어 구조를 가지며, 각 프로토콜은 한 레이어에 속하며, 상위 레이어는 하위 레이어의 서비스를 이용할 수 있다.
  • 인터넷 프로토콜 스택은 Application, Transport, Network, Link, Physical 5개 레이어로 구성된다.

Application Layer

  • 인터넷에서 사용하는 애플리케이션 계층 프로토콜은 대표적으로 HTTP, SMTP, FTP등이 있다.
  • 애플리케이션 레이어에서의 정보 패킷을 메시지(message)라 부른다.

Transport Layer

  • 애플리케이션 레이어로부터 전달받은 메시지를 전송하는 서비스를 제공한다.
  • 인터넷에서는 TCP, UDP 2가지의 트랜스포트 프로토콜이 사용된다.
  • 트랜스포트 레이어에서의 정보 패킷을 세그먼트(segment)라 부른다.

Network Layer

  • 출발지 호스트의 트랜스포트 레이어로부터 전달받은 세그먼트를 목적지 호스트의 트랜스포트 레이어로 전송하는 서비스를 제공한다.
  • 네트워크 레이어에서의 정보 패킷을 데이터그램(datagram)이라 부른다.
  • IP는 데이터그램의 필드 및 네트워크 요소(종단 시스템 및 라우터)가 각 필드에 어떻게 동작하는지 정의하는, 유일한 프로토콜이다.
  • 라우팅 프로토콜 역시 네트워크 레이어에 속하며, 인터넷은 다양한 라우팅 프로토콜을 가지고 있다.
  • 한 노드(호스트 또는 패킷 스위치)에서 다른 노드로 패킷을 전달하는 서비스를 제공한다.
  • 이더넷, 와이파이, DOCSIS(Data Over Cable Service Interface Specification) 등이 있다.
  • 링크 레이어에서의 정보 패킷을 프레임(frame)이라 부른다.

Physical Layer

  • 한 노드에서 다른 노드로 프레임 내부의 각 비트를 전달하는 기능을 담당한다.

캡슐화(Encapsulation)

  • 패킷은 각 레이어를 거치면서, 상위 계층에서 받은 정보에 헤더를 추가하면서 데이터를 캡슐화한다.

네트워크 공격

  • 호스트에서 악성코드 실행
  • 네트워크 인프라 공격(DoS)
  • 패킷 탐지(Sniffing)
  • 패킷 위장(Spoofing)

· 8 min read

프로시저, 서브루틴, 함수

  • 함수를 호출, 실행하고 다시 원래 자리로 돌아오기 위해서는 어디서 함수를 호출하였는지를 기억해야 하는데, 이는 바로 프로그램 카운터의 값이다.
  • 반환 주소를 저장하고, 이를 간접 호출하여 분기해서 돌아오는 과정은 많은 작업이 필요하므로 대부분의 기계는 이를 구현한 명령어를 제공한다.

스택

  • 반환 위치 저장할 메모리 주소가 하나뿐이라면 반환 위치가 덮어씌워지기 때문에 재귀 함수를 사용할 수 없다.
  • 따라서, 함수를 호출할 때에는 반환 위치를 LIFO로 가져오기 위해 스택을 사용하며, 스택의 크기를 초과하는 것을 스택 오버플로, 빈 스택에서 데이터를 가져오려고 하는 경우를 스택 언더플로라 한다.
  • 함수가 호출될 때마다 반환 주소 이외에도 각각의 독립된 로컬 변수를 사용하기 때문에, 로컬 변수 역시 스택에 저장하면 각각의 함수 호출을 독립적으로 구성할 수 있다. 이렇게 매 함수 호출 시 스택에 저장되는 데이터의 모음을 스택 프레임이라 한다.

인터럽트

  • 폴링(Polling)은 자원을 많이 소비할 수 있으므로, 인터럽트 시스템이 필요하다.
  • 인터럽트 요청이 발생하면, 처리중인 명령어까지는 마무리한 후 프로그램을 중단하고 인터럽트 핸들러라는 프로그램(함수)을 실행하고, 다시 원래 프로그램이 중단된 위치부터 실행을 계속한다.
  • 이를 위해 인터럽트에 대응하고 실행 중이던 프로그램으로 돌아가기까지 걸리는 시간을 제한해야 하며, 스택에 인터럽트 발생 이전의 상태를 저장하였다가 복구해줘야 한다.
  • 인터럽트 벡터: 컴퓨터는 각 인터럽트에 대응하는 인터럽트 핸들러 주소를 지정하는 포인터를 가지고 있는데, 이를 인터럽트 벡터라 한다.

상대 주소 지정

  • 여러 프로그램을 동시에 사용할 때, 타이머를 통해 각 프로그램이 실행되는 시간을 제한하여 스위칭하는 스케줄링 방식을 시분할이라 한다.
  • 이를 위해 각 프로그램에 다른 공간을 허용하는데, 이 때 한 프로그램이 다른 프로그램이 사용하는 메모리에 접근하면 여러 가지 문제가 발생할 수 있다.
  • 이를 방지하기 위해 메모리 주소를 절대적으로 지정하는 것은 바람직하지 않으며, 상대 주소 지정을 통해 프로그램이 접근할 수 있는 메모리 주소를 재배치한다.

메모리 관리 장치

  • 한 프로그램이 의도치 않게, 또는 의도적으로 허용되지 않은 메모리에 접근하는 것은 바람직하지 않으므로 이를 위해 메모리 관리 장치(Memory Management Unit)이 사용된다.
  • 프로그램은 가상 주소를 사용하여 작성되고, MMU는 이를 물리적 주소로 변환하는 역할을 한다.
  • MMU는 페이징 기법을 활용하여 실제 가능한 물리주소 범위보다 넓은 범위의 가상 주소를 사용할 수 있게 해준다.

가상 메모리

  • MMU의 페이징 기법으로 확장된 메모리 가용 영역보다 더 큰 영역이 필요할 경우, OS는 현재 필요하지 않은 페이지를 느리지만 용량이 큰 디스크로 옮겨버리고(swap out), 추후 다시 접근이 필요할 때 다시 메모리에 불러들인다(swap in).
  • 이는 성능을 크게 저하시키지만, 메모리가 부족해서 실행할 수 없는 프로그램을 실행할 수 있게 해준다.

메모리 계층과 성능

  • CPU에 비해 메모리가 느리기 때문에, 메모리 계층이라는 개념을 적용, CPU에 캐시라는 하드웨어를 추가하여 CPU가 필요로 할 가능성이 높은 데이터를 미리 읽어옴으로써 성능 향상을 기대할 수 있다.

메모리상의 데이터 배치

  • 실행 전에는 크기를 알 수 없는 데이터, 즉 동적 데이터를 다루기 위해 힙(heap)이라는 영역을 사용한다.

프로그램 실행

  • 링커는 재사용 등을 위해 조각난 프로그램을 하나로 연결하여 실행 가능한 프로그램을 만들어주는 프로그램이다.
  • 라이브러리를 프로그램에 직접 가져다 붙이는 방식을 정적 링크라 하고, 공유 라이브러리를 사용하여 여러 프로그램이 같은 라이브러리를 사용할 수 있도록 하는 방식을 동적 링크라 한다.
  • 공유 라이브러리의 명령어는 해당 라이브러리를 사용하는 모든 프로그램에서 공통이므로, 라이브러리 함수를 작성할 때는 호출하는 프로그램의 스택과 힙을 사용하도록 함수를 설계한다.
  • 프로그램이 합쳐져 실행파일이 되면, 런타임 라이브러리가 추가되어 프로그램 실행시 가장 먼저 실행되고 이후 진입점의 명령어가 수행되면서 프로그램이 실행된다.
  • 런타임 라이브러리는 프로그램이 사용할 메모리 설정을 수행하면서 스택과 힙 영역을 설정하고 데이터의 초깃값도 설정하는 역할을 한다.

· 3 min read

CPU

  • Arithmatic Logic Unit: 연산자와 피연산자를 입력받아 결과값과 결과 코드를 리턴
  • Shifter: 조합 논리(Combinational Logic)만으로는 구현할 수 없는 Shift 연산을 수행
  • Excecution Unit
    • 메모리에서 명령과 피연산자를 가져와서 ALU에 전달하고 리턴값을 메모리에 저장
    • 메모리에서 실행해야하는 명령의 위치를 기억하기 위해 메모리 위치를 참조하는 PC(Program Counter)를 사용

명령어 집합

  • 명령어(instruction)를 네 필드(opcode, 두 개의 operand, result)로 나누어 표시한다면 아래 2가지 문제점으로 인하여 명령어를 처리하기 어렵다.
    1. operand와 result 필드에 들어가는 주소 값으로 쓸 수 있는 비트가 부족
    2. 한 번에 여러 메모리 주소에 접근해야 함
  • 따라서 opcode와 주소로만 구성된 single-address 명령어를 사용하며, 이를 위해 누산기(accumulator)라는 레지스터를 사용한다.
  • 그럼에도 모든 메모리 주소 영역을 명령어에 담을 수 없으므로 3종류의 주소 지정 모드(즉시, 직접, 간접)를 통해 참조할 수 있는 주소의 영역을 확장한다.
  • 따라서 명령어의 구성은 아래 이미지와 같이 나타낼 수 있다.

메모리 + 입/출력 + CPU + 명령어

  • 컴퓨터는 메모리에서 명령어를 가져오는 상태(fetch)와 명령을 실행하는 상태(execute)를 반복
  • 즉, 컴퓨터의 처리 방식은 프로그램 카운터 값을 메모리의 주소 버스에 먹이고, 메모리의 값(수행해야 하는 명령어)을 다시 명령어 레지스터에 먹여 명령어를 저장하는 절차의 반복