개요

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

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

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

 

동기(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

 

TCP (Transmission Control Protocol) / IP (Internet Protocol)

 

TCP/IP는 OSI7계층중 4계층인 트랜스포트 레이어의 TCP프로토콜과 3계층인 네트워크 레이어의 IP프로토콜을 합쳐서 불리는 네트워크 프로토콜 스위트로, TCP의 특징인 다른기기로 데이터를 전송을 담당하는것과, IP의 특징인 데이터조각들을 최대한 빨리 목적지로 보내는 역할을 담당하는것을 TCP/IP라고 명칭하여 부릅니다.

 

TCP(Transmission Contorl Protocol)

TCP는 OSI 7계층 중 4계층에 있는 트랜스포트 레이어에 속한 네트워크 프로토콜 중 하나이며 연결지향형 프로토콜 이라고 불리우기도 합니다.

해당 프로토콜의 특징은 높은 신뢰성, 순서 보장, Three-Way Handshaking등이 있습니다.

TCP의 장점으로는 높은신뢰성, 혼잡제어, 흐름제어, 높은 신뢰성, 순서보장 등이 있지만, 아래에 작성할 Three-Way HandShaking방법을 통한 전송으로 인한 다른 프로토콜(UDP 등)에 비하여 상대적으로 느린속도, TCP 헤더에 담긴 정보로 인한 데이터의 크기가 더 높은 단점이 있습니다.

Three-Way Handshaking

3-Way Handshaking이란 로컬 호스트/클라이언트와 서버 간의 연결을 생성하기 위해 TCP/IP 네트워크에서 사용하는 방법입니다. 해당 방법에서는 SYN(Synchronize)와, SYN-ACK(Synchronize-Acknowledgment), ACK(Acknowledgment)의 세단계로 이루어져 있으며 이것을 방법을 통해 클라이언트와 서버간의 신뢰성 있는 연결이 성립됩니다.

1. SYN : 서버와 클라이언트 간의 연결을 설정합니다. 클라이언트가 서버A에게 패킷을 통해 첫번째 세그먼트를 보내 연결을 시작합니다. 해당 세그먼트에는 SYN 의 시퀀스(Ex:1000)번호가 설정되어있으며, 서버A에게 시퀀스 번호 1000에 대한 TCP 접속 요청을 합니다.

 

2. SYN-ACK : 1번의 단계를 거쳐 서버A에서 연결이 가능하다면, 서버에서 연결 요청을 수락하는 플래그를 설정한 ACK를 클라이언트에게 패킷을 통하여 자신의 SYN을 포함하여 전달합니다. 이때, ACK의 번호는 클라이언트의 SYN 시퀀스의 +1인 번호의 상태로 전송됩니다. (Ex: 클라이언트의 SYN가 1000이라면,  ACK은 1001이된다. / 전송되는 SYN:2000, ACK : 1001)

 

3. ACK : 클라이언트에서 SYN-ACK 패킷을 받으며, 서버A에서 연결 요청에 대한 수락을 확인하기 위해 ACK 패킷을 전송하여 응답을 합니다. 이때, ACK패킷의 시퀀스는 서버A에서 보낸 SYN의 +1 값이 됩니다.

 

TCP의 통신은 해당 3단계와 시퀀스 번호를 사용하여 순서를 보장해주며, ACK를통하여 요청의 응답을 서로 확인하기 때문에 높은 신뢰성을 가진 프로토콜이라고 할 수 있습니다.

 

IP(Internet Protocol)

IP는 컴퓨터 네트워크에서 데이터를 전송하기 위한 프로토콜이며, OSI계층에서는 네트워크 레이어에 해당합니다.

해당 프로토콜은 데이터의 라우팅과 주소지정 등을 담당하여 데이터를 패킷을 통해 전달하는것을 담당합니다.

네트워크 계층에서 하는 역할인 논리 주소 체계 인프라를 구축하여 서브 네트워크로 격리하거나 물리적으로 떨어진 네트워크 사이에 서로 통신을 할 수 있는 역할을 담당합니다.

 

UDP(User Datagram Protocol)

UDP는 데이터를 신속하게 전송하기 위한 비연결형 프로토콜중 하나입니다. UCP의 특징으로는 빠른 데이터 전송속도,

낮은 신뢰성, 데이터 수신 여부를 확인하지 않는다는것, 등이 있습니다.

 

연결 지향적 프로토콜 : 클라이언트와 서버가 서로 연결된 상태에서 데이터를 주고받는 프로토콜

비연결형 프로토콜 : 연결을 위해 할당하는 논리적인 경로가 없으며, 각각의 패킷은 서로 다른 경로로 전송되어 독립적인 관계를 가지고 있다.

 

TCP vs UDP

UDP와 TCP의 통신 방식

 

  TCP UDP
서비스 유형 연결 지향형 프로토콜 비연결형 프로토콜
스트림 유형 바이트 스트림 메시지 스트림
헤더 20-60바이트의 가변성 헤더 8바이트 고정 헤더
통신 방식 1:1 통신 1:1, 1:N, N:N 통신
신뢰성 라우터로의 데이터 전달을 보장한다 목적지로의 데이터 전달을 보장할 수 없다.
전송 순서 및
수신여부 확인
데이터 시퀀싱 및 핸드셰이크를 사용한 수신 여부 확인 없음
용도 이메일 보내기, 파일 전송, 웹 브라우징 게임, 동영상 스트리밍, 온라인 채팅

 

TCP / IP의 4계층

 

1. Network Access Layer

  1. OSI 7계층에서 물리계층과 데이터링크 계층의 역할을 담당하는 계층이다.
  2. 해당 계층에서는 물리적 연결을 책임진다. (전화선, 동축케이블, 광섬유케이블, WI-FI등)
  3. 해당 계층의 송수신 단위는 프레임(Frame)이며, 의도된 호스트가 수신할 수 있도록 프레임을 물리적인 신호로 변환한다.
  4. 해당 프레임은 패킷을 캡슐화하고, MAC주소를 사용하여 소스와 대상을 식별한다.

 

2. Internet Layer 

  1. IP, ARP, IGMP, ICMP등의 프로토콜을 담당한다.
  2. 전송단위는 패킷(Packet)이며, 송신측에서 수신측까지 데이터를 전달하기위해 논리적 주소를 설정한다.
  3. 상위 계층(전송 계층)의 데이터를 작은크기의 패킷으로 분할하여 전송한다.
  4. 데이터를 목적지까지 가장 빠르게 전달하도록 하며, 패킷의 송수신 전달 여부를 보증하지 않는다.

 

3. Transport Layer

  1. TCP / UDP를 담당하는 계층이다.
  2. 안정적인 연결을 원할시에는 TCP / 빠른 연결을 원할시에는 UDP를 사용한다.
  3. 포트 번호를 할당하여 상위 응용프로그램에서 실행중인 프로세스를 연결해서 통신한다.
  4. 네트워크 양단의 송수신 호스트 사이에서 신뢰성 있는 전송기능을 제공한다.

 

4. Application Layer 

  1. 네트워크 통신이 필요한 어플리케이션(이메일, 웹 브라우저 등)이 존재하는 계층이다.
  2. Transport Layer를 통하여 원격 호스트에 연결하라는 요청을 보낸다. 
  3. 데이터의 단위는 Message를 가지고 있다.

 

데이터 전송 순서의 예시

1.  Application Layer

  • 특정 어플리케이션에서 웹 페이지를 다운로드 요청을 하는 웹 브라우저의 요청(Message)를 전송 계층으로 전송합니다.

2. Transport Layer

  • 어플리케이션 계층에서 받은 메시지를 대상 포트 주소를 포함하는 TCP / UDP 헤더를 추가합니다.
  • 해당 과정에서 TCP는 세그먼트, UDP는 데이터그램으로 분할하여 헤더를 추가합니다.

3. Network Layer

  • 해당 계층에서 소스 및 목적지 IP주소를 포함하는 헤더를 추가하여 패킷을 생성합니다.

4. Data Link Layer

  • 데이터 링크 계층에서 MAC 주소를 포함하는 헤더를 추가하여 프레임을 생성합니다.
  • 그 후 프레임을 물리계층으로 보내 비트를 전송합니다.

해당 1 ~ 4번의 송신측에서 보내는 과정을 캡슐화 라고하며, 캡슐화를 하는동안 해당 계층에서의 정보가 담겨있는 헤더가 추가됩니다.

 

물리 계층을 통하여 비트단위로 분할한 데이터들을 전달하며, 수신측에서는 캡슐화된 데이터를 전달받아 

DataLink Layer로 넘어가며, 해당 계층에 맞는 헤더들을 읽고 상위 계층으로 전송합니다.

데이터가 Application Layer에 도착한다면, 송신측에서 발신했던 요청에 대하여 응답할 수 있습니다. 해당과정을 역 캡슐화 라고 합니다.


 

이번 포스팅에서는 네트워크에서 데이터들이 어떻게 송/수신되는지에 대한 과정에 대해 알아보려고 합니다.

호스트네임 또는 IP와 포트번호를 통해 송신과 수신을 어떻게 하는지, 그리고 데이터를 전송하는 과정에서의

UDP와 TCP의 전송방식, 특징 및 차이점에 대해 알아보겠습니다.

 

OSI 7계층 / TCP/IP 4계층

OSI 7계층 / TCP/IP 4계층 비교 - https://shlee0882.tistory.com/110

 

※ OSI 7계층 : 네트워크에서 통신이 일어나는 개념적인 과정을 7단계로 나눈 것

※ TCP/IP 4계층 : 네트워크에서 실제로 사용하는 인터넷 표준을 4단계로 나눈 것

 

  • 4층 - 어플리케이션 계층 - HTTP, DNS, FTP 등
  • 3층 - 전송 계층 - TCP, UDP
  • 2층 - 인터넷 - IP
  • 1층 - 네트워크 엑세스 계층 - 이더넷

 

IP(Internet Protocol)

  • TCP와 UDP가 데이터를 전달하는데 사용하는 기본 전송 수단.
  • 데이터를 패킷(Packet)단위로 나누어 전송하고, 목적지 IP 주소를 기반으로 라우팅한다.
  • 비연결성이며, 신뢰성이 보장되지 않는다.
    • 데이터가 유실되거나 순서가 보장되지 않는다.

※ 패킷 (Packet) : 네트워크를 통해 전송되는 형식화된 데이터 덩어리

  • 라우터마다 패킷 한개의 크기가 제한되어있다 .(600 ~9000바이트, 평균 1300)
  • 주고받는 데이터, 페이로드의 크기 및 송/수신자 주소, 체크섬 등이 들어있다.
    • 수신자 주소 : 수신측 단말기까지 전달할 때 라우터에서 필요한 정보
    • 송신자 주소 : 수신측 단말기까지 도착한 후 수신자 측에서 송신자를 식별하는 용도
    • 체크섬 : 메시지를 검증해주는 데이터

 

UDP(User Datagram Protocol)

전송 계층의 통신 프로토콜 중 하나로, 사용자가 정의한 데이터그램을 상대방에게 보낼 수 있게하는 통신 규약입니다.

 

출처 : https://mangkyu.tistory.com/15

 

  • 비 연결지향적 프로토콜
  • 데이터 전달 및 순서 보장을 하지 않는다.
  • UDP 헤더의 체크섬 필드를 통해 최소한의 오류만 검출한다.
  • TCP보다 속도가 빠르며, 빠른 요청과 응답이 필요한 실시간 응용에 사용된다.
    • 데이터그램 유실이 생겨도 이어서 오는 데이터가 해당 정보를 보완해주는것들을 UDP로 전송한다.
    • Ex) 캐릭터 이동 정보
    • 음성, 화상데이터 전송
  • 1:1, 1:N, N:N 형태의 통신이 가능하다.
  • 데이터그램(메시지) 단위로 전송되며, 메시지의 크기가 어플리케이션 크기에 의해 정의된다.
  • 소켓을 활용하여 IP와 PORT를 기반으로 데이터를 전송한다.

 

