언리얼 엔진을 활용한 멀티 플레이를 구현하기 위해 학습 하던 중, 리슨서버 및 데디케이티드 서버에 대해 학습하였습니다.

해당 과정에서 언리얼 엔진에서 제공하는 리슨서버 및 데디케이티드 서버의 특징, 차이점들을 작성하며

그 외 P2P 서버 및 클라우드 서버 등에서도 간략하게 알아보겠습니다.

 

 

멀티플레이 (MultiPlay)

  • 여러 플레이어가 네트워크를 통해 같은 게임 월드에서 상호작용 할 수 있도록 구현하는 시스템
  • 서버 - 클라이언트 구조로 이루어져있다.
  • 언리얼 엔진 내 리플리케이션, 세션을 활용하여 동작한다.
    • 서버 (Server) : 게임 상태 관리
      • 여러 클라이언트와 상호작용
      • 클라이언트에서 해킹당하면 안되는 데이터에 대한 처리
      • 플레이어의 상태 관리
    • 클라이언트 (Client) : 서버에서 관리하는 데이터를 가져와 게임을 플레이하는 방식
    • 리플리케이션(Replication) : 서버의 정보를 클라이언트에 동기화하는 기능
    • 세션 (Session) : 멀티플레이 게임에서 클라이언트들이 연결되는 로비 개념

 

리슨서버 (Listen Server)

  • 한 플레이어가 직접 서버 역할을 하며 동시에 클라이언트를 수행하는 방식
    • Player1 = Server + Client
    • Player2,3,4... = Client
  • 멀티플레이 관련 설정이 다른 서버 연결방식보다 쉽다.
  • 별도의 서버 운영이 필요 없으며, 서버 운영 비용이 발생하지 않는다.
  • 서버 호스트가 게임을 종료하면, 모든 플레이어가 해당 세션에서 종료된다.
  • 서버 호스트 PC성능에 비례하여 네트워크 성능이 저하 될 수 있다.
  • 보안에 취약하다.
    • 리슨서버는 게임 데이터를 노출시키는 형식. 데이터를 쉽게 조작 할 수 있다.
    • 클라이언트가 서버를 운영하는 방식이기 때문에 데이터를 조작하더라도 감지가 어렵다.
    • UFUNCTION(WithValidation)을 사용한 보안 강화 가능.
    • 클라우드 서버 환경에서는 토큰과 같은 보안방식을 사용하여 보안을 강화시킬 수 있다.

데디케이티드서버 (Dedicated Server)

  • 게임을 플레이하지 않는 독립적인 서버 존재, 클라이언트가 해당 서버에 접속하는 방식
  • 서버는 게임 상태 및 데이터를 관리, 클라이언트는 서버의 데이터를 받아온다.
  • 고정된 네트워크 환경에서 실행되므로 안정성이 뛰어나다.
  • 리슨서버와 다르게 호스트가 종료를 해도 게임이 중단되지 않는다.
  • 독립적인 서버를 통한 게임 데이터를 캡슐화 할 수 있다.
  • 별도 서버 운영 비용이 발생하며, 서버 유지 보수가 필요하다.
  • 고정된 서버 개수로 인해 접속자가 급등하거나 급락할 경우 서버 운영에 문제가 발생한다.

클라우드 서버 (Cloud Server)

AWS GameLift - https://aws.amazon.com/ko/blogs/korea/introducing-amazon-gamelift-anywhere-run-your-game-servers-on-your-own-infrastructure/

  • 네트워크를 통해 접근할 수 있는 가상 서버
  • 현재 게임 회사들이 가장 많이 사용하는 형태
  • 필요할 때만 서버를 생성하는 OnDemand Server 방식을 통해 서버 운영 비용을 절감할 수 있다.
  • AWS, SnowFlake, Azure 등의 클라우드 서비스를 통해 운영
  • 클라이언트 접속자가 급등하더라도 Auto Scaling기능을 통한 안전한 서버 운영 가능
  • 지역별 서버를 배포하므로 글로벌 서버의 경우에도 용이하다.
  • 클라우드 서비스 내 보안 시스템을 사용한 보안 기능을 강화시킬 수 있다.
    • AWS 모니터링, AWS AccessKey 등
  • 서버에 문제가 발생시 별도의 독립된 서버를 통해 모니터링, 프로파일링을 통해 빠른 복구가 가능하다.

 

