남은 것을 전부 다루자.
4계층 (전송 계층)
4계층 이상의 상위 계층에서는 전달하거나 전달된 데이터에 대한 필요한 처리를 하는 곳이다.
3계층이 패킷을 목적지 컴퓨터까지 전달한다면, 4계층은 그 컴퓨터 안의 어느 프로세스에게 데이터를 전달할지 담당한다.
대표적인 프로토콜이 TCP와 UDP다.
TCP (Transmission Control Protocol)
TCP는 는 연결 지향, 신뢰성 있는 전송을 보장하는 프로토콜이다.
데이터를 보내기 전에 연결을 수립하고, 데이터가 정확히 전달됐는지 확인하며, 연결을 명시적으로 종료한다.
3-way handshake (연결 수립)
1
2
3
4
5
6
7
클라이언트 서버
│ │
│──── SYN ────────────────▶│ seq=100 "연결할게"
│◀─── SYN + ACK ───────────│ seq=200, ack=101 "ㅇㅇ 준비됨"
│──── ACK ────────────────▶│ ack=201 "확인"
│ │
└────── 연결 수립 완료 ─────┘
SYN = Synchronize, 연결 요청
ACK = Acknowledge, 확인 응답
각 단계에서 시퀀스 번호를 교환해서 이후 데이터 전송의 기준점을 맞춘다.
4-way handshake (연결 종료)
1
2
3
4
5
6
7
8
클라이언트 서버
│ │
│──── FIN ───────────▶│ "끊을게"
│◀─── ACK ────────────│ "확인"
│◀─── FIN ────────────│ "나도 끊을게"
│──── ACK ───────────▶│ "확인"
│ │
└──── 연결 종료 ───────┘
3-way와 달리 4-way인 이유는 양방향 종료를 각각 처리하기 때문이다.
한쪽이 FIN을 보내도 상대방은 아직 보낼 데이터가 있을 수 있어서 ACK와 FIN이 분리된다.
재전송과 타임아웃
TCP는 ACK가 일정 시간 안에 안 오면 재전송한다.
1
2
3
4
5
6
7
8
세그먼트 전송
↓
타임아웃 내에 ACK 안 옴
↓
재전송
↓
계속 안 오면 연결 끊음
이 때 타임아웃 시간을 RTO(Retransmission Timeout)라고 한다.
RTT(Round Trip Time)를 측정해서 동적으로 조정한다.
또, 확인 응답 번호를 정해두고 재전송을 하기에 어디까지 통신이 되는지 볼 수 있다.
예를 들어 1000바이트 데이터를 전송한다고 하면:
1
2
3
4
5
6
7
8
9
10
11
12
송신측이 세그먼트를 나눠서 전송:
세그먼트 1: seq=0, 데이터 0~499바이트 전송
세그먼트 2: seq=500, 데이터 500~999바이트 전송
수신측 ACK:
ACK=500 "500까지 받았어, 다음은 500번 줘"
(세그먼트 2 손실)
ACK 없음 → 타임아웃
송신측 재전송:
세그먼트 2: seq=500 재전송
ACK=1000 "1000까지 받았어, 다 받음"
세그먼트 2가 손실돼도 ACK 번호로 어디서 끊겼는지 알 수 있어서 그 지점부터 재전송한다.
3계층까지는 수신처가 존재하지 않거나 데이터가 손실되는 등의 에러에 대한 문제들을 따로 처리하지 않았다.
TCP에서는 에러에 대해 복구하고 조절을 한다.
- 에러 복구 : 데이터를 수신했을 때 송신처에게 수시한 것을 통지, 확인이 안될 경우 재전송
- 흐름 제어 : 데이터를 보내는 간격이 빨라 처리 속도가 못 따라갈 때 송신량을 조절
UDP (User Datagram Protocol)
UDP는 비연결, 비신뢰성 프로토콜이다.
TCP처럼 핸드쉐이크 과정 없이 일방적으로 보낸다.
그렇다면 불안정적으로 보이는 UDP가 언제 필요한 것일까?
UDP를 쓰는 이유
빠른 전송이 신뢰성보다 중요한 경우에 쓴다.
VoIP (인터넷 전화)는 패킷 하나 손실이 되었다고 재전송 기다리면 0.5초 전 목소리가 재생된다.
그냥 넘어가서 약간 끊기는 게 훨씬 나은 선택이 된다.
같은 원리로 게임에서도 실시간성이 더 중요하기 때문에 UDP가 필요하다.
DNS같은 경우에도 요청/응답이 단순하고 작아서 TCP 연결 수립 오버헤드가 낭비이므로 UDP를 사용한다.
애플리케이션
통신에서 데이터를 주고받는 컴퓨터 소프트웨어를 애플리케이션이라고 부른다.
그리고 어느 애플리케이션이 보냈는지, 받았는지를 결정하기 위해서 port 번호가 부여된다.
포트 (Port)
IP가 어느 컴퓨터인지 나타낸다면, 포트는 그 컴퓨터 안의 어느 프로세스인지 나타낸다.
IP와 MAC주소 만으로는 애플리케이션을 식별할 수 없다.
한 컴퓨터에서 웹서버, SSH, DB가 동시에 동작할 수 있는 이유가 포트로 구분하기 때문이다.
1
2
3
192.168.0.10:80 → 웹서버 프로세스
192.168.0.10:22 → SSH 프로세스
192.168.0.10:3306 → MySQL 프로세스
포트 번호 역할
패킷이 목적지 컴퓨터에 도착하면 OS가 포트 번호를 보고 어느 프로세스로 전달할지 결정한다.
1
2
3
4
5
패킷 도착: 목적지 포트 80
↓
OS가 80번 포트 리스닝 중인 프로세스 찾기
↓
nginx 프로세스로 전달
포트 번호 범위
| 범위 | 이름 | 설명 |
|---|---|---|
| 0 ~ 1023 | Well-known 포트 | 표준 프로토콜. root 권한 필요 |
| 1024 ~ 49151 | 등록된 포트 | IANA에 등록된 애플리케이션 |
| 49152 ~ 65535 | 동적/사설 포트 | OS가 임시로 할당 |
Well-known 포트가 root 권한을 요구하는 이유는 신뢰할 수 없는 프로세스가 80번 포트를 열어서 HTTP 서버인 척 하는 것을 방지하기 위함이다.
임시 할당 포트
브라우저로 구글 접속할 때:
1
2
출발지: 192.168.0.10:54321 ← OS가 임시 할당한 포트
목적지: 142.250.x.x:443 ← 구글 HTTPS
응답이 54321번으로 오니까 해당 브라우저 탭 프로세스로 전달된다.
탭을 여러 개 열어도 포트가 전부 달라서 구분이 가능하다.
연결이 끊기면 OS가 해당 포트를 회수해서 재사용한다.
소켓 (Socket)
소켓은 IP + Port + 프로토콜의 조합이다.
통신의 양 끝점을 나타내며, 연결 하나는 소켓 쌍으로 식별된다.
1
(192.168.0.10:54321, TCP) ↔ (142.250.x.x:443, TCP)
이 4-tuple (출발지 IP, 출발지 Port, 목적지 IP, 목적지 Port)이 유일하면
서버 입장에서 수천 개의 클라이언트 연결을 동시에 구분할 수 있다.
1
2
3
4
서버 142.250.x.x:443 기준:
클라이언트 A: (1.2.3.4:11111, TCP) ↔ (142.250.x.x:443, TCP)
클라이언트 B: (5.6.7.8:22222, TCP) ↔ (142.250.x.x:443, TCP)
클라이언트 C: (1.2.3.4:33333, TCP) ↔ (142.250.x.x:443, TCP)
목적지 포트는 전부 443으로 같아도 출발지가 다르니까 구분 가능하다.
웹 vs 비웹 프로토콜
웹 프로토콜
| 프로토콜 | 포트 | 전송 | 설명 |
|---|---|---|---|
| HTTP | 80 | TCP | 평문 웹 |
| HTTPS | 443 | TCP | TLS 암호화 웹 |
| WebSocket | 80/443 | TCP | 실시간 양방향 통신 |
| HTTP/2 | 443 | TCP | 멀티플렉싱으로 성능 개선 |
| HTTP/3 | 443 | UDP(QUIC) | UDP 기반 |
WebSocket은 HTTP로 핸드셰이크 후 프로토콜을 업그레이드해서 양방향 통신을 유지한다.
채팅, 실시간 알림, 주식 시세 등에 사용된다.
비웹 프로토콜
| 프로토콜 | 포트 | 전송 | 설명 |
|---|---|---|---|
| FTP | 21 (제어) / 20 (데이터) | TCP | 파일 전송 |
| SSH | 22 | TCP | 암호화 원격 접속 |
| SMTP | 25 | TCP | 메일 전송 |
| DNS | 53 | UDP/TCP | 도메인 → IP 변환 |
| DHCP | 67/68 | UDP | IP 자동 할당 |
| POP3 | 110 | TCP | 메일 수신 (다운로드) |
| IMAP | 143 | TCP | 메일 수신 (동기화) |
| SNMP | 161 | UDP | 네트워크 장비 모니터링 |
| LDAP | 389 | TCP | 디렉토리 서비스 (AD) |
| HTTPS | 443 | TCP | - |
| SMB | 445 | TCP | 파일/프린터 공유 |
| RDP | 3389 | TCP | 윈도우 원격 데스크탑 |
| MySQL | 3306 | TCP | DB |
| Redis | 6379 | TCP | 캐시 DB |
| MongoDB | 27017 | TCP | NoSQL DB |
FTP가 포트를 2개 쓰는 이유
1
2
21번: 제어 채널 → 명령어 (LIST, RETR, STOR 등)
20번: 데이터 채널 → 실제 파일 데이터
명령과 데이터를 분리해서 전송 중에도 명령을 내릴 수 있다.
하지만 FTP는 평문 전송이라 보안에 취약하기에 SFTP(SSH 기반)나 FTPS(TLS 기반)로 대체되는 추세다.
5~7계층
OSI 7계층에서 5~7계층은 현대 인터넷에서 표현하기에는 애매하다.
그래서 TCP/IP 모델에서는 이 세 개를 합쳐서 애플리케이션 레이어 하나로 본다.
5계층 — 세션 계층 (Session)
연결 세션을 수립, 유지, 종료하는 것으로
- 로그인 세션 관리
- 대화 제어 (누가 언제 보낼지)
- 체크포인트 (긴 전송 중 끊기면 이어받기)
등을 한다.
현대에서는 TCP 연결이 이 역할을 상당 부분 담당하고,
애플리케이션 레벨 세션(쿠키, JWT)이 나머지를 담당한다.
6계층 — 표현 계층 (Presentation)
데이터 형식 변환, 암호화, 압축.
- 문자 인코딩 변환 (ASCII, UTF-8)
- 데이터 압축 (gzip)
- 암호화/복호화 (TLS/SSL)
TLS가 여기 해당하는데, 실제로는 4계층(TCP)과 7계층(HTTP) 사이에 끼어있다.
7계층 — 애플리케이션 계층 (Application)
사용자가 직접 접하는 프로토콜로
- HTTP, HTTPS, FTP, SSH, DNS, SMTP, WebSocket …
등이 있다.
네트워크에 대한 부분 다음으로 DNS 서버에 대해 좀 더 공부했다.