Network
소켓이 무엇인지 설명하고, 하나의 서버 포트에 여러 클라이언트가 동시에 접속할 수 있는 이유를 설명해주세요
포트의 역할과 Well-known 포트부터 소켓 통신 흐름, 하나의 포트에 수천 클라이언트가 붙을 수 있는 이유까지 — 인터랙티브 시각화로 완전히 이해합니다.
2026년 3월 23일 · 약 12분 읽기
Q. "소켓이 무엇인지 설명하고, 하나의 서버 포트에 여러 클라이언트가 동시에 접속할 수 있는 이유를 설명해주세요."
예상 꼬리질문
답변 가이드
"소켓(Socket)은 IP 주소와 포트 번호의 조합으로, 네트워크 통신의 끝점(endpoint)입니다. (IP, Port, 프로토콜) 3요소로 식별되며, 포트(Port)는 하나의 호스트에서 실행 중인 여러 프로세스를 구별하는 논리적 번호(0~65535)입니다."
"하나의 서버 포트에 여러 클라이언트가 동시에 접속할 수 있는 이유는 소켓 쌍(4-튜플)으로 연결을 구별하기 때문입니다. 서버가 accept()를 호출할 때마다 (클라이언트 IP, 클라이언트 포트, 서버 IP, 서버 포트) 조합이 고유한 새 연결 소켓(Connected Socket)이 생성됩니다."
"서버는 단 하나의 Listening Socket을 포트 80에 유지하고, 각 클라이언트마다 별도의 Connected Socket을 생성합니다. 이론적으로는 클라이언트 IP(32비트) × 클라이언트 포트(16비트)만큼 연결이 가능하지만, 실제로는 파일 디스크립터 수와 메모리가 병목이 됩니다."
웹 서버는 포트 80 하나로 수천 명의 사용자에게 동시에 응답합니다. 어떻게 하나의 포트가 여러 연결을 처리할 수 있을까요?
그 답이 바로 소켓(Socket)과 소켓 쌍(4-튜플)에 있습니다. 포트와 소켓의 관계를 시각화로 완전히 이해해 봅시다.
1. 포트(Port) — 프로세스를 찾아가는 번호
꼬리질문: "포트 번호의 범위와 Well-known 포트에는 어떤 것들이 있나요?"
포트(Port)는 IP가 "컴퓨터 주소"를 담당한다면, 전송 계층(L4)에서 "어느 프로세스"로 데이터를 보낼지 결정하는 논리적 번호입니다. IP 주소가 건물 주소라면, 포트는 건물 내 호실 번호입니다.
포트는 Well-known(0~1023), Registered(1024~49151), Dynamic(49152~65535) 세 구간으로 나뉩니다. 구간을 클릭하여 주요 포트를 확인해 보세요.
포트 번호 범위 탐색기
구간을 클릭하면 해당 범위의 주요 포트를 확인할 수 있습니다.
OS 수준의 표준 서비스가 사용하는 포트입니다. POSIX 시스템에서 이 범위에 bind()하려면 관리자 권한이 필요합니다.
HTTP
TCP · 웹 서버 기본 포트
HTTPS
TCP · TLS/SSL 웹 서버
SSH
TCP · 원격 보안 쉘
FTP
TCP · 파일 전송 (제어)
DNS
TCP/UDP · 도메인 이름 해석
SMTP
TCP · 이메일 전송
Telnet
TCP · 원격 터미널 (비권장)
2. 소켓(Socket) = IP + Port + 프로토콜
꼬리질문: "Ephemeral 포트란 무엇이고 언제 사용되나요?"
소켓(Socket)은 (IP 주소, 포트 번호, 프로토콜) 3요소의 조합으로, 네트워크 통신의 끝점(endpoint)입니다. Unix 철학("Everything is a file")에 따라 소켓도 파일 디스크립터로 취급되어, read()/write()로 데이터를 주고받습니다.
두 소켓이 연결된 소켓 쌍(4-튜플)은 전 세계에서 고유합니다. 클라이언트를 추가하여 4-튜플이 어떻게 각 연결을 식별하는지 확인해 보세요.
소켓 쌍(4-튜플) 시각화
클라이언트를 추가하여 하나의 서버 포트 80에 여러 연결이 공존하는 원리를 확인하세요.
Server
10.0.0.1
Listening
:80
커널 소켓 테이블
3. 소켓 통신 흐름 — socket → bind → listen → accept → read/write → close
꼬리질문: "소켓 통신 흐름을 설명해주세요."
TCP 소켓 통신은 서버와 클라이언트가 각각 정해진 시스템 콜 시퀀스를 따릅니다. 서버는 socket() → bind() → listen() → accept() 순으로 대기 상태를 만들고, 클라이언트는 socket() → connect()로 연결 요청을 보냅니다.
단계별로 진행하며 각 시스템 콜의 역할과 accept()가 새 소켓을 생성하는 원리를 확인해 보세요.
소켓 통신 흐름 단계별 시뮬레이션
"다음 단계" 버튼으로 socket → bind → listen → accept → read/write → close 흐름을 확인하세요.
Server
패킷 교환
Client
서버와 클라이언트가 통신을 시작하기 전 상태입니다. 아무 소켓도 없습니다.
4. 하나의 포트에 여러 클라이언트가 접속 가능한 이유
꼬리질문: "하나의 포트에 여러 클라이언트가 붙을 수 있는 원리가 무엇인가요?"
많은 개발자들이 "포트 하나 = 연결 하나"라고 오해합니다. 그러나 네트워크 연결의 식별 단위는 포트 번호 하나가 아니라 4-튜플(소켓 쌍) 전체입니다. 서버 포트 80이 같아도 클라이언트의 IP나 포트가 다르면 OS 커널은 이를 완전히 다른 연결로 취급합니다.
클라이언트를 연결하며 Listening Socket 1개와 Connected Socket N개의 관계를 직접 확인해 보세요.
다중 클라이언트 동시 접속 데모
"클라이언트 연결" 버튼을 클릭하면 서버 포트 80에 새 클라이언트가 연결됩니다. 4-튜플로 각 연결이 구별됩니다.
Server
10.0.0.1
Listening Socket
:80
항상 유지
5. TCP 소켓 vs UDP 소켓
꼬리질문: "TCP 소켓과 UDP 소켓의 차이는 무엇인가요?"
소켓은 프로토콜에 따라 스트림 소켓(SOCK_STREAM, TCP)과 데이터그램 소켓(SOCK_DGRAM, UDP)으로 나뉩니다. TCP 소켓은 연결 지향으로 순서와 신뢰성을 보장하고, UDP 소켓은 비연결형으로 낮은 지연을 제공합니다.
TCP 소켓은 listen()/accept()가 필요하지만, UDP 소켓은 bind() 후 바로 recvfrom()/sendto()를 사용합니다.
| 구분 | TCP 소켓 (SOCK_STREAM) | UDP 소켓 (SOCK_DGRAM) |
|---|---|---|
| 연결 방식 | 연결 지향 (3-way handshake) | 비연결형 (즉시 전송) |
| 신뢰성 | 순서 보장, 재전송, ACK | 보장 없음 |
| 서버 흐름 | socket → bind → listen → accept | socket → bind → recvfrom |
| 클라이언트 흐름 | socket → connect → write/read | socket → sendto |
| 사용 사례 | HTTP, SSH, MySQL, PostgreSQL | DNS, 게임, VoIP, 스트리밍 |
자주 발생하는 문제
실무에서 포트와 소켓 관련하여 자주 마주치는 문제입니다.
면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 포트/소켓 질문은 준비 완료입니다.
- - 포트 범위: Well-known(0~1023, root 필요), Registered(1024~49151), Dynamic(49152~65535)
- - 소켓: IP + Port + 프로토콜 조합의 통신 끝점. 파일 디스크립터로 취급
- - 소켓 쌍(4-튜플): (클라 IP, 클라 포트, 서버 IP, 서버 포트) — 연결의 고유 식별자
- - 다중 클라이언트 원리: Listening Socket 1개 + Connected Socket N개. 커널이 4-튜플로 디스패치
- - 소켓 통신 흐름: socket() → bind() → listen() → accept() → read()/write() → close()
개념 확인 퀴즈
아티클에서 배운 내용을 실제 상황에 적용해 보세요.
Well-known 포트가 필요한 이유
$ python -m http.server 80 PermissionError: [Errno 13] Permission denied # 반면 이건 성공: $ python -m http.server 8080 Serving HTTP on 0.0.0.0 port 8080 ...
소켓 쌍(4-튜플)의 고유성
서버 A (IP: 10.0.0.1)가 포트 80으로 서비스 중입니다. 다음 중 서버가 구별할 수 없는 연결 쌍은? A: (192.168.1.2:50001 → 10.0.0.1:80) (192.168.1.3:50001 → 10.0.0.1:80) B: (192.168.1.2:50001 → 10.0.0.1:80) (192.168.1.2:50002 → 10.0.0.1:80) C: (192.168.1.2:50001 → 10.0.0.1:80) (192.168.1.2:50001 → 10.0.0.1:80) D: (192.168.1.2:50001 → 10.0.0.1:80) (192.168.1.2:50001 → 10.0.0.1:443)
accept()의 역할
// Java 서버 코드 ServerSocket serverSocket = new ServerSocket(80); // bind + listen Socket clientSocket = serverSocket.accept(); // 연결 대기 // accept() 이후 상태는?
Ephemeral 포트
$ curl http://example.com/api # 이 요청에서 curl(클라이언트) 측의 # 소켓 포트 번호는 누가 어떻게 결정하는가?
listen() 없이 accept() 가능한가
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8080))
# listen() 호출 없음!
conn, addr = s.accept() # 이 코드의 문제는?마무리
- - 포트: 전송 계층에서 프로세스를 식별하는 0~65535 번호
- - 소켓: IP + Port + 프로토콜의 통신 끝점 (Everything is a file)
- - 4-튜플: 네트워크 연결의 고유 식별자
- - 다중 클라이언트: accept()마다 새 Connected Socket 생성, 커널이 4-튜플로 디스패치
더 알아볼 주제: TCP TIME_WAIT와 MSL, SO_REUSEPORT vs SO_REUSEADDR, Non-blocking I/O와 epoll/kqueue, WebSocket
추가 학습 자료를 공유합니다.
- Beej's Guide to Network Programming — C 소켓 프로그래밍의 바이블. socket/bind/listen/accept 전 과정을 예제로 설명. 입문에 최적인 무료 온라인 책
- Cloudflare 블로그 — UDP 소켓의 모든 것 — 실제 대규모 인프라에서 소켓을 어떻게 다루는지 실전 관점으로 설명한 심화 글
- RFC 793 — Transmission Control Protocol — TCP 소켓 동작의 근거가 되는 공식 명세. 시스템 콜과 상태 전이를 공식 문서로 확인 가능
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.