게임 서버 품질을 보장하는 4가지

1. 안정성 (Stability)

  • 게임 서버가 얼마나 다운되지 않는가. (인듀어 테스트를 통한 검증)
  • 게임 서버가 얼마나 오작동을 하지 않는가.

2. 확장성 (Scalability)

  • 서버를 얼마나 많이 설치할 수 있는지
  • 사용자 수가 늘어나더라도 서비스 품질이 떨어지지 않고 유지되는지
    • 수직적 확장 방법 (Scale Up) : CPU,RAM 같은 서버 머신 부품 업그레이드
    • 수평적 확장 방법 (Scale Out) : 서버 머신의 개수 증설
    • 해당 방법은 데디케이티드 서버일 경우에 대한 방법. 클라우드 서비스에서는 Auto Scaling을 통한 자동 증설기능

3. 성능 (Performance)

  • 얼마나 빠르게 처리되는지
  • 게임 장르에 따른레이턴시(Latency) 고려
  • 코드 및 알고리즘 최적화
  • 서버 과부화 영역 분산
    • Code Profiling을 통한 함수처리 시간 확인, 개선
  • 네트워크 프로토콜 최적화
    • 메시지 양 줄이기 (ZLib, 양자화 등)

4. 관리 편의성

  • 백그라운드 프로세스에서도 프로그램이 실행되는지
    • 윈도우 : 서비스 / 리눅스 : 데몬

 

안정성을 고려한 서버 개발 방법

  • 치밀한 개발 및 단위테스트
    • 모든 함수 호출의 반환값을 반드시 체크하는 루틴
    • 자동화가 구현되어있는 자가 검증 (단위테스트, Unit Test)
  • 80 : 20법칙 유지
    • 성능의 80%는 20%의 소스 코드에서 나타난다는 파레토 법칙
    • 구조가 복잡해지더라도 성능 최적화 및 유지보수하기 쉬운 단순한 구조 방식 개발
  • 1인 이상의 코드리뷰
    • 코드리뷰를 통한 지식 공유, 버그 발견
  • 가정하지 말고 검증하기
    • 봇 테스트, 더미 클라이언트 테스트, 스트레스 테스트를 통한 검증
      • 입력 처리, 렌더링 과정이 생략된 프로그래밍된 행동을 반복하는 더미를 서버에 접속
      • 서버 성능 프로파일링을 통해 지표 확인
  • 불안정시 극복 과정
    • 서버가 다운되더라도 최대한 빠르게 복구
      • 서버 프로세스 중단시, 자동으로 복구되는 프로그램 설계
      • AWS 내 모니터링 시스템을 통한 자동 복구 프로그램 설계 가능
    • 서버가 다운되더라도 최대한 적은 서비스만 다운되게 설계
      • 서버 프로세스 분리를 통한 서버 장애 발생시에도 일부 서비스는 작동할 수 있는 설계
    • 서버 오작동에 대한 로깅하기

출처 및 참고내역

 

게임 서버 프로그래밍 교과서

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/networking-and-multiplayer-in-unreal-engine

https://unrealcommunity.wiki/linux-quickstart-faqs-8f7980

https://aws.amazon.com/ko/blogs/korea/introducing-amazon-gamelift-anywhere-run-your-game-servers-on-your-own-infrastructure/

'Unreal Engine > 네트워크' 카테고리의 다른 글

[UE5] - 리플리케이션 (Replication)  (0) 2025.02.04

개요

프로그래밍시 쓰레드, 프로세스같은 병렬 처리 구조에 대하여 학습하였을 때 동기,비동기 또는 블로킹, 논 블로킹에 대한

용어들을 자주 들어보았습니다. 저는 쓰레드에 대한 학습 시 동기,블로킹은 멀티쓰레드 상황에서의 상태를 제어하기위해 사용한다고 배웠었는데, 저는 동기,블로킹과 비동기,논블로킹이 서로 같다고 생각하였으나, 학습해보니 서로 각각 다른 의미들을 가지고있었습니다.

이러한 이유로 이번 포스팅에서는 동기, 비동기 그리고 블로킹과 논 블로킹에 대하여 알아보겠습니다.

 

동기(Synchronous) / 비동기(Asynchronous) 

https://jieun0113.tistory.com/73

동기 방식 (Synchronous)

