(UMC) 1. 서버란 무엇인가?

jimmy·2024년 4월 4일
0

UMC 6기

목록 보기
1/11

UMC 1주차 스터디가 시작되었다. 앞으로 워크북 내용을 정리해 나갈 예정이다.
1주차의 주제는 가장 기본적인 서버란 무엇인지에 대한 내용을 다루었다.

서버란 무엇인가?

  • 클라이언트에 대한 응답을 주는 것
  • OS에 의해 동작하는 프로세스이며 클라이언트의 역할을 하는 프로세스와 소켓을 통해 IPC를 수행하는 것

    ❓IPC란?
    하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신
    ❓소켓이란?
    네트워크를 경유하는 프로세스 간 통신의 종착점

IP주소와 포트번호

IP주소

컴퓨터가 네트워크 상에서 통신을 하기 위해서는 자신이 누구인지 유일하게 식별이 가능한 수단이 있어야 한다. 이 수단이 IP 주소이고 따라서 IP 주소는 절대로 겹치면 안되고, 고유해야 한다.

But, 컴퓨터가 많아지면서 IP 부족 현상이 발생하게 되었다.
이를 해결하기 위한 여러 기술들이 존재한다. ex) NAT, 서브네팅, IPv6 등

💡 프로세스 간 통신을 위해 IPC를 하되, 다른 시스템의 프로세스와 IPC를 한다.

포트번호

데이터를 보내는 송신쪽 컴퓨터에서 어떤 프로세스에게 데이터를 보내야 하는지 식별할때 사용하는 값
클라이언트 -> 서버로 데이터를 보낼 때 [서버 ip주소]:[서버 프로세스가 부여 받은 포트번호] 형태로 데이터를 보낼 대상을 식별한다.

소켓(TCP 소켓)

시스템 콜?

위의 socket(), bind() 등의 함수는 시스템 콜을 의미한다.
시스템 콜이란, 사용자 프로그램이 특권 명령의 수행을 필요로 하는 경우, 운영체제에게 특권 명령의 대행을 요청하는 것을 말한다.

❓특권 명령이란?
CPU가 Kernel 모드일 때에만 CPU에서 실행될 수 있는 기계어 명령

  • 시스템 콜이 필요한 이유
    • 유저레벨의 프로그램은 많은 기능을 구현하기 힘들기 때문에 kernel의 도움을 반드시 받아야 함. (kernel에 관련된 것은 kernel모드로 전환된 후에야, 해당 작업을 수행할 권한이 생김)

      권한이 필요한 이유 : 하드웨어 명령어를 잘 몰라서 아무렇게 함수를 호출했을 때 시스템 전체를 망가뜨릴 가능성이 있음

  • 시스템 콜 유형 : 프로세스 컨트롤, 파일 매니지먼트, 디바이스 매니지먼트, 정보 관리, 통신, 보안

socket() 시스템 콜

  • 소켓을 생성할 때 사용하는 함수이며, 성공적으로 실행되어 소켓이 만들어지면 해당 소켓의 디스크립터를 반환한다.
  • socket(주소영역 지정, 서비스 타입, 프로토콜 지정)

    domain(주소영역 지정) : IPv4, IPv6중 무엇을 사용할지 결정
    type(서비스 타입) : stream, datagram 소켓 중 선택
    protocol(프로토콜 지정) : 0, 6, 17 중 0을 넣으면 시스템이 프로토콜을 선택하며, 6이면 tcp, 17이면 udp

bind() 시스템 콜

  • socket() 함수로 생성된 소켓에 주소를 부여한다.
  • bind(소켓 파일 디스크립터, 바인드될 소켓의 주소, 주소크기)

소켓 파일 디스크립터 : 바인딩을 할 소켓의 파일 디스크립터
바인드될 소켓의 주소 : 소켓에 바인딩 할 아이피 주소, 포트번호를 담은 구조체
주소크기 : 위 구조체의 메모리 크기

❗첫번째 파라미터에 소켓의 파일 디스크립터를 넣는 이유는 OS에게 어떤 소켓에 아이피 주소와 포트번호를 부여할지 알려주기 위함이다.

listen() 시스템 콜

  • 파라미터로 받은 backlog 크기만큼 backlog queue를 만드는 시스템 콜
  • listen(소켓 파일 디스크립터, 백로그)

소켓 파일 디스크립터 : 바인딩을 할 소켓의 파일 디스크립터
백로그 : 연결요청을 받아줄 크기 = TCP의 백로그 큐의 크기

accept() 시스템 콜

  • 임의의 클라이언트의 연결 요구가 들어올때까지 대기하며, 연결 요청이 들어오면 둘 사이의 연결이 설정되고 서버에 새로운 소켓이 생성된다. 이후 송수신은 새로 생성된 소켓을 이용하여 이루어지게 된다.
  • accept(소켓 파일 디스크립터, 주소, 주소의 길이)

    소켓 파일 디스크립터 : 백로그 큐의 요청을 받아들이기 위한 소켓의 파일 디스크립터
    주소 : 선입선출로 빼온 연결 요청에서 알아낸 클라이언트의 주소 정보
    주소의 길이 : 위 구조체의 메모리 크기

    accept()가 새로운 소켓을 만드는 이유

    accpet() 시스템 콜의 리턴값은 새로운 소켓의 파일 디스크립터이다. 왜 새로운 소켓을 만드는것일까?
    -> 병목 현상을 해결하기위해 서버는 연결 요청을 받는 부분, 응답을 주는 부분을 분리하기 때문이다. 따라서 응답을 위한 새로운 소켓을 만든 것이다.

