학습 목표
애플리케이션 계층이 종단 호스트에서 무엇을 하는지 설명할 수 있다.
클라이언트-서버와 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 서버 흐름 (개요)
socket()— 소켓 생성bind()— 로컬 IP·포트에 고정listen()— 연결 대기 큐accept()— 클라이언트 연결 수락, 새 소켓 반환read/write또는recv/send— 데이터 교환close()— 종료
TCP 클라이언트 흐름 (개요)
socket()→connect(server_ip, port)→send/recv→close()
- 위 호출은 C의 BSD socket 기준; Python
socket모듈, Gonet도 같은 모델 - 실제로는 시스템 콜로 커널의 소켓·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 |