네트워크 프로그래밍 정리

네트워크 프로그래밍

네트워크 프로그래밍은 컴퓨터 네트워크를 통해 데이터를 전송하고 수신하는 프로그램을 작성하는 것을 의미합니다. 이 과정에서 다양한 프로토콜과 기술을 사용하여 클라이언트와 서버 간의 통신을 구현합니다.

주요 개념

  • 클라이언트-서버 모델: 클라이언트는 서비스를 요청하고, 서버는 요청을 처리하여 응답을 반환합니다.
  • 소켓 프로그래밍: 네트워크 소켓을 사용하여 데이터 전송을 구현합니다. 소켓은 IP 주소와 포트 번호를 통해 식별됩니다.
  • 프로토콜: 데이터 전송 규칙을 정의합니다. 예: TCP, UDP, HTTP, FTP 등.
  • IP 주소: 네트워크 상의 장치를 식별하는 고유한 주소입니다.
  • 포트 번호: 네트워크 서비스의 엔드포인트를 식별하는 숫자입니다. 일반적으로 0에서 65535 사이의 값을 가집니다.
  • 방화벽: 네트워크 보안을 위해 트래픽을 필터링하는 시스템입니다.
  • DNS (도메인 네임 시스템): 도메인 이름을 IP 주소로 변환하는 시스템입니다.
  • TCP/IP 모델: 인터넷 프로토콜 스위트의 핵심 프로토콜들을 계층적으로 나타낸 모델입니다. (응용 계층, 전송 계층, 인터넷 계층, 네트워크 인터페이스 계층)
  • OSI 7 계층 모델: 네트워크 통신을 7개의 계층으로 나눈 참조 모델입니다. (물리, 데이터 링크, 네트워크, 전송, 세션, 표현, 응용 계층)
  • 패킷(Packet): 네트워크를 통해 전송되는 데이터의 작은 조각입니다. 헤더와 페이로드로 구성됩니다.
  • 라우팅(Routing): 패킷이 목적지까지 도달하기 위한 최적의 경로를 찾는 과정입니다.
  • NAT (Network Address Translation): 사설 IP 주소를 공인 IP 주소로 변환하여 여러 장치가 하나의 공인 IP를 공유할 수 있게 하는 기술입니다.
  • 로드 밸런싱(Load Balancing): 여러 서버에 네트워크 트래픽을 분산시켜 특정 서버의 과부하를 방지하는 기술입니다.
  • API (Application Programming Interface): 애플리케이션 간의 상호작용을 위한 인터페이스입니다. 웹에서는 REST API, GraphQL 등이 사용됩니다.
  • 직렬화(Serialization) / 역직렬화(Deserialization): 데이터를 네트워크로 전송하거나 저장하기 위해 바이트 스트림 형태로 변환(직렬화)하고, 이를 다시 원래의 데이터 구조로 복원(역직렬화)하는 과정입니다. JSON, XML, Protocol Buffers 등이 사용됩니다.

주요 프로토콜

  • TCP (Transmission Control Protocol): 신뢰성 있는 연결 지향형 프로토콜입니다. 데이터 전송 순서를 보장하고, 데이터 손실 시 재전송합니다. (예: 웹 브라우징(HTTP/HTTPS), 파일 전송(FTP), 이메일(SMTP))
  • UDP (User Datagram Protocol): 비연결형 프로토콜로, TCP보다 빠르지만 신뢰성을 보장하지 않습니다. (예: DNS, 실시간 스트리밍, 온라인 게임)
  • HTTP (HyperText Transfer Protocol): 웹에서 클라이언트와 서버 간에 데이터를 주고받기 위한 프로토콜입니다.
  • HTTPS (HTTP Secure): HTTP에 SSL/TLS 암호화 계층을 추가하여 보안을 강화한 프로토콜입니다.
  • FTP (File Transfer Protocol): 파일을 전송하기 위한 프로토콜입니다.
  • SMTP (Simple Mail Transfer Protocol): 이메일을 전송하기 위한 프로토콜입니다.
  • DNS (Domain Name System): 위에 언급된 대로, 도메인 이름을 IP 주소로 변환하는 프로토콜입니다. UDP를 주로 사용하지만, 필요에 따라 TCP도 사용합니다.

소켓 프로그래밍 단계 (TCP 기준)

  1. 소켓 생성 (socket()): 통신을 위한 소켓을 생성합니다.
  2. 주소 바인딩 (bind()): 서버 소켓에 IP 주소와 포트 번호를 할당합니다. (서버 측)
  3. 연결 대기 (listen()): 클라이언트의 연결 요청을 기다립니다. (서버 측)
  4. 연결 수락 (accept()): 클라이언트의 연결 요청을 수락하고, 통신을 위한 새로운 소켓을 생성합니다. (서버 측)
  5. 연결 요청 (connect()): 서버에 연결을 요청합니다. (클라이언트 측)
  6. 데이터 송수신 (send()/recv() 또는 write()/read()): 데이터를 주고받습니다.
  7. 연결 종료 (close()): 소켓 연결을 닫습니다.

socket

TCP/IP와 OSI 모델 비교