동기 방식은 요청을 보낸 후 응답을 받아야지 다음 동작이 진행되는 것을 말합니다.

동기 방식으로 이루어진 프로그램은 요청받은 하나의 작업이 수행될때까지 다른 작업들은 실행하지 않습니다. 자바 프로그래밍 예시를 들면, 쓰레드 하나가 호출한 메서드에 대한 작업이 완료될 때까지 다른 쓰레드들은 작업을 멈추어져 있는 상태를 예시로 들 수 있습니다. 이러한 방법은 동기 방식으로 설계된 쓰레드가 호출한 함수의 처리 결과를 호출한 함수가 체크하며, 호출한 함수에서 종료가 되었을 때 다른 쓰레드가 접근을 할 수 있습니다.

장점으로는 순차적으로 처리가 필요한 시스템이 있을 경우에는 동기방식을 통하여 작업의 순서를 정하여 사용할수 있는 안전성을 보장해주지만, 하나의 요청이 완료될때까지 다른 요청은 대기해야하므로 비동기 방식보다 처리시간이 더 느리다는 단점또한 가지고 있습니다.

 

비동기 방식 (Asynchronous)

비동기 방식은 동기방식과는 상반되는 경우로, 요청에 대한 결과에 상관없이, 다음 작업이 동작하는 방식입니다.

이러한 시스템은 순차적으로 진행하지 않습니다. 즉, 요청한 작업에 대해 완료 여부를 따지지 않고 자신의 다음 작업을 그대로 수행 할 수 있습니다. 또한 비동기 방식의 경우 동기 방식의 경우 요청이 끝났는지를 확인하기 위해 호출한 함수가 확인을 하는 방면, 비동기 방식은 Callback함수에서 작업완료에 대한 값을 받아 처리합니다.

비동기 방식의 장점으로는 요청한 작업에 대한 완료를 신경쓰지 않기 떄문에 쓰레드를 기준으로 여러개의 쓰레드들이 동시 처리를 함으로써 처리 시간이 동기 방식에 비하여 더 빠르다는 장점을 가지고 있습니다.

하지만, 자바 언어에대해 학습시 Thread Safe하지않다. 라는 말을 자주 들어보았을텐데, 비동기 방식의 경우에서는 하나의 데이터에 대해 여러개의 쓰레드가 동시 접근할시에 순서를 가지지않고 동시에 처리하기때문에 데이터의 값이 예상하지 못한 결과를 가질 수 있습니다.

 

// 비동기 클래스
class notSynchronized extends Thread
{
    static int count = 0;

    public void run()
    {
        for(int i = 0; i < 10000; i++)
        {
            // 정적 지역변수 count의 값을 스레드당 10000번씩 증감한다.
            count++;
        }
    }
}
// Case : C++

#include <iostream>
#include <thread>
#include <vector>

int count = 0;  // 모든 스레드가 공유하는 전역 변수

void notSynchronized() {
    for (int i = 0; i < 10000; i++) {
        count++;  // 동기화 없이 증가 (Race Condition 발생 가능)
    }
}

int main() {
    std::vector<std::thread> threads;

    // 10개의 스레드 생성
    for (int i = 0; i < 10; i++) {
        threads.emplace_back(notSynchronized);
    }

    // 모든 스레드가 종료될 때까지 기다림
    for (auto& t : threads) {
        t.join();
    }

    // Race Condition으로 인해 예상값(100000)과 다른 결과가 나올 수 있음
    std::cout << "Final count (not synchronized): " << count << std::endl;

    return 0;
}

Thread 클래스를 확장하여 정적 지역변수 count의 값을 증감시키는 클래스를 생성하였으며, 

Main 메서드에서는 2개의 해당 클래스의 2개의 쓰레드 객체를 생성하여 실행하였습니다.

비동기 클래스의 실행 결과

 

2개의 스레드를 사용하여 기대한 count의 값은 20000이지만, 실행결과 기대값과 다르며, 모두 다른 값을 리턴합니다.

다음은 동기화를 시키는 방법중 예약어 'synchronized'를 사용하여 동기화를 시킨 코드블럭을 보여드리겠습니다.

// Thread들이 공유할 클래스
class SynchronizedCount
{
    private int count = 0;

    //자바의 예약어 'synchronized'를 사용하여 모니터락 메서드 구현
    public synchronized void increaseCount()
    {
        count++;
    }

