이전 단계에서 우리는 IP 주소와 라우팅을 통해 다른 네트워크 대역에 있는 특정 컴퓨터까지 데이터를 전달하는 방법(Host-to-Host Communication)을 이해했습니다. 하지만 실제 통신은 컴퓨터 자체가 아닌, 그 안에서 실행 중인 특정 프로그램(프로세스) 간에 이루어집니다. 예를 들어, 내 컴퓨터의 웹 브라우저 프로세스가 구글 서버의 웹 서버 프로세스와 통신하는 것처럼요.
이번에는 이렇게 서로 다른 컴퓨터에서 실행되는 프로세스 간의 논리적인 연결(Process-to-Process Communication)을 어떻게 가능하게 하는지, 즉 4계층 전송 계층(Transport Layer)의 역할에 대해 알아보겠습니다.
1. 4계층 (전송 계층)의 핵심 역할
- 프로세스 간 논리적 통신 제공: 3계층(네트워크 계층)이 제공하는 호스트 간 통신(Host-to-Host Delivery) 서비스를 기반으로, 종단 시스템(End System)에서 실행되는 애플리케이션 프로세스 간의 논리적인 통신 채널을 제공합니다. 즉, 운영체제(OS) 수준에서 특정 애플리케이션에게 데이터를 전달하고 받는 역할을 수행합니다.
- 다중화 (Multiplexing) 와 역다중화 (Demultiplexing):
- 다중화 (송신 측): 여러 애플리케이션 프로세스로부터 나온 데이터 스트림(또는 메시지)을 받아, 각각에 적절한 4계층 헤더(특히 포트 번호 포함)를 붙여 하나의 IP 패킷 스트림으로 통합하여 네트워크 계층으로 전달합니다.
- 역다중화 (수신 측): 네트워크 계층으로부터 IP 데이터그램을 받아, 그 안에 포함된 4계층 헤더 정보(특히 목적지 포트 번호)를 보고 해당 데이터를 올바른 애플리케이션 프로세스의 소켓(Socket)으로 전달합니다. 운영체제는 "(프로토콜, 출발지 IP, 출발지 포트, 목적지 IP, 목적지 포트)" 튜플 정보를 사용하여 정확한 프로세스를 식별합니다.
- (선택적) 추가 서비스 제공: 사용하는 프로토콜(주로 TCP)에 따라 다음과 같은 부가 서비스를 제공하여 애플리케이션 개발을 용이하게 합니다.
- 연결 지향 통신 (Connection-Oriented Communication): 데이터 전송 전에 논리적인 연결을 설정하고 해제하는 과정 (TCP).
- 신뢰성 있는 데이터 전송 (Reliable Data Transfer): 데이터 유실, 중복, 순서 뒤바뀜 등을 감지하고 복구하여 데이터가 정확하고 순서대로 전달됨을 보장 (TCP).
- 흐름 제어 (Flow Control): 수신 측의 처리 능력을 고려하여 송신 측의 데이터 전송 속도를 조절하여 수신 버퍼 오버플로우 방지 (TCP).
- 혼잡 제어 (Congestion Control): 네트워크의 혼잡 상황을 감지하고 데이터 전송 속도를 조절하여 네트워크 전체의 안정성 유지 (TCP).
- 주요 프로토콜:
- TCP (Transmission Control Protocol): 연결 지향적이며, 신뢰성, 흐름 제어, 혼잡 제어 등 대부분의 부가 서비스를 제공하는 가장 널리 사용되는 프로토콜.
- UDP (User Datagram Protocol): 비연결 지향적이며, 신뢰성이나 순서 보장 없이 최소한의 오버헤드로 데이터를 빠르게 전송하는 데 중점을 둔 단순한 프로토콜.
[궁금할 수 있는 포인트 🤔]
- Q: "다중화/역다중화는 정확히 어떤 과정인가요? 운영체제가 어떻게 수많은 패킷 중에서 올바른 프로세스를 찾아 데이터를 전달하나요?"
- Q: "IP 계층에서도 패킷을 목적지 호스트까지 전달하는데, 왜 굳이 전송 계층에서 또 프로세스 간 통신을 관리해야 하나요? IP만으로는 부족한가요?"
- Q: "TCP가 제공하는 신뢰성, 흐름 제어, 혼잡 제어는 구체적으로 어떤 메커니즘으로 동작하나요? UDP는 왜 이런 기능이 없나요?"
2. 포트 번호 (Port Number): 프로세스를 식별하는 문패
- 목적: 하나의 컴퓨터(IP 주소) 내에서 실행되는 수많은 프로세스들 중 통신해야 할 특정 프로세스를 식별하기 위한 숫자 값. IP 주소가 아파트 주소라면, 포트 번호는 각 집의 호수와 같습니다.
- 특성:
- 16비트 정수 (0 ~ 65535).
- 하나의 포트 번호는 특정 시점에 하나의 프로세스(정확히는 소켓)에 의해 사용될 수 있습니다 (예: 웹 서버는 주로 80번 포트를 사용).
- 하나의 프로세스는 여러 개의 포트 번호(소켓)를 사용할 수 있습니다 (예: 서버가 여러 클라이언트 연결을 동시에 처리하기 위해 각 연결마다 다른 소켓/포트 조합 사용).
- 포트 번호 범위 (IANA 기준):
- 0 ~ 1023: 시스템 포트 (System Ports) 또는 잘 알려진 포트 (Well-Known Ports)
- 특정 서버 애플리케이션이나 시스템 서비스를 위해 국제 인터넷 주소 관리 기구(IANA)에 의해 예약되고 할당된 번호. 일반적으로 관리자 권한이 필요합니다.
- 예시: HTTP (80), HTTPS (443), FTP (20, 21), SSH (22), Telnet (23), SMTP (25), DNS (53).
- 주의: 이 포트 번호 사용이 기술적으로 강제되는 것은 아니지만, 전 세계적인 약속(Convention)입니다. 웹 서버를 8080 포트에서 실행할 수는 있지만, 클라이언트(웹 브라우저)는 기본적으로 80(HTTP) 또는 443(HTTPS) 포트로 접속을 시도하므로 별도 지정 없이는 접속이 어렵습니다.
- 1024 ~ 49151: 등록된 포트 (Registered Ports) 또는 사용자 포트 (User Ports)
- 특정 애플리케이션이나 서비스를 위해 IANA에 등록되어 사용되는 번호. 충돌을 피하기 위해 등록하지만, 시스템 포트처럼 강하게 통제되지는 않습니다.
- 예시: MySQL Server (3306), Oracle DB (1521), MS 원격 데스크톱 (3389), Tomcat HTTP (8080).
- 49152 ~ 65535: 동적 포트 (Dynamic Ports) 또는 임시 포트 (Ephemeral Ports) 또는 사설 포트 (Private Ports)
- 특정 서비스에 고정적으로 할당되지 않고, 클라이언트 측에서 서버에 연결을 시작할 때 운영체제가 동적으로 할당하는 임시 포트 번호. 연결이 종료되면 회수됩니다.
- 예시: 웹 브라우저가 google.com (목적지 포트 443)에 접속할 때, 출발지 포트로 이 범위 내의 임의의 번호(예: 51234)를 할당받아 사용합니다.
- 0 ~ 1023: 시스템 포트 (System Ports) 또는 잘 알려진 포트 (Well-Known Ports)
[궁금할 수 있는 포인트 🤔]
- Q: "클라이언트가 서버에 접속할 때 왜 동적 포트를 사용하나요? 고정된 포트를 사용하면 안 되나요?"
- Q: "하나의 프로세스가 여러 포트를 사용한다는 것은 어떤 경우인가요? 예를 들어 설명해주세요."
- Q: "Well-Known 포트를 사용하지 않고 다른 포트에서 서버를 운영하면 어떤 장단점이 있을까요?"
3. 활성 연결 및 포트 상태 확인: netstat 와 ss
- 목적: 현재 시스템에서 어떤 포트가 사용 중인지, 어떤 프로세스가 해당 포트를 사용하는지, 어떤 외부 호스트와 연결되어 있는지 등의 네트워크 연결 상태를 확인합니다. 디버깅이나 보안 점검 시 유용합니다.
- 명령어:
- netstat (Network Statistics): 전통적으로 많이 사용된 명령어.
- netstat -ano (Windows): 모든 연결 및 수신 대기 포트 표시, 주소를 숫자 형식으로 표시, 각 연결에 대한 프로세스 ID(PID) 표시.
- netstat -antp (Linux): TCP 연결(-t), 숫자 형식(-n), 수신 대기 포트(-l, listening), 관련 프로세스 정보(-p) 표시. (UDP는 -aunp)
- ss (Socket Statistics): netstat보다 빠르고 더 많은 정보를 제공하는 최신 리눅스 명령어. netstat과 유사한 옵션 사용 가능 (예: ss -antp).
- netstat (Network Statistics): 전통적으로 많이 사용된 명령어.
- 주요 확인 정보:
- Proto: 프로토콜 종류 (TCP, UDP 등).
- Local Address: 로컬 시스템의 IP 주소와 포트 번호 (예: 192.168.0.10:80, 0.0.0.0:443). 0.0.0.0은 모든 로컬 IP 인터페이스를 의미.
- Foreign Address: 연결된 원격 시스템의 IP 주소와 포트 번호 (예: 172.217.161.142:443). 수신 대기 상태(LISTEN)에서는 보통 0.0.0.0:* 또는 *:* 로 표시.
- State: TCP 연결 상태 (매우 중요!).
- LISTEN: 서버가 클라이언트의 연결 요청을 기다리는 상태 (서버 소켓).
- SYN_SENT: 클라이언트가 서버에 SYN 패킷을 보내고 응답(SYN-ACK)을 기다리는 상태 (클라이언트).
- SYN_RECEIVED: 서버가 클라이언트의 SYN을 받고 SYN-ACK을 보낸 후, 클라이언트의 ACK를 기다리는 상태 (서버).
- ESTABLISHED: 3-way handshake 완료 후 데이터 전송이 가능한 상태 (클라이언트/서버).
- FIN_WAIT_1, FIN_WAIT_2, CLOSE_WAIT, LAST_ACK, TIME_WAIT, CLOSED: 연결 종료 과정(4-way handshake) 중의 상태들.
- PID/Program name: 해당 연결/포트를 사용하는 프로세스의 ID 및 이름 (관리자 권한 필요).
[궁금할 수 있는 포인트 🤔]
- Q: "netstat 결과에서 LISTEN 상태와 ESTABLISHED 상태의 차이점은 무엇인가요? 서버는 항상 LISTEN 상태인가요?"
- Q: "TCP 연결 종료 과정에 TIME_WAIT 상태가 왜 필요한가요? 바로 CLOSED 상태로 가면 안 되나요?"
- Q: "Local Address에 0.0.0.0이 표시되는 경우는 어떤 의미인가요? 특정 IP 주소가 표시되는 경우와 어떻게 다른가요?"
[심화 학습 포인트]
- 소켓 (Socket): 운영체제가 제공하는 프로세스 간 통신(IPC) 및 네트워크 통신(TCP/IP)의 엔드포인트(Endpoint)이자 프로그래밍 인터페이스(API)입니다. 애플리케이션은 소켓 API(예: Berkeley Sockets - socket(), bind(), listen(), accept(), connect(), send(), recv())를 통해 전송 계층 서비스(TCP/UDP)를 이용합니다. netstat이나 ss로 보는 연결 정보는 사실상 소켓의 상태 정보입니다.
- TCP와 UDP의 선택 기준: 애플리케이션의 요구사항에 따라 달라집니다. 높은 신뢰성이 필요하면 TCP(웹, 이메일, 파일 전송), 속도가 중요하거나 약간의 데이터 손실을 감내할 수 있거나 애플리케이션 레벨에서 신뢰성을 구현한다면 UDP(DNS, DHCP, 실시간 스트리밍, 온라인 게임)를 선택합니다.
[마무리하며]
4계층 전송 계층은 IP가 제공하는 호스트 간 통신 위에 프로세스 간의 논리적 연결이라는 중요한 추상화 계층을 제공합니다. 포트 번호를 이용한 다중화/역다중화를 통해 여러 애플리케이션이 동시에 네트워크를 사용할 수 있게 하며, TCP는 신뢰성, 흐름 제어, 혼잡 제어 등 복잡하지만 편리한 기능을 제공하여 안정적인 통신을 지원합니다. 반면 UDP는 단순함과 속도를 무기로 특정 응용 분야에서 활약합니다. netstat이나 ss 명령어를 통해 이러한 전송 계층의 동작 상태를 직접 확인하며 이해를 더욱 깊게 할 수 있습니다.
'네트워크 > 네트워크 기초' 카테고리의 다른 글
연결지향형 TCP 프로토콜: 신뢰성 있는 데이터 전송의 핵심 (0) | 2025.04.09 |
---|---|
비연결지향형 UDP 프로토콜: 빠르고 간편하게, 하지만 보장은 못 해요! (0) | 2025.04.09 |
3계층 ②: 멀리 있는 컴퓨터와 통신하는 방법 (IPv4, ICMP, 라우팅) (0) | 2025.04.09 |
ARP: IP 주소로 옆자리 친구(MAC 주소) 찾아가기 (0) | 2025.04.08 |
3계층 (네트워크) 개요: 다른 동네까지 길 찾아가기 (IP 주소, 라우팅) (0) | 2025.04.08 |