🌍 네트워크

OSI 모델

OSI Model

네트워크 통신을 7개 계층으로 구분한 국제 표준 참조 모델. 물리-데이터링크-네트워크-전송-세션-표현-응용 계층으로 구성되어 네트워크 문제 해결과 프로토콜 설계의 기준이 됩니다.

📖 상세 설명

OSI(Open Systems Interconnection) 모델은 1984년 국제표준화기구(ISO)가 발표한 네트워크 통신 표준 참조 모델입니다. 네트워크에서 데이터가 어떻게 전송되는지를 7개의 계층으로 나누어 설명하며, 각 계층은 특정 기능을 담당합니다. 이 모델 덕분에 서로 다른 제조사의 장비들도 표준화된 방식으로 통신할 수 있게 되었습니다.

OSI 모델이 등장하기 전, 네트워크 장비와 프로토콜은 각 제조사마다 달랐고, 호환성 문제가 심각했습니다. IBM의 SNA, Digital의 DECnet 등 독자적인 네트워크 아키텍처들이 난립했죠. OSI 모델은 이러한 혼란을 정리하고, 모든 시스템이 상호 운용될 수 있는 공통 기준을 제시했습니다.

7계층 구조의 핵심 원리는 "캡슐화(Encapsulation)"입니다. 데이터가 상위 계층에서 하위 계층으로 내려갈 때마다 각 계층의 헤더가 추가됩니다. 예를 들어, 응용 계층의 HTTP 데이터는 전송 계층에서 TCP 헤더가, 네트워크 계층에서 IP 헤더가, 데이터 링크 계층에서 이더넷 프레임이 추가됩니다. 수신 측에서는 이 과정이 역순으로 진행됩니다.

실무에서 OSI 모델은 네트워크 문제 해결(트러블슈팅)의 표준 프레임워크로 사용됩니다. "인터넷이 안 돼요"라는 문제를 받으면, 1계층(케이블 연결)부터 7계층(애플리케이션)까지 순서대로 점검하여 문제의 원인을 체계적으로 찾을 수 있습니다. 또한 보안 솔루션, 네트워크 장비, 프로토콜 설계 시 각 계층의 역할을 명확히 구분하는 데 활용됩니다.

🏗️ OSI 7계층 상세

계층 이름 역할 프로토콜/장비
7 응용 (Application) 사용자와 직접 상호작용하는 애플리케이션 서비스 제공 HTTP, HTTPS, FTP, SMTP, DNS
6 표현 (Presentation) 데이터 형식 변환, 암호화/복호화, 압축/해제 SSL/TLS, JPEG, MPEG, ASCII
5 세션 (Session) 통신 세션 설정, 유지, 종료 관리 NetBIOS, RPC, NFS
4 전송 (Transport) 종단간 신뢰성 있는 데이터 전송, 포트 번호 관리 TCP, UDP, 포트 번호
3 네트워크 (Network) 논리적 주소(IP) 지정, 최적 경로 선택(라우팅) IP, ICMP, 라우터
2 데이터 링크 (Data Link) 물리적 주소(MAC) 지정, 프레임 전송, 오류 검출 Ethernet, MAC, 스위치
1 물리 (Physical) 비트 단위 전기 신호 전송, 물리적 연결 케이블, 허브, 리피터

암기 팁: 상위에서 하위로 "All People Seem To Need Data Processing" (7→1), 하위에서 상위로 "Please Do Not Throw Sausage Pizza Away" (1→7)로 외우면 됩니다.

⚖️ OSI vs TCP/IP 모델 비교

실제 인터넷은 OSI 7계층이 아닌 TCP/IP 4계층 모델을 기반으로 작동합니다. OSI 모델은 이론적 참조 모델이고, TCP/IP는 실제 구현된 프로토콜 스택입니다.