    public int getCount(){return count;}
}

//Thread를 확장한 클래스
class synchronizedCountThread extends Thread {
    SynchronizedCount synCount;

    synchronizedCountThread(SynchronizedCount synCount)
    {
        this.synCount = synCount;
    }

    public void run() {
        for (int i = 0; i < 10000; i++) {
            synCount.increaseCount();
        }
    }
}
Case : C++

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>

class SynchronizedCount {
private:
    int count;
    std::mutex mtx;  // 동기화를 위한 뮤텍스

public:
    SynchronizedCount() : count(0) {}

    // 동기화된 증가 함수 (자바의 synchronized 메서드 역할)
    void increaseCount() {
        std::lock_guard<std::mutex> lock(mtx);
        count++;
    }

    int getCount() {
        std::lock_guard<std::mutex> lock(mtx);
        return count;
    }
};

// 스레드 함수
void synchronizedCountThread(SynchronizedCount& syncCount) {
    for (int i = 0; i < 10000; i++) {
        syncCount.increaseCount();
    }
}

int main() {
    SynchronizedCount syncCount;
    std::vector<std::thread> threads;

    // 10개의 스레드 생성
    for (int i = 0; i < 10; i++) {
        threads.emplace_back(synchronizedCountThread, std::ref(syncCount));
    }

    // 모든 스레드가 종료될 때까지 기다림
    for (auto& t : threads) {
        t.join();
    }

    // 동기화로 인해 정확한 결과 보장 (100000)
    std::cout << "Final count (synchronized): " << syncCount.getCount() << std::endl;

    return 0;
}

Thread에서 확장한 클래스에서 증감연산을 할 클래스의 객체를 받아 2개의 Thread를 실행하였습니다

동기화 처리 결과

 

증감연산을 담당하는 클래스에서 동기화를하여 Thread들이 순차적으로 처리되어 기대한 값과 일치하게 나오는것을 볼 수 있습니다. 이 외에도 명시적으로 Lock을 사용하는 ReentLock, concurrent 등의 동기화 방법이 있습니다.

 

 

즉, 동기와 비동기 방식의 차이는 작업 순서처리의 차이를 가지고 있습니다.

동기 방식의 경우 순서를 가지고 있으며, 비동기 방식은 순서를 지키지 않을수 있으며, 이에 대한 결과는 처리 속도에 차이가 있습니다.

또한 작업 완료의 여부를 호출한 함수가 신경을 쓸 것인지, 호출된 함수(Callback 함수)가 신경을 쓸 것인지에 대한 차이가 있습니다.

 

 

블로킹(Blocking) / 논 블로킹(Non-Blocking)

 

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#%EB%8F%99%EA%B8%B0synchronous_/_%EB%B9%84%EB%8F%99%EA%B8%B0asynchronous

Blocking과 Non-Blocking은 다른 요청의 작업을 처리하기 위해 현재 작업을 Block을 하냐, 안하냐의 차이가 있는 프로세스의 실행 방식입니다. 동기 / 비동방식은 전체적인 작업에 대한 순차적인 흐름을 나타내지만, 블로킹 / 논 블로킹의 경우 하나의 처리되어야 하는 작업의 흐름을 막느냐 / 막지 않느냐의 차이가 있습니다. 또한 블로킹은 호출된 함수가 작업을 처리하고 결과를 반환하기 전까지는 호출한 쪽에서 기다려야하며, 논 블로킹의 경우 호출된 함수의 결과를 반환하기 전까지 기다리지 않으며 자신의 작업을 한다는 것을 논 블로킹이라 할 수 있습니다.

 

즉 블로킹 / 논 블로킹의 경우는 하나의 처리해야 하는 작업에게 제어권이 있는지에 대한것을 말합니다.

동기 방식의 경우에는 하나의 작업(함수)가 종료된 후 순차적으로 진행되지만, 블로킹의 경우에는 작업 전체의 흐름을 제어한다는 차이가 있습니다.

 

 

 

 

동기/비동기 와 블로킹/논블로킹의 조합

https://www.inflearn.com/news/72620

동기와 비동기, 그리고 블로킹과 논블로킹은 서로 다른 개념이기때문에 각각 조합하여 사용 할 수 있습니다.

 

1.Sync-Blocking