TCP(Transmission Control Protocol)

전송 계층의 통신 프로토콜 중 하나로, 전송제어를 통해 송/수신데이터가 완전히 동일함을 도장하는 프로토콜 입니다.

ACK / NACK - https://www.geeksforgeeks.org/snooping-tcp/

 

  • 연결지향형(Connection Oriented)식으로, 1:1 통신만 가능하다.
  • 흐름제어기능(Data Flow Control)을 통해 데이터 전송을 보장한다.
    • 데이터가 상대방에게 정확하게 전송되는것을 보장하는 기능
  • 스트림 데이터 형식으로 전송한다.
    • 세그먼트(Segment)라는 IP 패킷에 넣을 수 있는 크기의 단위로 쪼개어 전송
      (송신 단말기 A -> 수신 단말기 B) 
    • IP패킷을 받으면 세그먼트를 꺼내 받은 세그먼트 응답을 송신자에게 반송
      (수신 단말기 B -> 송신 단말기 A)
      • 해당반송 과정을 ack, acknowledge라고 한다.
    • 즉, ack가 회신되지 않은 경우 상대방이 받았다는 응답이 올때까지 다시 세그먼트를 전송하여 송/수신 전송을 보장한다.
  • 패킷에 대한 응답을 하기전까지 블로킹되며, UDP에 비해 속도가 느리다.
  • 연결 시 TCP 3-Way Handshake을 통해 연결을 설정한다.
    1. SYN : 연결을 생성할 때 클라이언트가 서버에 시퀀스 번호를 보내는 패킷
    2. SYN-ACK :  시퀀스 번호를 받은 서버가 ACK값을 생성하여 클라이언트에게 응답하는 패킷
    3. ACK : ACK 값을 사용하여 응답하는 패킷
  • 연결 종료시에는 TCP 4-Way Handshake 방식을 통해 연결을 종료한다.
    1. FIN : 클라이언트가 연결을 종료하고 싶을 때 FIN플래그가 설정된 패킷을 전송
    2. ACK : 시퀀스 번호를 받은 서버가 클라이언트의 종료 요청 확인
    3. FIN : 서버가 종료되었음을 알림과 동시에 클라이언트에게 자신의 시퀀스 번호를 보내는 패킷
    4. ACK : ACK값을 확인하여 서버 종료 요청 확인하는 패킷

 

