네트워크 기초

애플리케이션 계층 개요

meellon 2026. 6. 21. 05:30

학습 목표

애플리케이션 계층이 종단 호스트에서 무엇을 하는지 설명할 수 있다.

클라이언트-서버P2P 구조의 차이와 트레이드오프를 비교할 수 있다.

소켓(Socket) 이 앱과 전송 계층 사이의 API임을 설명할 수 있다.

socket·connect·bind 등이 OS 시스템 콜과 연결됨을 설명할 수 있다.

문제 상황

  • 웹은 "서버에 요청"이라고 하는데, BitTorrent는 피어끼리 주고받는다
    • 같은 애플리케이션 계층인데 구조가 다른 이유를 모른다
  • curl https://api.example.com은 되는데, 소스에는 socket()만 보인다
    • HTTP와 소켓이 어떤 관계인지 헷갈린다
  • 포트 443은 열려 있는데 8080은 Connection refused
    • 누가 포트를 열고 받는지(서버 프로세스) 모르면 디버깅이 막힌다
  • 앱은 유저 모드인데 패킷은 커널이 보낸다
    • 애플리케이션 계층과 OS 경계가 어디인지 모른다

계층·캡슐화를 봤다. Top-Down 시리즈는 이제 맨 위 계층—앱이 네트워크를 쓰는 방식부터 내려간다.

1. 애플리케이션 계층이 하는 일

애플리케이션 계층은 종단 호스트에서 실행되는 프로세스가 서로 메시지를 주고받는 규칙을 다룬다.

역할
메시지 형식 정의 HTTP 요청/응답, DNS 질의, SMTP 명령
통신 패턴 선택 클라이언트-서버, P2P
전송 서비스 요구 신뢰(TCP) vs 저지연(UDP)
식별 도메인, URL, 애플리케이션 프로토콜
  • 라우터·스위치는 보통 애플리케이션 PDU 내용을 해석하지 않는다
    • IP/TCP/UDP 헤더만 보고 전달
  • 개발자가 직접 다루는 계층이 여기에 가깝다
    • HTTP 클라이언트 라이브러리도 결국 소켓 위에 올라간다

2. 클라이언트-서버 (Client-Server)

가장 흔한 구조. 항상 켜져 있는 서버가 서비스를 제공하고, 클라이언트가 요청한다.

구성 역할
Server 고정 IP(또는 DNS), well-known port에서 대기 (listen)
Client 필요할 때 연결·요청·응답 수신 후 종료 가능
통신 클라이언트가 먼저 연결을 연다 (outbound)
  • 예: 웹(HTTP), REST API, 이메일(SMTP/IMAP), SSH
  • 확장: 로드 밸런서 뒤에 서버 여러 대, CDN이 콘텐츠를 가장 가까운 엣지에 배치
  • 특징
    • 서버 주소가 공개·안정적이면 클라이언트가 찾기 쉽다
    • 서버가 병목·단일 장애점이 될 수 있다
# 서버가 443에서 listen 중인지 (로컬)
ss -tlnp | grep ':443'

3. P2P (Peer-to-Peer)

모든 참가자가 클라이언트이자 서버 역할을 할 수 있다. 중앙 서버 없이(또는 최소한으로) 파일·블록을 교환한다.

  Client-Server P2P
중앙 서버 필수(또는 사실상) 없거나 메타데이터만
확장 서버·CDN 투자 참가자 수에 비례해 용량 증가
가용성 서버 의존 피어 이탈 시 청크 부족 가능
웹, API BitTorrent, 일부 VoIP
  • 하이브리드도 많다
    • BitTorrent: 트래커(중앙) + 피어 간 전송
    • Skype(과거): 슈퍼노드 + P2P
  • P2P는 NAT·방화벽 뒤에서 연결이 어려워 홀 펀칭·릴레이 이슈가 따른다

4. 소켓 API 소개

애플리케이션은 TCP/IP 스택을 직접 건드리지 않는다. OS가 제공하는 소켓 API로 전송 계층 서비스를 쓴다.

Application (browser, your API server)
        |
   Socket API  — socket(), bind(), listen(), accept(), connect(), send(), recv()
        |
 Transport   — TCP (reliable) or UDP (datagram)
        |
   Network     — IP
        |
     Link
개념 설명
Socket 네트워크 통신의 끝점(endpoint) — 파일 디스크립터와 유사한 추상화
Port 호스트 안에서 프로세스를 구분 (0~65535)
Address IP + port = (host, port) 소켓 주소

TCP 서버 흐름 (개요)

  1. socket() — 소켓 생성
  2. bind() — 로컬 IP·포트에 고정
  3. listen() — 연결 대기 큐
  4. accept() — 클라이언트 연결 수락, 새 소켓 반환
  5. read/write 또는 recv/send — 데이터 교환
  6. close() — 종료

TCP 클라이언트 흐름 (개요)

  1. socket()connect(server_ip, port)send/recvclose()
  • 위 호출은 C의 BSD socket 기준; Python socket 모듈, Go net도 같은 모델
  • 실제로는 시스템 콜로 커널의 소켓·TCP 스택에 진입한다
    • OS 시리즈에서 본 유저/커널 경계와 동일
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("example.com", 80))
s.send(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
print(s.recv(4096)[:200])
s.close()
  • curl·브라우저는 이 과정을 라이브러리로 감싼 것
    • 다음 편부터는 그 위의 HTTP 메시지 형식을 본다

5. 프로세스와 포트

  • 한 호스트에 여러 프로세스가 동시에 네트워크를 쓴다
    • 전송 계층은 포트로 프로세스를 구분 (멀티플렉싱)
  • well-known port 예: 80(HTTP), 443(HTTPS), 53(DNS), 22(SSH)
  • EADDRINUSE: 이미 다른 프로세스가 그 포트를 bind한 상태

6. 정리

  • 애플리케이션 계층은 프로세스 간 메시지와 프로토콜(HTTP, DNS 등)을 다룬다
  • 클라이언트-서버는 가장 흔하고, P2P는 분산·확장에 유리하지만 운영이 까다롭다
  • 소켓은 앱과 TCP/UDP 사이의 API이고, 구현은 OS 커널에 있다
  • Top-Down 다음 단계: HTTP·DNS 등 구체 프로토콜

다음에 다룰 것

  • HTTP 기초
  • 요청/응답, 메서드, 상태 코드, 무상태성

해당 내용은 Computer Networking: A Top-Down Approach, 8/E (James Kurose, Keith Ross) 의 내용을 기반으로 합니다.

'네트워크 기초' 카테고리의 다른 글

HTTP 심화  (0) 2026.06.23
HTTP 기초  (0) 2026.06.22
프로토콜 계층 구조  (0) 2026.06.20
인터넷이란 무엇인가  (0) 2026.06.19
네트워크 오리엔테이션  (0) 2026.06.16