Sync-Blocking조합의 작업은 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않으며(Blocking) 다른 작업의 완료 여부를 받아 바로 순차적으로 처리하는(Sync)의 방식을 동시에 가지고 있습니다.

이러한 조합은 적은 데이터를 처리하거나 파일 하나를 읽고 쓰는 경우에는 간단하고 직관적인 장점을 가지고 있습니다.

하지만, 데이터가 크거나 시간이 오래걸리는 작업을 할 시에는 하나의 작업이 끝나기 전까지는 다른 작업을 처리하지 못하므로 전체 처리시간이 오래걸리게 되어 비효율적이므로 다른 방식을 사용해야 합니다.

 

2.Sync-NonBlocking

Sync-NonBlocking의 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하면(NonBlocking) 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행하는 방식(Syncronous)입니다.

하나의 요청이 완료되었는지를 지속적으로 체크하며, 처리가 완료되면 다음 작업을 수행하는 특징을 가지고 있습니다.

예시로는 프로그램의 다운로드완료 후 자동시작하는 경우가 있습니다.

프로그램이 다운로드가 되었는지 지속적으로 확인하며, 동시에 사용자는 다른 프로그램을 사용 할 수 있습니다.

이러한 경우를 Sync-NonBlocking이라 볼 수 있습니다.

 

3.ASync-Blocking

Async-Blocking 조합은 다른 작업이 진행되는동안 자신을 멈추고 기다리며, 다른 작업의 결과를 바로 처리하지않아 순서대로 작업을 수행하는 방식입니다. Sync-Blocking과 Async-Blocking의 차이는 개념적으로만 있으며, 큰 차이가 없습니다.

동기방식의 경우 하나의 함수가 끝날때까지 순차적으로 처리한다는 개념인 방면, Blocking은 작업 전체의 흐름을 제어하기 때문에 비슷한 작업 효율이 나온다고 할 수 있습니다.

4.ASync-NonBlocking

Async-NonBlocking 조합은 다른 작업이 진행되는 것에 관계 없이 자신의 작업 또한 수행하며, 다른 작업의 순서를 기다리지 않는방식입니다. 해당 방식은 데이터가 크거나 시간이 오래걸리는 작업에 적절한 조합이라 볼 수 있습니다.

동기 방식을 사용하지 않아 순서를 기다리지않으므로 순차적인 처리가 필요하지 않은 경우에 사용하는것이 좋습니다.

대표적인 방식으로는 대규모 사용자에게 메시지를 전송하거나, 여러개의 프로그램을 동시 다운로드 하는 경우가 있습니다.

 

 

정리

이번 포스팅에서는 동기/비동기 와 블로킹/논블로킹에 대한 차이를 알아보았습니다.

 

동기, 비동기 / 블로킹, 논 블로킹

  1. Synchronous : 동시에 작업을 하는 프로그램들간의 시간을 Callback함수를 사용하여 시간을 맞춘다. 
  2. ASynchronous 동시에 작업을 하는 프로그램들의 시간을 맞추지 않는다.
  3. Blocking : 한 작업이 수행되는 동안 다른 작업들은 할 수 없게 제어권을 가지고 있다.
  4. NonBlocking : 한 작업이 수행되는 동안 다른 작업을 수행할 수 있으며, 제어권을 바로 돌려준다.

동기/비동기와 블로킹/논블로킹은 서로 조합하여 사용할 수있다.

  1. Sync-Blocking : 어떠한 작업이 처리되는동안, 다른 작업들은 대기한다.
  2. Sync-NonBlocking : 어떠한 작업이 처리되는동안, 다른직업들은 대기한다.
    하지만, 작업이 다 처리되었는지 지속적으로 확인한다.
  3. ASync-Blocking : 어떠한 작업이 처리되는 동안, 다른 작업들은 대기한다.
    즉, 동기-블로킹과 비슷한 개념으로, 1번과 비슷한 작업 효율이 나온다.
  4. ASync-NonBlocking : 다른 작업이 진행되는동안에도 자신의 작업을 처리한다.
    순서를 기다리지 않으므로, 처리의 순서가 필요없는 경우에 사용한다.

 

이번 학습을 통하여 동기/비동기와 블로킹/논블로킹에 대한 차이점을 알 수 있었습니다.