OSI 7계층 TCP/IP 4계층 설명
7. 응용
6. 표현
5. 세션
응용 (Application) HTTP, FTP, SMTP, DNS 등
4. 전송 전송 (Transport) TCP, UDP
3. 네트워크 인터넷 (Internet) IP, ICMP, ARP
2. 데이터 링크
1. 물리
네트워크 액세스 (Network Access) Ethernet, Wi-Fi

왜 TCP/IP를 더 많이 쓸까? OSI 모델은 1970년대 후반 설계되어 1984년에 완성되었지만, TCP/IP는 이미 1983년부터 ARPANET에서 실제로 사용되고 있었습니다. TCP/IP가 먼저 표준으로 자리 잡으면서, OSI는 교육과 참조용으로 남게 되었습니다.

💻 코드 예제

# OSI 계층별 패킷 분석 예제 (scapy 사용)
from scapy.all import *

# 패킷 캡처 및 계층 분석
def analyze_packet(packet):
    print("=" * 50)

    # Layer 2: 데이터 링크 계층 (Ethernet)
    if packet.haslayer(Ether):
        eth = packet[Ether]
        print(f"[L2 데이터 링크] MAC: {eth.src} → {eth.dst}")

    # Layer 3: 네트워크 계층 (IP)
    if packet.haslayer(IP):
        ip = packet[IP]
        print(f"[L3 네트워크] IP: {ip.src} → {ip.dst}, TTL: {ip.ttl}")

    # Layer 4: 전송 계층 (TCP/UDP)
    if packet.haslayer(TCP):
        tcp = packet[TCP]
        print(f"[L4 전송] TCP Port: {tcp.sport} → {tcp.dport}")
        print(f"         Flags: {tcp.flags}, Seq: {tcp.seq}")
    elif packet.haslayer(UDP):
        udp = packet[UDP]
        print(f"[L4 전송] UDP Port: {udp.sport} → {udp.dport}")

    # Layer 7: 응용 계층 (HTTP)
    if packet.haslayer(Raw):
        payload = packet[Raw].load.decode('utf-8', errors='ignore')
        if 'HTTP' in payload or 'GET' in payload or 'POST' in payload:
            print(f"[L7 응용] HTTP 요청 감지")
            print(f"         {payload[:100]}...")

# 패킷 캡처 (10개)
# sniff(filter="tcp port 80", prn=analyze_packet, count=10)

# 수동 패킷 생성으로 OSI 계층 이해하기
packet = Ether()/IP(dst="8.8.8.8")/TCP(dport=80)/Raw(b"GET / HTTP/1.1")
print("\n생성된 패킷 구조:")
packet.show()

# 각 계층 크기 확인
print(f"\nL2 (Ethernet): {len(Ether())} bytes")
print(f"L3 (IP): {len(IP())} bytes")
print(f"L4 (TCP): {len(TCP())} bytes")
print(f"전체 패킷: {len(packet)} bytes")
# OSI 계층별 네트워크 진단 명령어

# ===== Layer 1: 물리 계층 =====
# 네트워크 인터페이스 상태 확인
ip link show
ethtool eth0  # 링크 속도, 듀플렉스 확인

# ===== Layer 2: 데이터 링크 계층 =====
# MAC 주소 확인
ip link show | grep ether
arp -a  # ARP 테이블 (IP↔MAC 매핑)

# ===== Layer 3: 네트워크 계층 =====
# IP 주소 및 라우팅 확인
ip addr show
ip route show
traceroute google.com  # 경로 추적
ping -c 4 google.com   # ICMP 연결 테스트

# ===== Layer 4: 전송 계층 =====
# 열린 포트 및 연결 상태 확인
ss -tuln  # TCP/UDP 리스닝 포트
netstat -an | grep ESTABLISHED
# TCP 3-way handshake 확인
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'

# ===== Layer 7: 응용 계층 =====
# HTTP 연결 테스트
curl -I https://google.com  # HTTP 헤더만
curl -v https://google.com  # 상세 연결 정보
# DNS 조회
dig google.com
nslookup google.com

