본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
AI Generated
2025. 12. 5. · 53 Views
프로토콜과 네트워크 참조 모델 완벽 가이드
네트워크 통신의 기본이 되는 프로토콜의 개념부터 OSI 7계층과 TCP/IP 4계층 모델까지, 초급 개발자가 반드시 알아야 할 네트워크 기초를 쉽게 설명합니다.
목차
1. 프로토콜이란
김개발 씨가 처음으로 백엔드 API를 개발하던 날이었습니다. 프론트엔드 팀에서 "HTTP 프로토콜로 JSON 데이터를 보내주세요"라고 요청했는데, 문득 궁금해졌습니다.
"프로토콜이 정확히 뭐지?"
**프로토콜(Protocol)**은 컴퓨터 간에 데이터를 주고받기 위한 약속된 규칙입니다. 마치 외국인과 대화할 때 서로 영어로 말하기로 약속하는 것처럼, 컴퓨터들도 통신하기 위해 공통된 언어와 규칙이 필요합니다.
프로토콜을 이해하면 네트워크에서 발생하는 다양한 문제를 해결할 수 있습니다.
다음 코드를 살펴봅시다.
# 프로토콜의 개념을 코드로 이해하기
# HTTP 프로토콜을 사용한 간단한 요청 예제
import requests
# HTTP 프로토콜의 규칙에 따라 요청을 보냅니다
# GET: 데이터를 요청하는 메서드 (프로토콜이 정의한 규칙)
response = requests.get("https://api.example.com/users")
# 프로토콜이 정의한 상태 코드로 결과를 확인합니다
# 200: 성공, 404: 찾을 수 없음, 500: 서버 오류
if response.status_code == 200:
data = response.json() # JSON 형식으로 파싱 (또 다른 규칙)
print(f"받은 데이터: {data}")
김개발 씨는 입사한 지 2주 된 신입 개발자입니다. 오늘 처음으로 외부 API와 연동하는 작업을 맡았습니다.
선배가 "HTTP 프로토콜로 통신하면 돼"라고 말했는데, 프로토콜이라는 단어가 어렴풋이 알 것 같으면서도 정확히 뭔지 설명하기 어려웠습니다. 점심시간에 박시니어 씨에게 조심스럽게 물어봤습니다.
"선배, 프로토콜이 정확히 뭔가요?" 박시니어 씨는 웃으며 대답했습니다. "김개발 씨, 외국 여행 가본 적 있어요?
영어권 나라에서는 영어로 말해야 하고, 일본에서는 일본어로 말해야 의사소통이 되잖아요. 프로토콜도 마찬가지예요." 그렇습니다.
프로토콜은 컴퓨터들이 서로 대화하기 위해 정해놓은 약속입니다. 사람들이 언어를 통해 의사소통하듯, 컴퓨터도 프로토콜이라는 공통된 규칙을 따라야 데이터를 주고받을 수 있습니다.
프로토콜이 없던 시절을 상상해봅시다. A 회사에서 만든 컴퓨터는 데이터를 보낼 때 "시작-내용-끝" 순서로 보내고, B 회사 컴퓨터는 "내용-시작-끝" 순서로 받으려고 한다면 어떻게 될까요?
서로 전혀 알아들을 수 없을 것입니다. 이런 혼란을 막기 위해 프로토콜이 탄생했습니다.
프로토콜은 크게 세 가지를 정의합니다. 첫째, **구문(Syntax)**입니다.
데이터의 형식과 구조를 정합니다. 둘째, **의미(Semantics)**입니다.
각 데이터가 무엇을 뜻하는지 정의합니다. 셋째, **타이밍(Timing)**입니다.
언제, 얼마나 빨리 데이터를 보낼지 결정합니다. 위의 코드를 살펴봅시다.
requests.get() 함수는 HTTP 프로토콜의 GET 메서드를 사용합니다. HTTP 프로토콜에서 GET은 "데이터를 달라"는 의미로 약속되어 있습니다.
서버는 이 약속을 알고 있기 때문에 GET 요청을 받으면 데이터를 보내줍니다. response.status_code도 마찬가지입니다.
200이라는 숫자는 HTTP 프로토콜에서 "요청이 성공했다"는 의미로 정해져 있습니다. 전 세계 어떤 서버든 200을 보내면 성공이라는 뜻입니다.
이것이 바로 프로토콜의 힘입니다. 실무에서 자주 접하는 프로토콜은 다양합니다.
웹 브라우저는 HTTP/HTTPS를 사용하고, 이메일은 SMTP, POP3, IMAP을 사용합니다. 파일 전송에는 FTP, 원격 접속에는 SSH나 Telnet이 사용됩니다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 그래서 프로토콜을 맞춰야 통신이 되는 거군요!" 프로토콜을 이해하면 네트워크 프로그래밍의 절반은 이해한 셈입니다.
실전 팁
💡 - 프로토콜은 구문, 의미, 타이밍 세 가지 요소로 구성됩니다
- 웹 개발자라면 HTTP 프로토콜을 가장 먼저 익히세요
2. 프로토콜의 필요성과 역할
김개발 씨가 팀 프로젝트를 진행하면서 API 문서를 작성하고 있었습니다. 프론트엔드 팀원이 물었습니다.
"왜 우리가 정해진 형식대로 데이터를 주고받아야 해요? 그냥 대충 보내면 안 되나요?"
프로토콜은 이기종 시스템 간의 호환성을 보장하고, 통신의 신뢰성을 확보하며, 효율적인 데이터 전송을 가능하게 합니다. 마치 국제 우편에서 주소 작성 규칙이 있어야 전 세계 어디로든 편지가 배달되는 것처럼, 프로토콜이 있어야 다양한 장치들이 문제없이 통신할 수 있습니다.
다음 코드를 살펴봅시다.
# 프로토콜이 필요한 이유를 보여주는 예제
# 표준화된 데이터 형식의 중요성
# 프로토콜 없이 각자 다른 형식으로 보낸다면?
bad_format_1 = "홍길동|25|서울" # A 시스템 방식
bad_format_2 = {"name": "홍길동"} # B 시스템 방식
bad_format_3 = "<user>홍길동</user>" # C 시스템 방식
# 프로토콜(JSON)을 정하면 모두가 이해할 수 있습니다
import json
# 표준화된 JSON 프로토콜 사용
standard_format = {
"name": "홍길동",
"age": 25,
"city": "서울"
}
# 어떤 시스템이든 동일하게 해석 가능
json_string = json.dumps(standard_format, ensure_ascii=False)
print(f"표준 형식: {json_string}")
김개발 씨의 질문에 박시니어 씨가 재미있는 이야기를 들려주었습니다. "옛날에 철도가 처음 생겼을 때 이야기를 해줄게요." 19세기 미국에서 철도가 급속히 발전할 때, 각 철도 회사마다 선로의 폭이 달랐습니다.
A 회사는 폭이 좁은 선로를, B 회사는 넓은 선로를 깔았습니다. 그 결과 어떻게 됐을까요?
기차가 다른 회사 선로를 달릴 수 없었습니다. 승객들은 중간에 내려서 다른 기차로 갈아타야 했습니다.
네트워크도 마찬가지입니다. 프로토콜이 없으면 각 시스템이 제각각 다른 방식으로 통신하게 됩니다.
위의 코드에서 보듯이, A 시스템은 파이프(|)로 구분하고, B 시스템은 JSON을, C 시스템은 XML을 사용한다면 서로 대화가 불가능합니다. 프로토콜의 첫 번째 역할은 상호 운용성(Interoperability) 보장입니다.
삼성 스마트폰이든 애플 아이폰이든, HTTP 프로토콜만 따르면 같은 웹사이트에 접속할 수 있습니다. 제조사가 달라도 상관없습니다.
두 번째 역할은 오류 처리입니다. 프로토콜은 데이터가 손상되거나 유실되었을 때 어떻게 대처할지도 정의합니다.
TCP 프로토콜은 데이터가 제대로 도착했는지 확인하고, 문제가 있으면 재전송합니다. 세 번째 역할은 보안입니다.
HTTPS 프로토콜은 데이터를 암호화하여 중간에서 누군가 훔쳐보지 못하게 합니다. 프로토콜 수준에서 보안이 제공되므로 개발자가 일일이 암호화를 구현할 필요가 없습니다.
네 번째 역할은 효율성입니다. 프로토콜은 데이터를 압축하거나, 필요한 부분만 전송하는 방법을 정의합니다.
네트워크 자원을 효율적으로 사용할 수 있게 해줍니다. 실무에서 API를 설계할 때도 프로토콜의 원리가 적용됩니다.
REST API에서 GET은 조회, POST는 생성, PUT은 수정, DELETE는 삭제라는 의미로 약속되어 있습니다. 이 규칙을 따르면 누구나 API를 쉽게 이해하고 사용할 수 있습니다.
김개발 씨는 이해가 되었습니다. "그러니까 프로토콜은 모두가 따르는 공통 규칙이고, 이게 있어야 서로 다른 시스템이 협력할 수 있는 거군요!"
실전 팁
💡 - 프로토콜 덕분에 제조사가 다른 장치들도 서로 통신할 수 있습니다
- API 설계 시에도 표준 프로토콜 규칙을 따르면 협업이 쉬워집니다
3. OSI 7계층 모델 상세 설명
박시니어 씨가 화이트보드에 7개의 층을 그리기 시작했습니다. "김개발 씨, 네트워크를 제대로 이해하려면 이 OSI 7계층을 알아야 해요.
면접에서도 자주 나오는 주제죠."
OSI(Open Systems Interconnection) 7계층 모델은 국제표준화기구(ISO)에서 만든 네트워크 통신의 표준 모델입니다. 네트워크 통신을 7개의 계층으로 나누어 각 계층이 특정 기능만 담당하게 합니다.
마치 회사에서 부서별로 역할을 나누는 것처럼, 각 계층이 자기 역할에만 집중합니다.
다음 코드를 살펴봅시다.
# OSI 7계층을 코드로 이해하기
# 각 계층의 역할을 클래스로 표현
class OSIModel:
"""OSI 7계층 모델 시뮬레이션"""
layers = {
7: ("응용 계층", "Application", "HTTP, FTP, SMTP"),
6: ("표현 계층", "Presentation", "암호화, 압축, 인코딩"),
5: ("세션 계층", "Session", "연결 설정, 유지, 종료"),
4: ("전송 계층", "Transport", "TCP, UDP"),
3: ("네트워크 계층", "Network", "IP, 라우팅"),
2: ("데이터링크 계층", "Data Link", "MAC 주소, 이더넷"),
1: ("물리 계층", "Physical", "전기 신호, 케이블")
}
@classmethod
def explain(cls):
print("=== OSI 7계층 모델 ===")
for num in range(7, 0, -1):
korean, english, example = cls.layers[num]
print(f"Layer {num}: {korean}({english}) - {example}")
OSIModel.explain()
박시니어 씨가 화이트보드에 7층짜리 건물을 그렸습니다. "네트워크를 7층 건물이라고 생각해봐요.
각 층마다 하는 일이 달라요." **1층 물리 계층(Physical Layer)**은 건물의 기초 공사와 같습니다. 0과 1이라는 디지털 데이터를 전기 신호나 빛 신호로 바꿔서 실제로 전송하는 일을 담당합니다.
랜 케이블, 광케이블, 허브 같은 물리적인 장비가 여기에 해당합니다. **2층 데이터 링크 계층(Data Link Layer)**은 같은 네트워크 안에서 데이터를 안전하게 전달합니다.
MAC 주소를 사용하여 "이 데이터는 옆집 컴퓨터로 가야 해"라고 정확한 목적지를 지정합니다. 스위치가 이 계층에서 동작합니다.
**3층 네트워크 계층(Network Layer)**은 서로 다른 네트워크 간의 통신을 담당합니다. IP 주소를 사용하여 "서울에서 뉴욕까지 어떤 경로로 갈까?"를 결정합니다.
라우터가 이 계층의 대표적인 장비입니다. **4층 전송 계층(Transport Layer)**은 데이터의 신뢰성을 보장합니다.
TCP는 "데이터 잘 받았어?"라고 확인하고, 못 받았으면 다시 보냅니다. UDP는 확인 없이 빠르게 전송합니다.
포트 번호도 이 계층에서 사용됩니다. **5층 세션 계층(Session Layer)**은 통신의 시작과 끝을 관리합니다.
마치 전화 통화를 시작하고 끝내는 것처럼, 데이터 교환의 세션을 설정하고 유지합니다. **6층 표현 계층(Presentation Layer)**은 데이터의 형식을 변환합니다.
암호화, 복호화, 압축, 인코딩 등이 여기서 일어납니다. 서로 다른 시스템이 데이터를 이해할 수 있도록 통역사 역할을 합니다.
**7층 응용 계층(Application Layer)**은 우리가 직접 접하는 부분입니다. 웹 브라우저, 이메일 클라이언트 같은 프로그램이 이 계층에서 동작합니다.
HTTP, FTP, SMTP 같은 프로토콜이 여기에 속합니다. 김개발 씨가 질문했습니다.
"왜 이렇게 복잡하게 나눠놓은 거예요?" 박시니어 씨가 대답했습니다. "각 계층이 독립적이기 때문에, 한 계층을 바꿔도 다른 계층에 영향을 주지 않아요.
예를 들어 랜 케이블을 광케이블로 바꿔도 웹 브라우저는 그대로 동작하잖아요."
실전 팁
💡 - "Please Do Not Throw Sausage Pizza Away"로 순서를 외울 수 있습니다
- 실무에서는 TCP/IP 모델을 더 많이 사용하지만, 면접에서는 OSI 7계층을 자주 물어봅니다
4. TCP/IP 4계층 모델 이해
김개발 씨가 인터넷을 검색하다가 혼란에 빠졌습니다. "어떤 글은 7계층이라 하고, 어떤 글은 4계층이라 하는데 뭐가 맞는 거죠?" 박시니어 씨가 설명을 시작했습니다.
TCP/IP 4계층 모델은 인터넷의 실제 동작 방식을 기반으로 만든 실용적인 모델입니다. OSI 7계층이 이론적인 표준이라면, TCP/IP는 현실에서 실제로 사용되는 프로토콜 스택입니다.
네트워크 액세스, 인터넷, 전송, 응용 계층의 4개 층으로 구성됩니다.
다음 코드를 살펴봅시다.
# TCP/IP 4계층 모델과 실제 프로토콜
# 각 계층에서 사용되는 프로토콜 예시
import socket
class TCPIPModel:
"""TCP/IP 4계층 모델"""
layers = {
4: ("응용 계층", ["HTTP", "HTTPS", "FTP", "SSH", "DNS"]),
3: ("전송 계층", ["TCP", "UDP"]),
2: ("인터넷 계층", ["IP", "ICMP", "ARP"]),
1: ("네트워크 액세스 계층", ["Ethernet", "Wi-Fi"])
}
# 실제 TCP 소켓 프로그래밍 예제
def create_tcp_connection():
# 응용 계층에서 전송 계층(TCP)을 사용
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 인터넷 계층(IP)으로 목적지 지정
server_address = ("example.com", 80)
# 연결 수립 (TCP 3-way handshake)
sock.connect(server_address)
print("TCP 연결 성공!")
sock.close()
박시니어 씨가 커피를 한 모금 마시며 이야기를 시작했습니다. "OSI 7계층이 이론이라면, TCP/IP는 실전이에요.
인터넷이 바로 TCP/IP로 동작하거든요." TCP/IP 모델은 1970년대 미국 국방부에서 시작된 ARPANET 프로젝트에서 탄생했습니다. 실제로 작동하는 네트워크를 만들다 보니 자연스럽게 4개의 계층으로 정리되었습니다.
**1층 네트워크 액세스 계층(Network Access Layer)**은 OSI의 물리 계층과 데이터 링크 계층을 합친 것입니다. 실제 물리적인 네트워크에 데이터를 올려보내는 역할을 합니다.
이더넷, Wi-Fi, 광섬유 등이 여기에 해당합니다. **2층 인터넷 계층(Internet Layer)**은 OSI의 네트워크 계층에 해당합니다.
**IP(Internet Protocol)**가 핵심 프로토콜입니다. 데이터를 패킷으로 나누고, 목적지까지 경로를 찾아 전달합니다.
"인터넷"이라는 이름이 여기서 나왔습니다. **3층 전송 계층(Transport Layer)**은 OSI와 동일합니다.
**TCP(Transmission Control Protocol)**와 **UDP(User Datagram Protocol)**가 대표 프로토콜입니다. TCP는 신뢰성이 중요할 때, UDP는 속도가 중요할 때 사용합니다.
**4층 응용 계층(Application Layer)**은 OSI의 5, 6, 7계층을 합친 것입니다. 사용자가 직접 접하는 프로토콜들이 여기에 속합니다.
HTTP, HTTPS, FTP, SSH, DNS 등이 모두 응용 계층 프로토콜입니다. 위의 코드를 보면, socket.socket()으로 TCP 소켓을 만들 때 내부적으로 이 4개 계층이 모두 관여합니다.
우리가 작성한 코드는 응용 계층이고, SOCK_STREAM은 전송 계층의 TCP를, AF_INET은 인터넷 계층의 IPv4를 사용하겠다는 의미입니다. 김개발 씨가 물었습니다.
"그러면 실무에서는 TCP/IP만 알면 되나요?" 박시니어 씨가 대답했습니다. "네, 대부분 TCP/IP로 충분해요.
하지만 OSI 7계층도 알아두면 네트워크 문제를 분석할 때 유용합니다. 문제가 어느 계층에서 발생했는지 파악하기 쉽거든요."
실전 팁
💡 - TCP/IP는 인터넷의 실제 동작 방식이므로 반드시 이해해야 합니다
- 소켓 프로그래밍을 하면 TCP/IP 계층을 직접 체험할 수 있습니다
5. OSI vs TCP/IP 모델 비교
김개발 씨가 면접 준비를 하면서 질문했습니다. "OSI랑 TCP/IP 차이점을 물어보면 뭐라고 대답해야 해요?" 박시니어 씨가 둘을 나란히 비교해주기 시작했습니다.
OSI 7계층은 이론적인 참조 모델이고, TCP/IP 4계층은 실용적인 구현 모델입니다. OSI가 먼저 나왔지만 너무 복잡했고, TCP/IP는 실제 인터넷 구축 과정에서 자연스럽게 발전했습니다.
둘 다 계층화라는 같은 개념을 사용하지만, 접근 방식이 다릅니다.
다음 코드를 살펴봅시다.
# OSI 7계층과 TCP/IP 4계층 비교
# 각 모델의 계층 대응 관계
comparison = {
"TCP/IP 4계층": {
"응용": ["OSI 7.응용", "OSI 6.표현", "OSI 5.세션"],
"전송": ["OSI 4.전송"],
"인터넷": ["OSI 3.네트워크"],
"네트워크 액세스": ["OSI 2.데이터링크", "OSI 1.물리"]
}
}
# 실무에서의 계층별 문제 해결 예시
def troubleshoot_network_issue(layer):
"""계층별 문제 해결 가이드"""
solutions = {
"물리": "케이블 연결 확인, 랜카드 점검",
"데이터링크": "MAC 주소 확인, 스위치 상태 점검",
"네트워크": "IP 주소 확인, ping 테스트, 라우팅 확인",
"전송": "포트 상태 확인, 방화벽 설정 점검",
"응용": "애플리케이션 로그 확인, 프로토콜 설정 점검"
}
return solutions.get(layer, "알 수 없는 계층")
# 네트워크 문제 발생 시
print(troubleshoot_network_issue("네트워크"))
박시니어 씨가 화이트보드를 반으로 나누어 양쪽에 각각 OSI와 TCP/IP를 그렸습니다. "이 둘의 관계를 이해하면 네트워크 전체가 보여요." 먼저 역사적 배경을 알아봅시다.
OSI 모델은 1984년 ISO에서 발표했습니다. 모든 네트워크가 따라야 할 이상적인 표준을 만들려는 시도였습니다.
하지만 너무 복잡하고 구현하기 어려웠습니다. 반면 TCP/IP는 1970년대부터 미국에서 실제로 사용되고 있었습니다.
ARPANET이라는 군사용 네트워크에서 시작해서 점점 확대되어 오늘날의 인터넷이 되었습니다. 이론보다 실용이 먼저였습니다.
계층 수의 차이를 보면, OSI는 7개, TCP/IP는 4개입니다. TCP/IP가 더 단순합니다.
OSI의 세션, 표현 계층은 실제로는 응용 계층에서 처리되는 경우가 많아서 TCP/IP에서는 하나로 합쳤습니다. 개발 방식의 차이도 있습니다.
OSI는 "먼저 모델을 만들고, 그 다음 구현하자"는 하향식 접근이었습니다. TCP/IP는 "먼저 만들어 쓰면서 정리하자"는 상향식 접근이었습니다.
결과적으로 TCP/IP가 더 실용적이었습니다. 프로토콜과의 관계도 다릅니다.
OSI 모델은 특정 프로토콜에 의존하지 않는 순수한 참조 모델입니다. 반면 TCP/IP 모델은 TCP, IP, HTTP 등 실제 프로토콜을 기반으로 만들어졌습니다.
그렇다면 OSI는 쓸모없는 걸까요? 아닙니다.
네트워크 문제를 분석할 때 OSI의 세분화된 계층 구분이 유용합니다. "이 문제가 물리 계층인가, 데이터 링크 계층인가?"를 구분하면 해결책을 빨리 찾을 수 있습니다.
김개발 씨가 정리했습니다. "OSI는 공부할 때, TCP/IP는 실무에서 쓰는 거군요!" 박시니어 씨가 고개를 끄덕였습니다.
"정확해요. 면접에서는 둘 다 알아야 하고, 실무에서는 TCP/IP 중심으로 생각하면 됩니다."
실전 팁
💡 - 면접에서는 "OSI는 이론적 표준, TCP/IP는 실용적 구현"이라고 답하세요
- 네트워크 문제 해결 시 OSI 계층 개념을 활용하면 원인을 빨리 찾을 수 있습니다
6. 각 계층의 역할과 책임
김개발 씨가 실제 데이터가 어떻게 전송되는지 궁금해졌습니다. "선배, 제가 웹사이트에 접속하면 내부에서 정확히 무슨 일이 일어나는 거예요?" 박시니어 씨가 데이터의 여행을 설명해주기 시작했습니다.
데이터가 네트워크를 통해 전송될 때, 각 계층은 자신만의 역할을 수행합니다. 송신 측에서는 **캡슐화(Encapsulation)**를 통해 각 계층이 헤더를 붙이고, 수신 측에서는 **역캡슐화(Decapsulation)**를 통해 헤더를 벗겨냅니다.
마치 택배 상자 안에 상자를 넣고, 그 안에 또 상자를 넣는 것과 같습니다.
다음 코드를 살펴봅시다.
# 데이터 캡슐화 과정을 시뮬레이션
# 각 계층에서 헤더가 추가되는 과정
class DataTransmission:
"""네트워크 데이터 전송 시뮬레이션"""
def __init__(self, data):
self.data = data
def application_layer(self):
"""응용 계층: HTTP 요청 생성"""
return f"HTTP_HEADER | {self.data}"
def transport_layer(self, app_data):
"""전송 계층: TCP 세그먼트 생성 (포트 번호 추가)"""
return f"TCP(SrcPort:12345, DstPort:80) | {app_data}"
def network_layer(self, segment):
"""네트워크 계층: IP 패킷 생성 (IP 주소 추가)"""
return f"IP(Src:192.168.1.1, Dst:142.250.196.78) | {segment}"
def datalink_layer(self, packet):
"""데이터링크 계층: 프레임 생성 (MAC 주소 추가)"""
return f"Ethernet(MAC) | {packet} | FCS"
def transmit(self):
"""전체 전송 과정"""
app = self.application_layer()
seg = self.transport_layer(app)
pkt = self.network_layer(seg)
frame = self.datalink_layer(pkt)
return frame
tx = DataTransmission("Hello, Server!")
print(tx.transmit())
박시니어 씨가 종이와 봉투 여러 개를 꺼냈습니다. "실제로 보여줄게요.
데이터가 어떻게 포장되는지." 김개발 씨가 웹 브라우저에 "안녕하세요"라고 입력했다고 가정합시다. 이 데이터가 서버까지 어떻게 전달될까요?
먼저 응용 계층에서 HTTP 프로토콜이 데이터를 포장합니다. "GET 요청이고, 내용은 '안녕하세요'야"라는 HTTP 헤더가 붙습니다.
첫 번째 봉투에 편지를 넣은 셈입니다. 다음으로 전송 계층에서 TCP가 이 봉투를 받습니다.
"출발 포트는 12345번이고, 도착 포트는 80번이야. 순서 번호는 1번이야"라는 TCP 헤더가 붙습니다.
더 큰 봉투에 넣은 것입니다. 네트워크 계층에서는 IP가 목적지 주소를 붙입니다.
"출발지 IP는 192.168.1.1이고, 목적지 IP는 142.250.196.78이야"라는 IP 헤더가 추가됩니다. 택배 송장을 붙인 것과 같습니다.
마지막으로 데이터 링크 계층에서 이더넷이 MAC 주소를 붙입니다. "다음 장비의 MAC 주소는 AA:BB:CC:DD:EE:FF야"라는 정보와 함께, 오류 검출을 위한 FCS도 추가됩니다.
이렇게 포장된 데이터는 물리 계층에서 전기 신호로 변환되어 실제로 전송됩니다. 수신 측에서는 반대 과정이 일어납니다.
물리 계층에서 전기 신호를 받으면, 데이터 링크 계층이 MAC 헤더를 확인하고 벗깁니다. 네트워크 계층이 IP 헤더를 확인하고 벗깁니다.
이런 식으로 계속 올라가서 최종적으로 응용 계층에서 "안녕하세요"라는 원본 데이터만 남습니다. 이것이 바로 캡슐화와 역캡슐화입니다.
각 계층은 자기 아래 계층이 어떻게 동작하는지 몰라도 됩니다. HTTP는 TCP가 어떻게 데이터를 나누는지 신경 쓰지 않고, TCP는 IP가 어떻게 경로를 찾는지 신경 쓰지 않습니다.
김개발 씨가 감탄했습니다. "마치 택배 시스템 같네요!
보내는 사람은 내용물만 포장하고, 택배 회사가 알아서 배송하는 것처럼요."
실전 팁
💡 - 캡슐화는 송신 시 헤더 추가, 역캡슐화는 수신 시 헤더 제거입니다
- 각 계층의 데이터 단위: 응용(메시지), 전송(세그먼트), 네트워크(패킷), 데이터링크(프레임)
7. 계층화 모델의 장점
김개발 씨가 마지막 질문을 던졌습니다. "그런데 왜 굳이 이렇게 복잡하게 계층을 나누는 거예요?
그냥 하나로 만들면 더 간단하지 않을까요?"
계층화 모델은 복잡한 네트워크 시스템을 관리 가능한 단위로 분리합니다. 이를 통해 모듈화, 표준화, 유지보수 용이성, 기술 발전의 독립성을 얻을 수 있습니다.
마치 자동차의 엔진, 변속기, 바퀴가 분리되어 있어서 고장 난 부분만 교체할 수 있는 것과 같습니다.
다음 코드를 살펴봅시다.
# 계층화의 장점을 보여주는 예제
# 각 계층이 독립적으로 변경 가능
class NetworkStack:
"""계층화된 네트워크 스택"""
def __init__(self):
# 각 계층은 독립적으로 교체 가능
self.transport = "TCP" # UDP로 변경 가능
self.network = "IPv4" # IPv6로 변경 가능
self.datalink = "Ethernet" # Wi-Fi로 변경 가능
def upgrade_to_ipv6(self):
"""네트워크 계층만 업그레이드"""
# 다른 계층은 변경 없이 네트워크 계층만 변경
self.network = "IPv6"
print(f"업그레이드 완료: {self.network}")
print(f"전송 계층 영향 없음: {self.transport}")
print(f"데이터링크 계층 영향 없음: {self.datalink}")
def switch_to_wifi(self):
"""물리/데이터링크 계층만 변경"""
# Wi-Fi로 바꿔도 상위 계층은 영향 없음
self.datalink = "Wi-Fi"
print("유선에서 무선으로 변경 완료!")
print("애플리케이션은 변경 없이 그대로 동작합니다.")
stack = NetworkStack()
stack.upgrade_to_ipv6()
박시니어 씨가 웃으며 대답했습니다. "좋은 질문이에요.
처음에는 저도 그렇게 생각했거든요." 김개발 씨의 노트북을 가리키며 박시니어 씨가 말했습니다. "지금 유선 랜을 쓰고 있죠?
이걸 Wi-Fi로 바꾸면 웹 브라우저를 다시 설치해야 할까요?" 당연히 아닙니다. 네트워크 연결 방식만 바꾸면 됩니다.
이것이 계층화의 첫 번째 장점, 독립성입니다. 물리 계층이 바뀌어도 응용 계층은 영향을 받지 않습니다.
마치 자동차의 타이어를 바꿔도 에어컨은 그대로 작동하는 것처럼요. 두 번째 장점은 모듈화입니다.
복잡한 시스템을 작은 부분으로 나누면 이해하기 쉬워집니다. 네트워크 엔지니어는 라우팅에만 집중하고, 웹 개발자는 HTTP에만 집중할 수 있습니다.
모든 것을 다 알 필요가 없습니다. 세 번째 장점은 표준화입니다.
각 계층에 표준이 정해져 있으므로, 다른 회사 제품끼리도 호환됩니다. 삼성 노트북과 시스코 라우터가 문제없이 통신하는 이유입니다.
네 번째 장점은 문제 해결 용이성입니다. 네트워크에 문제가 생겼을 때 "어느 계층의 문제인가?"를 먼저 파악합니다.
ping이 안 되면 네트워크 계층 문제, 웹 페이지만 안 열리면 응용 계층 문제입니다. 범위를 좁히면 해결이 빨라집니다.
다섯 번째 장점은 기술 발전의 독립성입니다. IPv4에서 IPv6로 전환해도 TCP는 그대로 사용합니다.
HTTP/2에서 HTTP/3로 업그레이드해도 이더넷은 바뀌지 않습니다. 각 계층이 자기 속도로 발전할 수 있습니다.
위의 코드처럼, 네트워크 스택에서 IPv4를 IPv6로 업그레이드해도 TCP나 이더넷 코드는 건드릴 필요가 없습니다. 이것이 계층화의 힘입니다.
김개발 씨가 감탄했습니다. "이제 왜 계층화가 중요한지 확실히 알겠어요.
복잡함을 단순하게 만드는 방법이었군요!" 박시니어 씨가 마지막으로 덧붙였습니다. "이 계층화 개념은 네트워크뿐만 아니라 소프트웨어 설계 전반에 적용됩니다.
MVC 패턴, 클린 아키텍처도 같은 원리예요. 오늘 배운 걸 잘 기억하세요."
실전 팁
💡 - 계층화 개념은 소프트웨어 아키텍처 전반에 적용되는 중요한 원리입니다
- 네트워크 문제 해결 시 계층별로 접근하면 효율적입니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
vLLM 통합 완벽 가이드
대규모 언어 모델 추론을 획기적으로 가속화하는 vLLM의 설치부터 실전 서비스 구축까지 다룹니다. PagedAttention과 연속 배칭 기술로 GPU 메모리를 효율적으로 활용하는 방법을 배웁니다.
Web UI Demo 구축 완벽 가이드
Gradio를 활용하여 머신러닝 모델과 AI 서비스를 위한 웹 인터페이스를 구축하는 방법을 다룹니다. 코드 몇 줄만으로 전문적인 데모 페이지를 만들고 배포하는 과정을 초급자도 쉽게 따라할 수 있도록 설명합니다.
Sandboxing & Execution Control 완벽 가이드
AI 에이전트가 코드를 실행할 때 반드시 필요한 보안 기술인 샌드박싱과 실행 제어에 대해 알아봅니다. 격리된 환경에서 안전하게 코드를 실행하고, 악성 동작을 탐지하는 방법을 단계별로 설명합니다.
Voice Design then Clone 워크플로우 완벽 가이드
AI 음성 합성에서 일관된 캐릭터 음성을 만드는 Voice Design then Clone 워크플로우를 설명합니다. 참조 음성 생성부터 재사용 가능한 캐릭터 구축까지 실무 활용법을 다룹니다.
Tool Use 완벽 가이드 - Shell, Browser, DB 실전 활용
AI 에이전트가 외부 도구를 활용하여 셸 명령어 실행, 브라우저 자동화, 데이터베이스 접근 등을 수행하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 패턴과 베스트 프랙티스를 담았습니다.