OSI 계층 TCP/IP 모델 계층 설명
물리 계층 네트워크 인터페이스 계층 실제 데이터 전송을 위한 하드웨어 및 전송 매체
데이터 링크 계층 네트워크 인터페이스 계층 데이터 프레임의 전송 및 오류 검출
네트워크 계층 인터넷 계층 패킷의 라우팅 및 주소 지정
전송 계층 전송 계층 데이터의 신뢰성 있는 전송 및 흐름 제어
세션 계층 응용 계층 세션 관리 및 연결 유지
표현 계층 응용 계층 데이터 형식 변환 및 암호화
응용 계층 응용 계층 사용자 인터페이스 및 애플리케이션 프로토콜

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

  • 동기(Synchronous) 방식: 요청을 보낸 후 응답을 받을 때까지 대기합니다.

  • 비동기(Asynchronous) 방식: 요청을 보낸 후 응답을 기다리지 않고 다른 작업을 수행하다가, 응답이 오면 처리합니다.

  • 블로킹(Blocking) 소켓: 소켓 작업(예: recv(), accept())이 완료될 때까지 프로그램의 실행을 멈춥니다.

  • 논블로킹(Non-blocking) 소켓: 소켓 작업이 즉시 완료되지 않더라도 프로그램의 실행을 멈추지 않고 바로 반환합니다.

RPC (Remote Procedure Call)

RPC는 네트워크를 통해 원격 서버의 함수를 호출하는 기술입니다. 클라이언트는 로컬 함수처럼 원격 함수를 호출할 수 있으며, 서버는 해당 함수를 실행하고 결과를 클라이언트에 반환합니다. RPC는 주로 분산 시스템에서 사용됩니다.

rpc

RESTful API

RESTful API는 HTTP 프로토콜을 기반으로 하는 웹 서비스 아키텍처입니다. REST(Representational State Transfer) 원칙을 따르며, 클라이언트와 서버 간의 상태 전이를 표현합니다. 주요 특징은 다음과 같습니다:

  • 무상태성 (Stateless): 각 요청은 독립적이며, 서버는 클라이언트의 상태를 저장하지 않습니다.
  • 자원 기반 (Resource-based): 모든 데이터는 자원으로 표현되며, URI를 통해 접근합니다.
  • 표준 HTTP 메서드 사용: GET(조회), POST(생성), PUT(수정), DELETE(삭제) 등의 HTTP 메서드를 사용하여 자원에 대한 작업을 수행합니다.
  • JSON/XML 형식: 데이터는 주로 JSON 또는 XML 형식으로 전송됩니다.

restful

WebSocket

WebSocket은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜입니다. HTTP를 통해 초기 연결을 설정한 후, 지속적인 연결을 유지하여 실시간 데이터 전송이 가능합니다. 주요 특징은 다음과 같습니다:

  • 양방향 통신: 클라이언트와 서버가 서로 데이터를 자유롭게 주고받을 수 있습니다.
  • 낮은 지연 시간: 연결이 지속되므로, 매번 새로운 연결을 설정할 필요가 없어 지연 시간이 줄어듭니다.
  • 효율적인 데이터 전송: 헤더가 작고, 지속적인 연결을 유지하므로 데이터 전송이 효율적입니다.

websocket

Server-Sent Events (SSE)

Server-Sent Events(SSE)는 서버가 클라이언트에게 실시간으로 데이터를 푸시할 수 있는 기술입니다. HTTP 프로토콜을 사용하여 클라이언트가 서버에 연결을 유지하고, 서버는 클라이언트에게 이벤트를 전송합니다. 주요 특징은 다음과 같습니다:

  • 단방향 통신: 서버에서 클라이언트로만 데이터가 전송됩니다.
  • 자동 재연결: 연결이 끊어지면 클라이언트가 자동으로 재연결을 시도합니다.
  • 텍스트 기반: 데이터는 주로 텍스트 형식으로 전송되며, JSON 형식도 지원합니다.

serversideevent

STOMP (Simple Text Oriented Messaging Protocol)

STOMP는 메시징 프로토콜로, 클라이언트와 서버 간의 메시지를 전송하는 데 사용됩니다. 주로 메시지 브로커와의 통신에 사용되며, 텍스트 기반의 간단한 프로토콜입니다. 주요 특징은 다음과 같습니다:

  • 간단한 텍스트 기반: 메시지는 텍스트 형식으로 전송되며, 읽기 쉽습니다.
  • 구독/발행 모델: 클라이언트는 특정 주제(topic)를 구독하고, 서버는 해당 주제로 메시지를 발행합니다.
  • 연결 유지: 클라이언트와 서버 간의 연결을 유지하며, 메시지를 실시간으로 전송할 수 있습니다.

stomp

MQTT (Message Queuing Telemetry Transport)

MQTT는 경량 메시징 프로토콜로, IoT(Internet of Things) 환경에서 주로 사용됩니다. 저전력, 저대역폭 환경에서도 효율적으로 동작하도록 설계되었습니다. 주요 특징은 다음과 같습니다:

  • 경량 프로토콜: 헤더가 작고, 최소한의 오버헤드로 설계되어 저전력 장치에서도 사용 가능합니다.
  • 발행/구독 모델: 클라이언트는 특정 주제(topic)를 구독하고, 서버는 해당 주제로 메시지를 발행합니다.
  • QoS (Quality of Service): 메시지 전송의 신뢰성을 보장하기 위해 0, 1, 2의 세 가지 품질 수준을 제공합니다.

mqtt