장애 채널에 "네트워크가 안 됩니다"라는 한 줄만 올라왔습니다. ping은 되는지, 포트는 열렸는지, HTTP 응답은 오는지 구분하지 않으면 모두가 각자 다른 문제를 상상합니다.
OSI 계층은 외우는 표가 아니라 장애를 쪼개는 언어입니다. 계층별 도구를 쓰면 원인을 좁힐 수 있습니다.
OSI 7계층과 TCP/IP 모델
네트워크 문제가 발생했을 때 "어디서 막혔는지"를 빠르게 좁히려면 계층 모델을 이해해야 합니다. 인프라 엔지니어가 가장 먼저 배우는 개념이면서, 실무에서도 매일 사용하는 사고 프레임워크입니다.
- 1OSI 7계층 모델의 각 계층 역할과 데이터 단위를 설명할 수 있다
- 2TCP/IP 4계층 모델을 OSI 계층에 매핑할 수 있다
- 3MAC 주소(L2), IP 주소(L3), 포트 번호(L4) 등 계층별 식별자를 구분할 수 있다
- 4ping(ICMP)으로 L3 통신을 검증할 수 있다
- 5telnet/nc으로 L4 TCP 포트 열림 여부를 확인할 수 있다
- 6curl로 L7 HTTP/HTTPS 응답을 검증하고 장애 계층을 좁힐 수 있다
ping -c 1 8.8.8.8nc -h 2>&1 | head -1 || sudo apt-get install -y netcatcurl --version | head -1telnet 2>&1 | head -1 || sudo apt-get install -y telnetOSI 7계층 모델이란?
서버에 배포한 서비스가 갑자기 안 된다는 신고가 들어왔습니다. 어디서부터 확인해야 할까요? 서버 자체가 살아있는지, 포트가 열려있는지, 애플리케이션이 응답하는지 — 순서 없이 여기저기 찔러보다가 시간만 가는 상황을 막으려면 계층별 사고 프레임이 필요합니다. OSI 7계층 모델이 바로 이 프레임입니다.
확대
건물에 비유하면, 전기가 들어오는지(L1), 인터폰이 작동하는지(L2), 주소를 찾아오는지(L3), 문이 열리는지(L4), 안에 사람이 있는지(L7) — 각 층을 차례로 확인하면 어디가 문제인지 빠르게 좁혀집니다. 네트워크 장애 대응이 정확히 이 방식으로 이루어집니다.
OSI(Open Systems Interconnection) 모델은 ISO가 1984년에 정의한 네트워크 통신의 표준 참조 모델입니다. 네트워크 통신을 7개의 계층으로 나누어, 각 계층이 하는 역할을 명확하게 정의했습니다.
실제 구현에서는 TCP/IP 모델을 사용하지만, 장애 진단과 개념 설명에서는 OSI 7계층이 훨씬 세밀하기 때문에 지금도 표준 언어로 사용됩니다.
L7 애플리케이션 계층 (Application) HTTP, HTTPS, DNS, SMTP, FTP
L6 표현 계층 (Presentation) TLS/SSL, 인코딩, 압축
L5 세션 계층 (Session) 세션 관리, 인증
L4 전송 계층 (Transport) TCP, UDP — 포트 번호
L3 네트워크 계층 (Network) IP — 라우팅, 논리 주소
L2 데이터링크 계층 (Data Link) Ethernet, MAC 주소
L1 물리 계층 (Physical) 케이블, 광섬유, 전기 신호
계층의 핵심 원칙: 각 계층은 자신의 역할만 담당하고, 위아래 계층에 서비스를 제공합니다. 데이터는 송신 측에서 L7→L1 방향으로 **캡슐화(Encapsulation)**되고, 수신 측에서 L1→L7 방향으로 **역캡슐화(Decapsulation)**됩니다.
패킷 하나가 계층을 내려가고 올라오는 전체 흐름 — 캡슐화와 TCP 3-way handshake
데이터가 계층을 타고 나가고 들어오는 흐름 — 캡슐화·역캡슐화와 TCP 연결
계층을 표로 외웠어도, curl 한 줄이 실제로 케이블에 나가는 과정을 그리지 못하면 tcpdump 캡처나 MTU·방화벽 문제에서 "지금 어느 계층 헤더를 보고 있는지" 감이 안 옵니다. 데이터는 보낼 때 위(L7)에서 아래(L1)로 내려가며 각 계층이 자기 헤더를 덧씌우고(캡슐화), 받을 때는 아래에서 위로 올라가며 한 겹씩 벗깁니다(역캡슐화). 이 흐름과 TCP 연결이 맺어지는 순서를 알면 장애가 어느 계층에서 났는지 한눈에 좁혀집니다.
① 보낼 때 — 계층을 내려가며 헤더를 덧씌운다(캡슐화):
[송신 호스트] curl → HTTP 요청 바이트
│
L7 응용 HTTP 메시지 생성 [ HTTP 데이터 ]
│ ↓
L4 전송 TCP 헤더 부착(출발/목적 포트, seq) [ TCP | 데이터 ] = 세그먼트
│ ↓
L3 네트워크 IP 헤더 부착(출발/목적 IP), 경로 결정 [ IP | TCP | 데이터 ] = 패킷
│ ↓ (다음 홉 MAC이 필요 → ARP로 조회)
L2 링크 이더넷 헤더/트레일러 부착(MAC) [ ETH | IP | TCP | 데이터 | FCS ] = 프레임
│ ↓
L1 물리 비트(전기/광 신호)로 링크에 송출 1010111000...
▼
[네트워크] 스위치(L2)·라우터(L3)를 거쳐 목적지로 → 수신 측은 L1→L7로 역캡슐화(헤더를 거꾸로 벗김)
② 연결을 맺고 끊는 순서 — TCP 3-way handshake와 상태 변화:
클라이언트 서버 (LISTEN)
│ SYN (seq=x) ─────▶ 접속 요청
│ (SYN-SENT) (SYN-RCVD)
│ ◀───── SYN-ACK (seq=y, ack=x+1) 응답 + 승인
│ ACK (ack=y+1) ─────▶ 승인 확정
│ ===== 양쪽 ESTABLISHED : 데이터 송수신 =====
│ ...HTTP 요청/응답...
│ FIN ─────▶ 종료 요청
│ ◀───── ACK, 이어서 FIN 종료 승인
│ ACK ─────▶
│ (TIME-WAIT: 잔여 패킷 대기) (CLOSED)
각 계층이 붙이는 것과, 막히면 나타나는 증상:
| 계층 | 나갈 때 붙이는 것 | 여기서 막히면 |
|---|---|---|
| L7 응용 | HTTP 메시지(메서드·헤더·바디) | 앱·URL 문제 — 4xx·5xx 응답(하위 계층은 정상) |
| L4 전송 | TCP 헤더: 출발/목적 포트, seq/ack, 플래그(SYN·ACK·FIN) | 포트 미개방·방화벽 → Connection refused(RST) 또는 타임아웃(DROP) |
| L3 네트워크 | IP 헤더: 출발/목적 IP, TTL. 라우팅 테이블로 다음 홉 결정 | 경로 없음·게이트웨이 문제 → Network unreachable·ping 무응답 |
| L2 링크 | 이더넷 헤더: 출발/목적 MAC. 다음 홉 MAC은 ARP로 해석 | 같은 LAN인데 ARP 실패 → 프레임이 안 나감(다른 서브넷은 게이트웨이 MAC으로) |
| L1 물리 | 비트를 전기·광 신호로 링크에 송출 | 링크 다운·케이블 불량 → ip link가 DOWN, 전 계층 실패 |
즉 "패킷이 나갔다"는 L7의 바이트가 TCP·IP·이더넷 헤더로 세 겹 감싸여 프레임으로 송출됐고, 수신 측이 역순으로 벗겨 앱까지 올렸다는 뜻입니다. tcpdump로 보는 것이 바로 이 헤더들입니다. 연결이 어디서 막혔는지는 ss -tan으로 소켓 상태를 보면 드러납니다 — LISTEN은 서버가 대기 중, SYN-SENT가 쌓이면 내 SYN에 상대가 응답을 안 하는 것(L3/L4 경계, 방화벽 DROP·서버 미기동), ESTABLISHED면 핸드셰이크 성공, TIME-WAIT 폭증은 짧은 연결을 너무 자주 여닫는다는 신호(능동 종료 측이 2MSL 동안 잔여 패킷을 기다림)입니다. 그래서 "포트가 안 열린다"는 신고는 ss로 상태부터 보고, SYN 단계(L4 핸드셰이크)에서 멈췄는지 그 위(L7 앱)에서 멈췄는지를 먼저 가릅니다.
각 계층 상세 설명
L1 — 물리 계층 (Physical Layer)
전기 신호, 광 신호를 물리적으로 전송합니다. 케이블, NIC 카드, 허브, 리피터 등이 여기에 해당합니다.
- 데이터 단위: 비트(Bit)
- 장비: 케이블, 허브, 리피터
- 장애 증상: 링크 다운, 케이블 불량, NIC 오류
- 확인 방법:
ip link show—UP/DOWN상태 확인
# 실습 디렉토리 준비
mkdir -p /tmp/networking/part1/exam_1 && cd /tmp/networking/part1/exam_1
# 물리 계층 상태 확인
ip link show eth0
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
# ↑ UP이면 물리 연결 정상
- ping 결과를 먼저 보고, 그 다음 nc/telnet으로 포트를 확인 — ping 성공 + nc 실패이면 L3는 정상이고 L4(포트/방화벽)가 문제
- ping RTT 기준: 1ms 이하이면 같은 LAN, 1~30ms이면 도시 간, 100ms 이상이면 대륙 간 — RTT가 평소보다 10배 이상 높아지면 경로 문제 또는 대역폭 포화 의심
- ping 성공 + curl 실패 → L3 정상/L7 문제(앱 미기동 또는 443 차단); ping 실패 + ip link show UP → L3 라우팅 문제; ip link show DOWN → L1/L2 물리 연결 단절
L2 — 데이터링크 계층 (Data Link Layer)
같은 네트워크 세그먼트(LAN) 내에서 프레임을 전달합니다. MAC 주소로 목적지를 식별합니다.
- 데이터 단위: 프레임(Frame)
- 주소 체계: MAC 주소 (48비트, 예:
aa:bb:cc:dd:ee:ff) - 장비: 스위치, 브리지
- 확인 방법:
arp -n— MAC 주소 테이블 확인
# ARP 테이블 확인 (L2 통신이 이루어진 호스트 목록)
arp -n
# Address HWtype HWaddress Flags Iface
# 192.168.1.1 ether aa:bb:cc:dd:ee:ff C eth0
L3 — 네트워크 계층 (Network Layer)
IP 주소를 기반으로 다른 네트워크까지 패킷을 라우팅합니다. 인터넷이 동작하는 핵심 계층입니다.
- 데이터 단위: 패킷(Packet)
- 주소 체계: IP 주소 (IPv4 32비트, IPv6 128비트)
- 장비: 라우터
- 프로토콜: IP, ICMP, OSPF, BGP
# L3 통신 확인 — ping
ping -c 3 8.8.8.8
# 라우팅 경로 확인
ip route show
# default via 192.168.1.1 dev eth0
# 192.168.1.0/24 dev eth0 proto kernel
L4 — 전송 계층 (Transport Layer)
포트 번호를 사용해 프로세스 간 통신을 관리합니다. TCP(신뢰성)와 UDP(속도)가 대표적입니다.
- 데이터 단위: 세그먼트(TCP) / 데이터그램(UDP)
- 식별자: 포트 번호 (0~65535)
- 프로토콜: TCP, UDP
# L4 통신 확인 — telnet으로 특정 포트 열림 여부 확인
telnet 192.168.1.10 80
# Connected to 192.168.1.10. ← 연결 성공 (L4 정상)
# 현재 열려있는 포트 확인
ss -tlnp
# State Recv-Q Send-Q Local Address:Port
# LISTEN 0 128 0.0.0.0:80
L5, L6 — 세션/표현 계층
현대의 TCP/IP 구현에서는 L5(세션)와 L6(표현)이 애플리케이션 계층에 통합되는 경우가 많습니다. TLS/SSL 암호화가 L6에 해당합니다.
L7 — 애플리케이션 계층 (Application Layer)
사용자가 직접 사용하는 프로토콜 계층입니다. HTTP, HTTPS, DNS, SMTP 등이 여기에 해당합니다.
- 데이터 단위: 메시지(Message)
- 프로토콜: HTTP, HTTPS, DNS, FTP, SSH, SMTP
# L7 통신 확인 — curl로 HTTP 응답 확인
curl -I http://example.com
# HTTP/1.1 200 OK ← L7 애플리케이션 응답 정상
# Content-Type: text/html
TCP/IP 4계층 모델
OSI 7계층을 외웠는데 실제 코드나 문서에서는 "인터넷 계층", "전송 계층"이라는 말이 나옵니다. 팀원이 "L4에서 막힌 것 같다"고 할 때 OSI 기준인지 TCP/IP 기준인지 헷갈립니다. 두 모델을 자유롭게 오가며 매핑할 줄 알아야 문서를 읽고 장비 설정을 이해할 수 있습니다.
실제 인터넷 구현에 사용되는 모델입니다. OSI 7계층을 실용적으로 단순화하여 4계층으로 표현합니다.
확대
| TCP/IP 4계층 | OSI 7계층 대응 | 주요 프로토콜 |
|---|---|---|
| 애플리케이션 계층 (Application) | L5(세션) + L6(표현) + L7(애플리케이션) | HTTP, HTTPS, DNS, FTP, SSH, SMTP |
| 전송 계층 (Transport) | L4 (전송) | TCP, UDP |
| 인터넷 계층 (Internet) | L3 (네트워크) | IP, ICMP, ARP |
| 네트워크 접근 계층 (Network Access) | L1(물리) + L2(데이터링크) | Ethernet, Wi-Fi, PPP |
실무에서 OSI와 TCP/IP를 모두 알아야 하는 이유:
- 장비/제조사 문서, RFC, 교재 → OSI 계층 용어 사용
- 실제 프로토콜/코드 이해 → TCP/IP 모델
- 두 모델 간 매핑을 자유롭게 할 수 있어야 합니다.
계층별 핵심 식별자 정리
각 계층은 서로 다른 주소 체계로 통신 대상을 식별합니다. 방화벽 규칙을 설정하거나 장애 원인을 좁힐 때 어느 계층의 식별자를 다루고 있는지 알면 명령어와 도구 선택이 명확해집니다.
| 계층 | 식별자 | 예시 | 담당 장비 |
|---|---|---|---|
| L7 | URL, 호스트명 | https://api.example.com/users | 로드밸런서(L7) |
| L4 | 포트 번호 | :443, :3306 | 방화벽, L4 LB |
| L3 | IP 주소 | 10.0.1.25 | 라우터 |
| L2 | MAC 주소 | aa:bb:cc:dd:ee:ff | 스위치 |
계층별 도구로 장애 좁히기
네트워크 장애가 발생하면 L1부터 L7까지 순서대로 확인하는 것이 기본입니다. 하위 계층이 정상이어야 상위 계층이 동작할 수 있기 때문입니다.
ping은 ICMP Echo Request/Reply를 사용하는 L3 진단 도구입니다.
# 기본 ping (4회)
ping -c 4 8.8.8.8
# 예상 출력
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=3.45 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=3.21 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=118 time=3.67 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=118 time=3.33 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 3.21/3.41/3.67/0.17 ms
출력 해석:
4 received, 0% packet loss→ L3 통신 정상time=3.45 ms→ RTT(왕복 지연 시간), 낮을수록 좋음ttl=118→ 경유한 라우터 수를 역산 가능 (보통 초기값 128 또는 64)
ping 실패 시나리오:
ping -c 4 10.0.1.99
# PING 10.0.1.99: 56 data bytes
# Request timeout for icmp_seq 0
# Request timeout for icmp_seq 1
# --- 10.0.1.99 ping statistics ---
# 4 packets transmitted, 0 packets received, 100% packet loss
→ L1~L3 중 어딘가 문제. 또는 ICMP가 방화벽에서 차단됨.
telnet으로 특정 호스트의 TCP 포트가 열려있는지 확인합니다.
# 80번 포트 연결 테스트
telnet 192.168.1.10 80
# 연결 성공 시:
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
# → 빈 커서가 깜빡임 (HTTP 요청을 기다리는 상태)
# Ctrl+] 후 quit으로 종료
# 연결 실패 시:
Trying 192.168.1.10...
telnet: connect to address 192.168.1.10: Connection refused
# → 포트가 닫혀 있거나 방화벽에서 차단됨
telnet 대신 nc(netcat) 사용:
# nc로 포트 열림 여부 확인 (-z: 연결만 확인, -v: 상세 출력)
nc -zv 192.168.1.10 80
# Connection to 192.168.1.10 80 port [tcp/http] succeeded!
# 타임아웃 설정 (5초)
nc -zvw5 192.168.1.10 443
curl은 HTTP, HTTPS 등 애플리케이션 계층 프로토콜을 직접 테스트합니다.
# HTTP 헤더만 확인 (-I: HEAD 요청)
curl -I http://example.com
# HTTP/1.1 200 OK
# Content-Type: text/html; charset=UTF-8
# Content-Length: 1256
# Server: nginx/1.24.0
# 상세 연결 정보 포함 (-v: verbose)
curl -v https://api.example.com/health
# * Trying 93.184.216.34:443...
# * Connected to api.example.com (93.184.216.34) port 443
# * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
# > GET /health HTTP/2
# < HTTP/2 200
# {"status":"ok"}
# 응답 시간 측정
curl -o /dev/null -s -w \
"연결: %{time_connect}s\nTLS: %{time_appconnect}s\n전체: %{time_total}s\n" \
https://example.com
계층별 장애 진단 플로우
사용자로부터 "웹사이트에 접속이 안 된다"는 신고를 받았습니다. 체계적으로 계층을 좁혀 나가겠습니다.
1단계: 물리/링크 확인 (L1/L2)
# NIC 상태 확인
ip link show
# eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> → UP이면 L1/L2 정상
# 만약 DOWN 상태라면:
# eth0: <BROADCAST,MULTICAST> → 링크 다운, 케이블/포트 확인 필요
2단계: IP 통신 확인 (L3)
# 게이트웨이 ping
ping -c 3 192.168.1.1
# 인터넷 IP ping
ping -c 3 8.8.8.8
3단계: TCP 포트 확인 (L4)
# 웹 서버의 80/443 포트 확인
telnet web-server.example.com 80
nc -zv web-server.example.com 443
4단계: HTTP 응답 확인 (L7)
# HTTP 응답 코드와 헤더 확인
curl -I http://web-server.example.com
curl -v https://web-server.example.com
진단 결과 매트릭스:
| L1/L2 | L3 ping | L4 telnet | L7 curl | 원인 |
|---|---|---|---|---|
| DOWN | 실패 | 실패 | 실패 | 케이블/NIC 문제 |
| UP | 실패 | 실패 | 실패 | 라우팅/방화벽(L3) |
| UP | 성공 | 실패 | 실패 | 포트 차단/서비스 미기동 |
| UP | 성공 | 성공 | 실패 | 애플리케이션 오류 |
| UP | 성공 | 성공 | 성공 | 클라이언트 측 문제 |
ping이 성공하면 L3까지는 정상입니다. 그런데 브라우저에서 접속이 안 된다면?
# 1. ping 성공 확인 (L3 정상)
ping -c 3 web-server.example.com
# 64 bytes from 93.184.216.34: icmp_seq=1 ttl=64 time=2.1 ms ← 성공
# 2. TCP 443 포트 확인 (L4)
nc -zv web-server.example.com 443
# nc: connect to web-server.example.com port 443 (tcp) failed: Connection refused
# 원인 파악: HTTPS 포트(443)가 닫혀 있음
# 가능한 원인:
# a) nginx/apache가 실행 중이지 않음
# b) 방화벽(iptables, 보안그룹)에서 443 차단
# c) 서비스가 443이 아닌 다른 포트에서 실행 중
# 3. 서버에서 서비스 상태 확인
ss -tlnp | grep ':443'
# (아무 출력 없음) → nginx가 실행 중이지 않음
systemctl status nginx
# Active: inactive (dead) ← nginx 중지 상태
교훈: ping 성공 ≠ 서비스 정상. 반드시 L4(포트), L7(응답) 확인까지 해야 합니다.
심화 — '하위 계층 OK'가 거짓말을 할 때
심화: ping은 되는데 큰 응답만 멈춘다 — MTU/MSS와 PMTU 블랙홀
계층 사다리(ping→nc→curl)는 '아래가 되면 아래는 배제한다'는 전제로 돌아갑니다. 그런데 이 전제는 각 테스트가 같은 경로·같은 크기의 패킷을 검사할 때만 참입니다. ping과 nc가 통과했는데도 큰 데이터만 멈추는 순간, 그 전제가 무너집니다.
- 테스트마다 패킷 크기가 다릅니다: ping은 기본적으로 작은(56바이트) 패킷을 보내고, nc -z는 TCP 핸드셰이크만 하고 페이로드를 보내지 않습니다. 둘 다 'MSS로 꽉 찬 큰 세그먼트'를 한 번도 보내지 않으므로, 큰 패킷에서만 나는 문제를 원리적으로 못 잡습니다.
- MTU와 MSS: 이더넷 링크의 MTU는 보통 1500바이트입니다. TCP는 핸드셰이크에서 로컬 MTU를 기준으로 MSS를 협상합니다. 그런데 경로 중간에 MTU가 더 작은 링크(VPN·터널·PPPoE 등)가 있으면, 로컬 기준으로 만든 큰 세그먼트가 그 링크를 통과하지 못합니다.
- PMTU 블랙홀: 원래는 그 라우터가 ICMP 'Fragmentation Needed'(Type 3 Code 4)로 '더 작게 보내라'고 알려주고(Path MTU Discovery), 송신자가 세그먼트를 줄입니다. 하지만 방화벽이 이 ICMP를 막으면 송신자는 영영 모른 채 큰 세그먼트만 반복 재전송하다 멈춥니다 — 이것이 PMTU 블랙홀입니다.
- 그래서 증상이 '크기 의존적'입니다: 핸드셰이크·작은 API 응답은 통과하고, 큰 본문·파일 다운로드·업로드만 멈춥니다. '하위 계층 OK'로 보이지만 실제로는 L3/L4 경계의 MTU 문제입니다.
정리하면, 계층 진단 사다리에 크기를 인식하는 테스트(큰 패킷 ping, 큰 객체 curl)를 한 칸 더 두어야 ping·nc가 숨기는 MTU 문제를 드러낼 수 있습니다.
상황: 새로 연결한 VPN 너머 서버로 접속합니다. ping 성공, nc -zv 대상 443 성공, curl -I(HEAD)도 200. 그런데 curl로 실제 페이지(큰 본문)나 파일을 받으면 일부만 오다 멈춰 타임아웃됩니다. 작은 API 응답은 되는데 큰 응답만 실패합니다.
원인: 경로 중간 링크의 MTU가 1500보다 작은데(VPN·터널·PPPoE 등) Path MTU Discovery가 동작하지 않았습니다. TCP 핸드셰이크와 작은 패킷은 통과하지만, MSS로 꽉 찬 큰 데이터 세그먼트는 DF 비트 때문에 중간 라우터에서 드롭됩니다. 라우터가 보내는 ICMP Fragmentation Needed(Type 3 Code 4)를 방화벽이 막으면 송신자가 크기를 줄일 계기를 잃습니다(PMTU 블랙홀). ping(작은 패킷)과 nc -z(페이로드 없음)는 이 문제를 건드리지 않아 '하위 계층 OK'로 보였던 것입니다.
진단: DF 비트를 세워 큰 패킷으로 ping합니다 — ping -M do -s 1472 대상. 1472+28=1500바이트에서 Message too long이나 무응답이면 경로 MTU가 1500 미만입니다. -s 값을 1372 등으로 줄여가며 통과하는 최대 크기를 찾으면 실제 경로 MTU를 역산할 수 있습니다. tcpdump로 보면 큰 세그먼트 이후 응답 없이 재전송만 반복됩니다.
해결: 원인 인터페이스·터널의 MTU를 실제 경로에 맞춰 낮추거나(ip link set dev tun0 mtu 1400), 방화벽이 ICMP Type 3 Code 4를 통과시키도록 열어 PMTUD가 동작하게 합니다. 임시로는 TCP MSS 클램핑(iptables ... --clamp-mss-to-pmtu)으로 세그먼트 크기를 경로에 맞춥니다. '작은 건 되는데 큰 것만 안 된다'는 거의 항상 MTU/MSS 신호라는 것을 기억하면 진단이 빨라집니다.
실전 진단 스크립트
자주 사용하는 계층별 진단 명령어를 정리합니다.
#!/bin/bash
# 네트워크 계층별 진단 스크립트
TARGET="example.com"
TARGET_IP="93.184.216.34"
echo "=== L1/L2: 네트워크 인터페이스 상태 ==="
ip link show | grep -E "^[0-9]+:|state"
echo ""
echo "=== L3: IP 통신 (ping) ==="
ping -c 3 -W 2 $TARGET_IP && echo "L3 정상" || echo "L3 실패"
echo ""
echo "=== L3: 라우팅 경로 ==="
ip route get $TARGET_IP
echo ""
echo "=== L4: TCP 포트 확인 ==="
for PORT in 80 443; do
nc -zvw3 $TARGET $PORT 2>&1 && echo "Port $PORT: 열림" || echo "Port $PORT: 닫힘"
done
echo ""
echo "=== L7: HTTP 응답 ==="
curl -s -o /dev/null -w "HTTP 상태: %{http_code}, 시간: %{time_total}s\n" \
http://$TARGET
echo ""
echo "=== L7: HTTPS 응답 ==="
curl -s -o /dev/null -w "HTTPS 상태: %{http_code}, TLS: %{time_appconnect}s\n" \
https://$TARGET
실제 업무에서 OSI 계층 모델은 다음과 같이 활용됩니다.
온콜 장애 대응 시:
새벽 2시, 모니터링 알람 — "API 서버 응답 없음"
1. L3 확인: ping → 성공 (서버는 살아있음)
2. L4 확인: nc -zv api-server 8080 → 실패
3. 결론: 애플리케이션 프로세스가 죽었거나 포트가 닫힘
4. 조치: systemctl restart api-server
ACL(방화벽 규칙) 요청 시: 팀원이 "방화벽 열어주세요"라고 요청할 때, 계층을 명확히 해야 합니다:
- L3: 어떤 소스 IP → 어떤 목적지 IP
- L4: 어떤 프로토콜(TCP/UDP), 어떤 포트
- L7: 특정 URL 패턴 (L7 방화벽/WAF의 경우)
인프라 문서 작성 시:
"L4 로드밸런서", "L7 라우팅", "L2 스위치" 같은 용어를 정확히 사용하면 동료와의 소통이 명확해집니다.
면접에서 자주 나오는 질문:
- "HTTPS 통신에서 각 계층이 하는 역할을 설명해보세요."
- "L4 LB와 L7 LB의 차이는 무엇인가요?"
- "ping은 성공하는데 서비스 접속이 안 될 때 어떻게 디버깅하시나요?"
요약
| 개념 | 핵심 내용 |
|---|---|
| OSI 7계층 | L1(물리)~L7(애플리케이션)으로 통신을 표준화한 참조 모델 |
| TCP/IP 4계층 | OSI를 실용화한 실제 인터넷 프로토콜 스택 |
| L2 식별자 | MAC 주소 — 같은 LAN 내 통신 |
| L3 식별자 | IP 주소 — 라우팅을 통한 네트워크 간 통신 |
| L4 식별자 | 포트 번호 — 프로세스/서비스 구분 |
| L7 식별자 | URL, 호스트명 — 애플리케이션 수준 통신 |
| ping | ICMP, L3 검증 도구 |
| telnet/nc | L4 TCP 포트 열림 여부 확인 도구 |
| curl | L7 HTTP/HTTPS 응답 확인 도구 |
| 장애 진단 원칙 | 하위 계층(L1)부터 순서대로 확인하며 범위를 좁힘 |
명령어·단축키 빠른 참조
이 모듈은 개념 모듈이므로, 각 계층에서 장애를 좁힐 때 쓰는 대표 진단 명령만 모았습니다.
| 명령어(계층) | 용도 | 자주 쓰는 예 |
|---|---|---|
ip link show (L1/L2) | 인터페이스 UP/DOWN·MTU 확인 | ip link show eth0 |
arp -n (L2) | 같은 LAN의 MAC 학습 확인 | arp -n |
ping -c <N> (L3) | IP 도달성(ICMP) 검증 | ping -c 4 8.8.8.8 |
ip route get <IP> (L3) | 목적지로 나가는 경로 확인 | ip route get 8.8.8.8 |
nc -zv <host> <port> (L4) | TCP 포트 열림 확인 | nc -zv 192.168.1.10 443 |
telnet <host> <port> (L4) | 포트 연결 수동 확인 | telnet 192.168.1.10 80 |
ss -tlnp (L4) | 로컬 리스닝 포트 확인 | ss -tlnp | grep :443 |
curl -I <url> (L7) | HTTP 응답·헤더 확인 | curl -I http://example.com |
ping -M do -s 1472 <host> (심화) | 경로 MTU(단편화 금지) 확인 | ping -M do -s 1472 대상 |
관련 모듈로 더 깊이:
- ping과 ICMP 프로토콜을 이용한 초동 경로 진단 — L3 도달성을 검증하는 ICMP 도구로 계층 진단을 실습
- telnet과 nc(netcat) 명령어로 L4 포트 통신 상태 점검 — L4 포트가 열렸는지 확인하며 계층 경계를 체감
- 웹 서버에서 DB 접속 실패 시 원인 격리 프로세스 — 하위 계층부터 좁혀가는 장애 고립 방법론
다음 챕터에서는 L3의 핵심인 **IP 주소 체계와 서브네팅(CIDR)**을 학습합니다.