또한 4개의 조합을 알 수 있엇는데 Async-Blocking의 경우에는 개발자의 실수로 이루어지는 경우에 이러한 조합이

나온다고 하여 프로그래밍시에 주의해야할 경우를 인지할 수 있엇습니다.

이번 학습을 통하여 프로그래밍 할시 어떠한 조합을 사용해야 할지 확인할수 있었습니다.

 

출처 및 참고내역

 

https://deveric.tistory.com/99

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#%EB%8F%99%EA%B8%B0synchronous_/_%EB%B9%84%EB%8F%99%EA%B8%B0asynchronous

'OS , 네트워크' 카테고리의 다른 글

OSI 7계층  (0) 2025.03.10
TCP/IP 4계층  (0) 2025.02.06
TCP 와 UDP의 특징 및 차이점  (0) 2025.01.06
프로세스 동기화 - 세마포어, 뮤텍스, 임계영역  (1) 2025.01.03

OSI 7계층

출처 https://networkel.com/osi-model-7-layer-network-communication/

OSI 7계층은 네트워크 통신이 이루어지는 과정을 일곱개의 계층으로 나눈것을 말합니다.

각 계층은 각각의 특정한 역할을 수행하며, 7단계로 나뉘어진 이유는 통신이 일어나는 과정을 단계별로 파악함과 동시에

통신 과정중에 이상이 생겼을 시 통신 문제가 생긴 단계에서 해결하기 위해서입니다.

 

OSI 7계층을 기반으로 통신을 위한 데이터 전달 방식은 데이터를 송신하는 장비는 최상위 계층인 응용 계층에서 시작되며,

각 계층을 내려갈 때마다 '헤더'가 붙습니다. 최상위 계층에서 하위 계층까지 헤더가 추가된 상태에서 물리계층을 통하여

다른 장비에게 송신. 송신을받은 장비는 물리계층에서 응용계층까지 헤더를 하나씩 분석하며 응용계층에서 데이터를 받습니다. 이러한과정을 '캡슐화', '역캡슐화' 라고 합니다.

 

※ 네트워킹 : 네트워크 사용자가 인터넷을 통하여 다른 장비들과 데이터를 주고 받는 작업.

※ 헤더 : 각각 계층의 특성을 담은 제어정보.

※ 캡슐화 : 출발지(사진의 Sender Stack)에서 컴퓨터를 보낼 때 응용계층에서 물리계층으로 이동하며 각 계층에서 필요한 정보들이 헤더에 추가되는 과정.

※ 역캡슐화 : 목적지(Receiver Stack)에서 도착한 데이터를 물리계층부터 응용계층까지 각각 데이터가 이상이 없는지 확인하며 각 계층에 맞는 헤더를 제거하며 올라가는 과정.

 

OSI 7계층은 각각의 역할들이 담당되어있으며, 각 계층의 특징들에 대해 알아보겠습니다.

 

1. 물리 계층 (Physical Layer)

물리 계층은 두 시스템 간에 데잍터가 전송되는 전기적,기계적,기능적 특성을 정의합니다.

  • 데이터의 통신단위는 비트(Bit)이며, 1과 0으로 이루어져있다.
  • 송신자는 비트를 전기신호로 바꿔주며, 수신자는 전기신호로 받은 데이터를 1과 0으로 이루어진 비트로 변환한다.
  • 물리 계층에 속하는 통신장치는 허브, 케이블, USB등과 같은 하드웨어 등이 있다.

 

2. 데이터 링크 계층 (DataLink Layer)

데이터 링크 계층은 네트워크를 통해 데이터를 전송하는 역할을 담당합니다.

  • 데이터의 통신단위는 프레임(Frame)이며, 프레임은 데이터를 순서대로 전달해주는 역할을 담당한다.
  • 프레임의 헤더에는 전송하려는 데이터에 대한 MAC주소를 가지고있으며, 맥 주소를 통하여 통신을 한다.
  • 물리 계층에서 오는 데이터에 대한 오류를 감지하는 기능을 제공한다.
  • 데이터 링크에는 이더넷 HDLC, 토큰 링, L2TP 등이 있다.

 

3. 네트워크 계층 (Network Layer)