병렬 처리

  • 다수의 클라이언트 요청을 효율적으로 처리하기 위한 기술로 높은 처리량과 빠른 응답 시간을 제공한다.

  • 서버가 다수의 클라이언트로부터 동시에 많은 요청을 받는 경우, 서버가 단일 프로세스로 운영된다면 엄청난 병목 현상을 야기할 것이다. 따라서, 효율적인 요청 처리를 위해 병렬 처리 방식(멀티 쓰레드, 멀티 프로세스)을 사용한다.

    멀티 프로세스

    운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술을 말한다.

    • fork() 함수를 이용한 멀티 프로세스 구현

      • fork() 함수는 현재 실행 중인 프로세스의 복사본을 생성한다.

      • 부모 프로세스는 원본 프로세스, 즉 fork()를 호출한 주체를 뜻한다.
        자식 프로세스는 부모 프로세스의 fork()를 통해 복사된 프로세스를 말한다.

      • 부모 프로세스에서의 fork() 반환 값 : 자식프로세스 ID
        자식 프로세스에서의 fork() 반환 값 : 0

      • 실행이 종료된 자식 프로세스는 좀비 상태로 남게되고, 부모는 이 좀비 프로세스를 수거해주어야 함

        좀비상태 : 프로세스가 종료 되었지만 메모리 공간에서 완전히 소멸하진 않은 상태

❗정리❗
accept()에서 새로운 소켓을 반환하는 것은 데이터 통신을 위한 구조적 분리를, fork()를 사용하는 것은 동시에 여러 클라이언트의 요청을 처리할 수 있는 병렬 처리 능력을 갖추기 위함

3-way handshake

클라이언트와 서버간에 서로 신뢰성있는 통신을 위해 서로 준비가 되었음을 확인하는 과정이다.

client -> server로 보내지는 SYN은 listen 상태인 서버의 소켓에 연결 요청을 보내는 것이다.
이후 두개의 과정은 accept() 시스템 콜 이후 진행하여 최종적으로 Established 상태를 수립하고 본격적인 데이터의 송/수신이 이루어지게 된다.

핵심 키워드

TCP

  • TCP/IP의 전송계층에서 사용되는 프로토콜로 연결형 프로토콜이므로 신뢰성이 요구되는 애플리케이션에서 주로 사용한다.
  • TCP 특징
    • 연결형 서비스 - 3-way handshaking(연결 설정), 4-way handshaking(연결 해제)
    • 흐름제어 : 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우 방지
    • 혼잡제어 : 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지
    • 신뢰성이 높은 전송
      • Dupack-based retransmission : ACK값이 중복으로 올 경우 재전송 요청
      • Timeout-based retransmission : 일정시간동안 ACK 값을 수신을 못할 경우 재전송 요청
    • 전이중, 점대점 방식
    • 멀티캐스트, 브로드캐스트를 지원하지 않는다.

UDP

  • TCP/IP의 전송계층에서 사용되는 프로토콜로 비연결형 프로토콜이므로 간단한 데이터를 빠른 속도로 전송하고자 하는 애플리케이션에서 사용한다. ex) 실시간 스트리밍
  • UDP 헤더 포맷은 TCP에 비해 매우 심플한게 특징이다.
  • 데이터 수신 여부를 확인하지 않는다.
  • TCP보다 속도가 빠르다.
  • 멀티캐스트, 브로드캐스트를 지원한다.

하드웨어 인터럽트

  • 컴퓨터의 외부 하드웨어 기기인 키보드나 마우스, 네트워크 카드에 의한 인터럽트를 가리킨다. ex) 키보드를 누를 때 마다 키보드 컨트롤러가 CPU에게 인터럽트를 발생

    ❓인터럽트란?
    시스템의 내부 또는 외부에서 발생하는 예기치 못한 사건에 의해, CPU가 실행 중인 프로그램의 작업을 중단시키고 다른 프로그램을 수행하도록 하는 명령어를 말한다.
    (예기치 못한 사건이란 입출력이나 에러의 발생, 타이머의 시간 만료 등을 의미함)

리눅스의 파일과 파일 디스크립터

  • 리눅스 혹은 유닉스 시스템에서는 일반적인 파일부터 디렉토리, 소켓, 파이프, 블록 디바이스 등 모든 객체들을 파일로 관리하는데, 프로세스가 이 파일들을 접근할 때 파일 디스크립터를 이용한다.
  • 파일 디스크립터는 리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 것으로, 운영체제가 특정 파일에 할당해주는 정수값이다.
profile
백문이 불여일기

0개의 댓글