# ===== 통합 진단 =====
# 모든 계층 한번에 점검
mtr google.com  # traceroute + ping 결합

# tcpdump로 패킷 계층별 분석
tcpdump -i eth0 -nn -v 'host google.com' -c 5
# Wireshark 필터로 OSI 계층별 분석

# ===== Layer 2 필터 (데이터 링크) =====
eth.addr == aa:bb:cc:dd:ee:ff    # 특정 MAC 주소
eth.type == 0x0800               # IPv4 패킷만
arp                              # ARP 패킷만

# ===== Layer 3 필터 (네트워크) =====
ip.addr == 192.168.1.1           # 특정 IP
ip.src == 192.168.1.0/24         # 특정 서브넷 출발
ip.ttl < 10                      # TTL 낮은 패킷
icmp                             # ICMP 패킷만

# ===== Layer 4 필터 (전송) =====
tcp.port == 80                   # TCP 80 포트
tcp.flags.syn == 1               # SYN 패킷 (연결 시작)
tcp.flags.rst == 1               # RST 패킷 (연결 리셋)
tcp.analysis.retransmission      # 재전송 패킷
udp.port == 53                   # DNS 쿼리

# ===== Layer 7 필터 (응용) =====
http                             # HTTP 트래픽
http.request.method == "GET"     # GET 요청만
http.response.code == 404        # 404 에러
dns                              # DNS 트래픽
tls.handshake                    # TLS 핸드셰이크

# ===== 복합 필터 예시 =====
# 특정 서버와의 HTTPS 연결 문제 분석
ip.addr == 8.8.8.8 && (tcp.port == 443 || dns)

# TCP 연결 문제 진단
tcp.analysis.flags && !tcp.analysis.window_update

🗣️ 실무에서 이렇게 말하세요

💬 네트워크 장애 대응에서
"일단 OSI 계층별로 점검해봅시다. 1계층부터 보면, 케이블 연결은 정상이고 링크 LED도 켜져 있어요. 3계층 ping은 되는데 4계층 TCP 연결이 안 되네요. 방화벽에서 해당 포트가 막혀 있는 것 같습니다."
💬 보안 솔루션 논의에서
"WAF는 7계층 응용 계층에서 HTTP 트래픽을 분석하고, 일반 방화벽은 3-4계층에서 IP와 포트 기반으로 필터링합니다. SQL Injection 같은 공격을 막으려면 7계층 보안 솔루션이 필요해요."
💬 기술 면접에서
"웹 브라우저에서 URL을 입력하면 7계층 DNS로 도메인 해석 후, 4계층 TCP 3-way handshake로 연결을 맺고, 7계층 HTTP 요청을 보냅니다. 실제로는 TCP/IP 4계층 모델을 쓰지만, 트러블슈팅할 때는 OSI 7계층으로 생각하면 더 체계적입니다."

⚠️ 흔한 실수 & 주의사항

OSI 모델이 실제 인터넷 표준이라고 오해

실제 인터넷은 TCP/IP 모델 기반입니다. OSI는 교육과 트러블슈팅을 위한 참조 모델이지, 실제 구현 표준이 아닙니다.

계층 간 경계를 절대적으로 생각

현실에서는 계층 간 경계가 모호한 경우가 많습니다. TLS는 5-6계층에 걸쳐 있고, HTTP/3의 QUIC은 4-7계층 기능을 통합합니다.

네트워크 문제를 한 계층에서만 찾으려고 함

"핑은 되는데 웹이 안 돼요"라면 3계층은 정상, 4-7계층 문제입니다. 반드시 여러 계층을 체계적으로 점검하세요.

올바른 접근법

트러블슈팅 시 1계층(물리)부터 순서대로 점검. 각 계층별 진단 도구(ping=3계층, telnet=4계층, curl=7계층)를 구분하여 사용하세요.

🔗 관련 용어

📚 더 배우기