OSI 7계층
OSI 7계층 모델은 네트워크 통신을 7개의 계층으로 표준화한 참조 모델입니다. 각 계층은 독립적인 역할을 수행하며, 송신 측에서 데이터를 아래 계층으로 내려보내며 헤더를 추가(캡슐화)하고, 수신 측에서는 위 계층으로 올라가며 헤더를 제거(역캡슐화)합니다.
7계층 — Application
응용 계층
사용자와 직접 상호작용하는 계층입니다. HTTP, HTTPS, FTP, SMTP, DNS, SSH 등의 프로토콜이 여기에 속합니다. 데이터 단위는 메시지(Message)이며, 브라우저·이메일 클라이언트·SSH 터미널 등의 애플리케이션이 이 계층을 사용합니다.
6계층 — Presentation
표현 계층
데이터의 형식 변환·암호화·압축을 담당합니다. 송신 측의 데이터 형식을 수신 측이 이해할 수 있는 형식으로 변환합니다. SSL/TLS 암호화, JPEG·MP3 포맷 변환, ASCII·UTF-8 인코딩 변환이 이 계층의 역할로 설명됩니다(실제 프로토콜이 계층에 정확히 대응하지는 않습니다). 현대 TCP/IP에서는 응용 계층에 통합되는 경우가 많습니다.
5계층 — Session
세션 계층
통신 세션의 시작·유지·종료를 관리합니다. 두 호스트 간의 대화를 조율하며, 체크포인트를 두어 긴 전송 중 오류 발생 시 재전송 범위를 최소화합니다. NetBIOS, RPC(Remote Procedure Call)가 대표적 프로토콜입니다.
4계층 — Transport
전송 계층
종단 간(End-to-End) 신뢰성 있는 데이터 전송을 책임집니다. TCP는 연결 지향·신뢰성 보장·흐름 제어·혼잡 제어를 제공하고, UDP는 비연결·빠른 전송을 제공합니다. 포트 번호로 프로세스를 구분하며, 데이터 단위는 세그먼트(TCP) 또는 데이터그램(UDP)입니다.
3계층 — Network
네트워크 계층
서로 다른 네트워크 간의 경로를 결정(라우팅)합니다. IP 주소를 사용해 논리적 주소를 지정하며, 라우터가 이 계층에서 동작합니다. IPv4·IPv6·ICMP가 대표 프로토콜이며(ARP는 2계층과 3계층 사이로 설명하기도 합니다), 데이터 단위는 패킷(Packet)입니다.
2계층 — Data Link
데이터 링크 계층
같은 네트워크 내 노드 간 신뢰성 있는 전송을 담당합니다. MAC 주소로 물리적 주소를 지정하며, 스위치가 이 계층에서 동작합니다. 오류 검출(CRC), 흐름 제어, 프레임 동기화를 수행합니다. 데이터 단위는 프레임(Frame)이며, Ethernet·Wi-Fi·PPP가 대표 프로토콜입니다.
OSI 모델이 나온 배경
OSI 참조 모델은 서로 다른 제조사의 장비와 소프트웨어가 통신할 수 있도록 통신 기능을 7개 계층으로 나눈 모델입니다. ISO가 표준(ISO/IEC 7498-1)으로 정했고 ITU-T도 같은 내용을 X.200으로 권고합니다. 실제 인터넷은 이 모델이 아니라 TCP/IP 구조로 만들어졌지만, 문제를 계층별로 나눠 말하는 공통 언어로 널리 쓰입니다.
숫자로 확인하기
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
OSI 7계층을 설명해 주세요.
물리, 데이터 링크, 네트워크, 전송, 세션, 표현, 응용 순서입니다. 아래 계층일수록 신호와 프레임에 가깝고 위 계층일수록 사용자와 가까운 데이터를 다룹니다. 계층마다 데이터 단위(비트, 프레임, 패킷, 세그먼트)와 대표 장비가 다릅니다.
면접 질문
TCP/IP 4계층과 OSI 7계층의 차이는 무엇인가요?
OSI는 이론적 참조 모델이고 TCP/IP는 실제로 쓰이는 구조입니다. OSI의 5·6·7계층 기능이 TCP/IP의 응용 계층에 합쳐지고 1·2계층이 링크 계층으로 묶입니다.
면접 질문
브라우저에서 주소를 입력하면 각 계층에서 무슨 일이 일어나나요?
응용 계층에서 HTTP 요청을 만들고, 전송 계층에서 TCP 헤더를 붙이고, 네트워크 계층에서 IP 헤더를, 데이터 링크 계층에서 이더넷 헤더와 트레일러를 붙인 뒤 물리 계층으로 비트를 내보냅니다. 수신 측은 반대 순서로 헤더를 벗깁니다.
면접 질문
L4 로드 밸런서와 L7 로드 밸런서의 차이는 무엇인가요?
L4는 IP와 포트 같은 전송 계층 정보로, L7은 HTTP 요청의 경로와 헤더 같은 응용 계층 내용으로 분산합니다. L7은 더 세밀하게 나눌 수 있지만 요청을 해석하는 비용이 듭니다.
실제 시스템에서는
함께 보면 좋은 토픽
참고 자료
Python — 소켓 통신으로 보는 OSI 계층 흐름
import socket import ssl # ── 송신 측 (클라이언트) ────────────────────── # Layer 7 — Application: HTTP 요청 메시지 생성 request = ( "GET / HTTP/1.1\r\n" "Host: example.com\r\n" "Connection: close\r\n\r\n" ) # Layer 4 — Transport: TCP 소켓 생성 (OS가 처리) # socket.SOCK_STREAM = TCP, SOCK_DGRAM = UDP raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Layer 6 — Presentation: TLS 래핑 (암호화) context = ssl.create_default_context() sock = context.wrap_socket(raw_sock, server_hostname="example.com") # Layer 3 — Network: IP 주소로 목적지 지정 # OS가 DNS 조회 → IP 확보 → 라우팅 테이블 참조 sock.connect(("example.com", 443)) # ↑ connect() 시점에 TCP 3-way handshake 발생 # Layer 2 — Data Link: Ethernet 프레임 생성 (NIC/OS) # Layer 1 — Physical: 전기 신호로 변환 (NIC 하드웨어) # Layer 7: 데이터 전송 (하위 계층들이 캡슐화 처리) sock.sendall(request.encode()) # ── 수신 측 (서버) — 역캡슐화 ────────────────────── # Physical → Data Link → Network → Transport → Application # 각 계층이 헤더를 벗겨내고 상위 계층에 전달 response = b"" while chunk := sock.recv(4096): response += chunk sock.close() # 애플리케이션 계층에 도착한 순수 HTTP 응답 print(response.decode()[:200])
Python socket API는 Transport 계층(L4) 위에서 동작합니다.
소켓을 생성하면 OS가 TCP 헤더를 붙이고(L4), IP 헤더를 붙이고(L3), Ethernet 프레임으로 감싸(L2), NIC가 전기 신호로 변환(L1)합니다.
개발자는 Application 계층의 데이터(HTTP 메시지)만 다루며, L1~L4의 캡슐화/역캡슐화는 OS와 하드웨어가 자동으로 처리합니다.
ssl.wrap_socket()은 L6(Presentation) 역할을 합니다. TLS 핸드셰이크로 암호화 키를 교환하고 이후 데이터를 암호화합니다.
connect()를 호출하는 순간 3-way handshake(SYN→SYN-ACK→ACK)가 발생하며 이는 L4 TCP의 연결 수립 과정입니다.
Java — Wireshark 없이 패킷 헤더 직접 파싱
import java.net.*; import java.nio.*; public class OsiLayerDemo { /** * 각 OSI 계층의 헤더 구조를 상수로 표현 * 실제 패킷을 파싱할 때 이 오프셋으로 필드를 추출 */ // Layer 2 — Ethernet 프레임 헤더 (14바이트) static final int ETH_DST_MAC = 0; // 6바이트: 목적지 MAC static final int ETH_SRC_MAC = 6; // 6바이트: 출발지 MAC static final int ETH_TYPE = 12; // 2바이트: 0x0800=IPv4 // Layer 3 — IPv4 헤더 (최소 20바이트) static final int IP_VERSION = 14; // 상위 4비트: 버전(4) static final int IP_TTL = 22; // 1바이트: TTL static final int IP_PROTOCOL = 23; // 1바이트: 6=TCP, 17=UDP static final int IP_SRC = 26; // 4바이트: 출발지 IP static final int IP_DST = 30; // 4바이트: 목적지 IP // Layer 4 — TCP 헤더 (최소 20바이트, IP 헤더 이후) static final int TCP_SRC_PORT = 34; // 2바이트: 출발지 포트 static final int TCP_DST_PORT = 36; // 2바이트: 목적지 포트 (80/443) static final int TCP_SEQ = 38; // 4바이트: 시퀀스 번호 static final int TCP_FLAGS = 47; // TCP 시작(34)+13: SYN=0x02, ACK=0x10, FIN=0x01 (오프셋 46은 Data Offset 바이트) // Layer 7 — HTTP 데이터 시작 위치 (TCP 옵션 없을 때) static final int HTTP_PAYLOAD = 54; // ETH(14)+IP(20)+TCP(20) static void parsePacket(byte[] raw) { ByteBuffer buf = ByteBuffer.wrap(raw); // L2 파싱 short ethType = buf.getShort(ETH_TYPE); boolean isIPv4 = (ethType & 0xFFFF) == 0x0800; // L3 파싱 byte protocol = buf.get(IP_PROTOCOL); boolean isTCP = protocol == 6; // L4 파싱 int dstPort = buf.getShort(TCP_DST_PORT) & 0xFFFF; byte flags = buf.get(TCP_FLAGS); boolean isSyn = (flags & 0x02) != 0; // L7: HTTP 페이로드 (54바이트 이후) if (raw.length > HTTP_PAYLOAD) { String payload = new String(raw, HTTP_PAYLOAD, raw.length - HTTP_PAYLOAD); // "GET / HTTP/1.1\r\nHost: ..." } } }
실제 이더넷 프레임의 바이트 오프셋을 직접 정의했습니다. 패킷 캡처 도구(Wireshark, tcpdump)는 이 구조로 raw 바이트를 파싱해 계층별 필드를 표시합니다.
HTTP 페이로드는 Ethernet(14) + IP(20) + TCP(20) = 54바이트 이후에 위치합니다. TCP 옵션이 있으면 오프셋이 더 뒤로 밀립니다.
TCP flags 바이트에서 비트 마스킹으로 SYN·ACK·FIN을 구분합니다. 3-way handshake는 SYN → SYN+ACK → ACK 순서로 flags가 변합니다.
Java에서 실제 raw 소켓에 접근하려면 JNI 또는 pcap4j 같은 라이브러리가 필요합니다.
일반 socket API는 L4(TCP/UDP)부터만 접근 가능합니다.
Q1
OSI 7계층 모델에서 데이터가 송신 측에서 캡슐화될 때 헤더가 추가되는 방향은?
Q2
OSI 7계층 모델에서 데이터가 송신 측에서 캡슐화될 때 헤더가 추가되는 방향은?
Q3
전송 계층(Transport Layer)의 대표 프로토콜은?
Q4
전송 계층(Transport Layer)의 대표 프로토콜은?
Q5
네트워크 계층(Network Layer)의 주요 역할은?
Q6
네트워크 계층(Network Layer)의 주요 역할은?