TCP vs UDP 비교

 

특성 TCP (Stream) UDP (Message)
전송 단위 바이트 스트림 (경계 없음) 메시지 (데이터그램, 경계 유지)
신뢰성 데이터 손실, 순서 보장, 중복 방지 신뢰성 없음
연결성 연결형 (Connection-oriented) 비연결형 (Connectionless)
속도 느림 (추가적인 신뢰성 처리) 빠름 (신뢰성 처리 없음)
사용 사례 파일 전송, 웹 브라우징 (HTTP, FTP 등) 실시간 스트리밍, VoIP, 게임 데이터 전송

 

 

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

동기, 비동기, 블로킹, 논블로킹  (1) 2025.03.11
OSI 7계층  (0) 2025.03.10
TCP/IP 4계층  (0) 2025.02.06
프로세스 동기화 - 세마포어, 뮤텍스, 임계영역  (1) 2025.01.03

프로세스 동기화

프로세스와 스레드들은 내부에서 스레드끼리 자원을 공유하며, 이 과정에서 자원의 순서와 같은 일관성을 보장해야 하기위해 동기화가 되어야합니다.

즉, 프로세스들 사이의 실행순서를 조정하는 방법입니다.

공유된 자원에 대한 멀티 프로세스 및 멀티 스레드 환경에서 동시접근에 대한 일관성을 보장하기위해 다양한 방법들이 있으며 그중 임계영역(Critical Section), 뮤텍스(Mutex), 세마포어(Semaphore)에 대해 알아보겠습니다.

 

