infra
Platform

모듈 맵

[Network] OSI 7계층과 TCP/IP 4계층 모델 실무적 관점 분석

0 / 35 완료

펼치기
0 / 35 완료0%

네트워크 트러블슈팅 · 01 / 35

[Network] OSI 7계층과 TCP/IP 4계층 모델 실무적 관점 분석

네트워크 통신의 기본 뼈대인 OSI 7계층과 TCP/IP 모델을 이해하고, 계층별 도구(ping/telnet/curl)로 장애 위치를 좁히는 방법을 배웁니다.

초급451 / 35
🚨INCIDENT ALERT
HIGH

장애 채널에 "네트워크가 안 됩니다"라는 한 줄만 올라왔습니다. 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 사용 가능 여부 확인
ping -c 1 8.8.8.8
netcat(nc) 설치 확인 또는 설치
nc -h 2>&1 | head -1 || sudo apt-get install -y netcat
curl 설치 확인
curl --version | head -1
telnet 설치 확인 또는 설치
telnet 2>&1 | head -1 || sudo apt-get install -y telnet
💡개념

OSI 7계층 모델이란?

서버에 배포한 서비스가 갑자기 안 된다는 신고가 들어왔습니다. 어디서부터 확인해야 할까요? 서버 자체가 살아있는지, 포트가 열려있는지, 애플리케이션이 응답하는지 — 순서 없이 여기저기 찔러보다가 시간만 가는 상황을 막으려면 계층별 사고 프레임이 필요합니다. OSI 7계층 모델이 바로 이 프레임입니다.

OSI 7계층 모델 — L1 물리·L2 데이터링크·L3 네트워크·L4 전송·L5 세션·L6 표현·L7 응용. 장애 시 아래 계층부터(케이블·IP·포트·앱) 순서대로 확인하는 사고 프레임을 제공. "서버가 살아있나(L1-3)→포트 열렸나(L4)→앱 응답하나(L7)"로 범위를 좁힘확대

건물에 비유하면, 전기가 들어오는지(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 연결이 맺어지는 순서를 알면 장애가 어느 계층에서 났는지 한눈에 좁혀집니다.

① 보낼 때 — 계층을 내려가며 헤더를 덧씌운다(캡슐화):

TEXT
[송신 호스트]  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와 상태 변화:

TEXT
클라이언트                                   서버 (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 showUP/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를 실용적으로 단순화: 네트워크 액세스(OSI L1-2)·인터넷(L3, IP)·전송(L4, TCP/UDP)·응용(L5-7, HTTP/DNS). OSI가 개념 학습용이라면 TCP/IP는 실제 프로토콜 스택에 대응확대

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 모델
  • 두 모델 간 매핑을 자유롭게 할 수 있어야 합니다.

계층별 핵심 식별자 정리

각 계층은 서로 다른 주소 체계로 통신 대상을 식별합니다. 방화벽 규칙을 설정하거나 장애 원인을 좁힐 때 어느 계층의 식별자를 다루고 있는지 알면 명령어와 도구 선택이 명확해집니다.

계층식별자예시담당 장비
L7URL, 호스트명https://api.example.com/users로드밸런서(L7)
L4포트 번호:443, :3306방화벽, L4 LB
L3IP 주소10.0.1.25라우터
L2MAC 주소aa:bb:cc:dd:ee:ff스위치

계층별 도구로 장애 좁히기

네트워크 장애가 발생하면 L1부터 L7까지 순서대로 확인하는 것이 기본입니다. 하위 계층이 정상이어야 상위 계층이 동작할 수 있기 때문입니다.

L3 확인 — ping으로 IP 통신 검증

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가 방화벽에서 차단됨.

L4 확인 — telnet으로 TCP 포트 연결 검증

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
L7 확인 — curl로 HTTP 응답 검증

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/L2L3 pingL4 telnetL7 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, 호스트명 — 애플리케이션 수준 통신
pingICMP, L3 검증 도구
telnet/ncL4 TCP 포트 열림 여부 확인 도구
curlL7 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 대상

관련 모듈로 더 깊이:

다음 챕터에서는 L3의 핵심인 **IP 주소 체계와 서브네팅(CIDR)**을 학습합니다.

지식 확인

퀴즈 — 8문제

Q1

같은 서브넷의 서버A(192.168.1.10)→서버B(192.168.1.20) 통신에서 ping은 성공하는데 telnet 3306은 실패합니다. 어느 계층에 문제가 있는 건가요?

Q2

장애 분석 중 서버 A에서 서버 B로 ping은 성공했습니다. 이 결과만으로 확실하게 알 수 있는 것은?

Q3

nginx가 배포됐는데 클라이언트에서 연결이 안 됩니다. 다음 단계별 확인 순서가 올바른 것은?

Q4

클라이언트가 `curl https://api.example.com`을 실행했더니 HTTP 404 응답이 왔습니다. 이 결과가 의미하는 것은?

Q5

팀 채팅에 '10.0.1.20 서버에 접속이 안 된다'는 신고가 왔습니다. 어떤 계층 순서로 확인하겠습니까?

Q6

OSI 7계층과 TCP/IP 4계층의 관계를 가장 정확히 설명한 것은?

Q7

[심화] 어떤 서버로 ping도 되고 nc로 443 핸드셰이크도 성공하는데, 큰 응답을 받는 순간 전송이 멈춰 타임아웃됩니다. '하위 계층은 OK'라는 판단이 이 문제를 놓치는 이유는?

Q8

[심화] '작은 요청은 되는데 큰 응답만 멈추는' MTU 의심 상황에서 경로 MTU가 1500 미만인지 가장 직접적으로 확인하는 방법은?

0 / 8 답변

🧪 실습으로 확인하기

포트는 열렸다는데 왜 안 되지? — ss/netstat/telnet으로 TCP 진단

초급

"포트 8080 열었는데요?"와 "왜 안 돼요?" 사이의 간극을 메우는 실습. ss로 바인딩 상태를 확인하고, telnet/nc으로 원격 연결을 테스트하고, iptables 방화벽을 진단하고, 바인딩 주소(0.0.0.0 vs 127.0.0.1)까지 수정하는 4단계 TCP 포트 진단 플로우를 완성한다.

35📋 4단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요