네트워크 계층은 통신 시 패킷을 통하여 가장 안전하고 빠른 최적의 경로를 전달하는 역할(라우팅)을 담당합니다.

  • 데이터를 최선의 경로로 전달하는 기능(라우팅)을 한다.
  • 데이터의 통신은 IP이며, 네트워크 계층에서 메시지가 처리되고 논리적인 주소(IP)를 물리적인 주소(데이터 링크 계층)로 변환해준다.
  • 데이터 링크 계층은 인접한 두 노드사이의 데이터를 전송하는 담당이지만, 네트워크 계층은 최종 수신지까지의 데이터 전송을 담당한다.
  • 네트워크 계층에는 IP(IPv4, IPv6), ICMP, ARP프로토콜이 있으며, 라우터등의 장비가 이에 속한다.

 

4. 전송 계층 (Transport Layer)

전송계층은 서로 다른 프로세스들 간의 정보 전송을 제공하는 역할을 담당합니다.

  • 프로세스들간의 통신은 논리적 통신(Port) 을 통하여 한다.
  • 전송 계층의 패킷들이 유효한지 확인하며, 전송 실패한 패킷을 다시 전송하는 데이터의 신뢰성과 흐름제어 등을 담당한다.
  • 네트워크 계층에서 IP를 통하여 목적지 호스트에 도달하면, Port번호에 맞는 프로세스를 연결하는 역할을 한다.
  • TCP / UDP 프로토콜 등이 전송계층에 속한다.

 

5. 세션 계층 (Session Layer)

세션계층은 서로 다른 두 컴퓨터에 있는 응용 프로그램들간의 연결을 설정, 유지, 종료 등을 담당합니다. 

  • 사용자와 전송 계층간의 인터페이스 역할을 담당하며, LAN사용자가 서버에 접속할 때 이를 관리하는 기능을 담당한다.
  • 세션 계층에서 데이터 단위를 전송 계층으로 전송할 순서를 결정하며, 데이터를 점검 및 복구하는 동기화 기능을 제공한다.

 

6. 표현 계층 (Presentation Layer)

표현 계층은 데이터의 형식을 수신 컴퓨터에 맞춰 변환, 암호화, 압축 등을 담당합니다. 

  • 서로 다른 소프트웨어간의 맞는 형태로 변환(아스키코드 -> EBDCDIC)을 담당한다.
  • 전송하는 데이터가 텍스트인지, 이미지인지, GIF등의 데이터를 구분하는 역할을 담당한다.
  • 또한 데이터의 보안을 위한 암호화 및 효율적인 전송을 위한 압축 등을 담당한다.

 

7. 응용 계층 (Application Layer)

응용 계층에서는 컴퓨터 응용 프로그램과 네트워크 간의 인터페이스를 제공하며, 사용자의 어플리케이션에 대한 서비스 제공을 담당합니다.

  • 전송받는 최종 목적지로써 HTTP, FTP, SMTP, DNS등의 프로토콜이 이 계층에 속한다.
  • 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행(이메일, 파일전송, 웹 브라우징 등)을 담당한다.
  • 클라이언트와 서버 사이의 동작만을 의미한다. 즉, 다른 계층을 신경쓰지 않는다.

 

 

정리

OSI 7계층은 네트워크 통신과정을 7개의 계층으로 나눈것을 의미하며, 출발지는 응용 계층에서 시작하여

물리 계층까지의 캡슐화 후, 목적지의 물리계층에서 응용 계층까지의 역캡슐화를 통하여 통신하는것을 의미합니다.

각 계층으로 이동시에 데이터와 각각의 계층의 대한 특성을 가진 헤더가 추가 / 제거가 됩니다.

7계층으로 나눈 이유는 효율적인 문제해결을 위해 고안되었으며, 예를들어 네트워크장치에서 문제가 생겼으면

1계층부터 7계층까지 나누어진 계층들을 하나씩 나누어서 체크하여 편리성을 제공하기 위해서입니다.

이번 포스팅에서 OSI 7계층의 간단한 특징과 역할들을 통해 네트워크 통신과정에 대해 알아볼 수 있었으며,

또한 OSI 7계층에 대해 알아보았을때 TCP/IP에도 연관되어있다는 것을 알 수 있엇는데, TCP/IP 에 대한 정보 및 특징들을 비교하여 알아보겠습니다.

 

참고내역

https://devowen.com/344

https://networkel.com/osi-model-7-layer-network-communication/

https://freloha.tistory.com/20

 

+ Recent posts