임계영역(Critical Section)

멀티프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 데이터 및 코드들의 영역입니다.

임계영역에 동시에 접근하는것을 방지하여 자원의 일관성 및 원자성을 지키기 위해 한번에 하나의 프로세스 또는 스레드만 실행할 수 있도록 보호하는 영역입니다.

  • 임계 영역에 접근하기 위해 동기화 메커니즘(세마포어, 뮤텍스 등)이 필요하다.
  • 여러 스레드가 동시에 진입하면 데이터의 무결성(일관성)이 지켜지지 않는다.
  • 동기화 메커니즘이 없는 경우, 레이스 컨디션(Race Condition)이 발생할 수 있다.
    • 임계구역에 동시에 접근하여 자원의 일관성이 깨지는 경우

 

이러한 임계영역의 사용 및 원자성과 일관성을 보호하기위한 방법은 세가지 원칙을 가지고 있습니다.

  1. 상호 배제 (Mutual Exclusion) : 한 번에 하나의 프로세스 또는 스레드만 임계영역에 진입하도록 보장하는 원칙
  2. 진행 (Progress) : 임계 영역에 접근하려는 프로세스 또는 스레드가 있을 때, 접근한 프로세스 중 하나가 반드시 선택되어야한다.
  3. 한정된 대기 (Bounded Waiting) : 프로세스가 임계영역에 접근하기 위해 대기할 떄 그 대기시간이 한정되있어야한다.

 

뮤텍스 (MUTual EXclusion)

MUTual EXclusion, 상호배제입니다. 멀티 프로세스 및 멀티 스레드 환경에서 임계영역을 가진 스레드들의 공유 불가능한 자원의 동시 사용을 막기위해 사용되는 알고리즘으로, 임계구역에서 구현됩니다.

멀티 프로세스들의 공유 자원에 대한 접근을 제한하기위해 Lock과 Unlock를 사용합니다.

  • 멀티 프로세스 및 멀티스레드 환경에서 공유자원의 동시 사용을 방지해 원자성을 유지한다.
  • lock 과 Unlock을 사용하여 스레드들을 제어한다.
    • lock을 가진 스레드만이 해당 임계구역에 접근할 수있다.
    • 작업이 끝난 스레드는 Unlock을 사용하여 lock상태를 해제한다.
  • 단일 자원 보호에 최적화되어있으며, 사용이 간단하고 직관적이다. / 동기화 대상 자원(스레드)은 하나이다.
  • 특정 스레드가 소유권을 가지고 있는것을 확인할 수 있어 상태 관리가 명확하다.
std::mutex mtx; // 뮤텍스 선언
int sharedCounter = 0; // 공유 자원

void incrementCounter() {
    for (int i = 0; i < 5; ++i) {
        mtx.lock(); // 임계 영역 시작
        // ... 
        mtx.unlock(); // 임계 영역 종료
    }
}

 

 

세마포어 (Semaphore)

카운터(Counter)를 사용하여 공유하는 자원에 대한 동시 접근을 제한하는 방법입니다.

 

  • 사용 가능한 자원의 개수는 0개 이상의 정수(S)로 표현한다.
  • P(Wait) : 세마포어 값을 감소시키며, 값이 음수일 경우 해당 프로세스는 대기한다.
  • V(Signal) : 세마포어 값을 증가시키며, 대기중인 프로세스를 꺠울 수 있다.
  • S가 1일 경우 뮤텍스가 될 수 있다.
  • 변수값을 수정하는 연산은 원자성(Atomicity
  • 여러 자원에 대한 동시 접근을 제어 할  수 있다.
  • 설계가 복잡하며, 교착상태(Dead Lock)이 발생할 수 있다.
void accessResource() {
    sem.acquire(); // 세마포어 획득
    {
        // 임계 영역
        // ... 공유자원에 대한 접근 및 사용
        // 임계 영역
    }
    sem.release(); // 세마포어 해제
}

 

 

뮤텍스 VS 세마포어

  • 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
    • 세마포어 S의 값이 1일 경우, 뮤텍스가 될 수 있다.
  • 세마포어는 소유가 아닌 대여 형태이며, 뮤텍스는 소유권을 가지고 있다.
    • 뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 해당 뮤텍스를 해제(Unlock)할 수있다.
    • 세마포어의 경우 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있다.
  • 세마포어 : 자원의 수량을 제어한다.
  • 뮤텍스 : 자원의 단일 접근을 보장한다.

 

 

 

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

동기, 비동기, 블로킹, 논블로킹  (1) 2025.03.11
OSI 7계층  (0) 2025.03.10
TCP/IP 4계층  (0) 2025.02.06
TCP 와 UDP의 특징 및 차이점  (0) 2025.01.06

+ Recent posts