OSI와 요청의 계층
70분 안팎
학습 목표
학교 웹 요청의 Ethernet·IP·TCP·HTTP 캡슐화 순서를 표로 작성합니다.
개념
학교 자료실 요청을 네 가지 질문으로 나눕니다
학생 s1이 학교 자료실에서 시간표를 열었는데 화면이 멈췄다고 합니다. 현장에서 먼저 해야 할 일은 라우터를 재시작하는 것이 아니라 요청이 어느 구간까지 진행됐는지 구분하는 것입니다. 케이블 연결, 목적지까지의 경로, TCP 연결, HTTP 응답은 서로 다른 증거입니다. 이 레슨에서는 같은 요청을 계층별로 나누어 이후 주소표와 전달 그림에서 어떤 필드를 기록할지 결정합니다.
학교 요청의 끝점은 학생 단말 s1과 server1입니다. HTTP는 요청 방법과 경로 같은 애플리케이션 의미를 다룹니다. TCP는 포트로 양 끝의 통신을 구별하고 바이트 스트림을 전달합니다. IPv4는 출발지와 목적지 주소 및 전달에 필요한 정보를 가집니다. Ethernet은 지금 연결된 구간에서 다음 장비까지 프레임을 전달합니다. 주소를 하나만 적으면 어느 계층의 주소인지 불분명해지므로 IP와 MAC 열을 나누어 기록합니다.
이번 모듈은 첫 모듈의 s1·s2·t1·server1·guest1·r1 식별자를 계속 사용합니다. Python 예제는 계산과 표 생성만 하고 패킷을 보내지 않습니다. 따라하기 코드는 example.py에 저장하고 python3 example.py로 실행합니다. 각 단계는 파일 내용을 바꿔 독립적으로 실행합니다. 브라우저에서는 표준 입력을 읽고 결과만 표준 출력으로 보냅니다. Linux 로컬 압축은 새 폴더에 풀고 전용 VM에서 실행합니다. 문서 검사 명령과 망 구성 명령을 구분하며 미실행 출력은 빈칸으로 둡니다. 다음 레슨들은 이 공통 환경을 전제로 주제별 계산과 관측만 다룹니다.
OSI를 관찰 항목에 대응합니다
OSI의 물리 계층은 신호와 매체, 데이터 링크 계층은 같은 링크의 프레임, 네트워크 계층은 망 사이 패킷 전달, 전송 계층은 끝점 간 전송을 설명하는 틀입니다. 세션·표현·응용 계층은 대화 관리와 표현 및 응용 기능을 구분합니다. 실제 TCP/IP 구현에서 이 일곱 구분이 각각 독립 프로세스나 고정 헤더로 존재한다고 가정하지 않습니다. 웹 프로그램 안에 여러 기능이 함께 들어갈 수 있습니다.
학습 표에서는 Ethernet을 링크, IPv4를 네트워크, TCP를 전송, HTTP를 응용의 관찰 대상으로 놓습니다. OSI의 용어를 사용해도 모든 프로토콜을 억지로 한 칸에만 넣을 필요는 없습니다. 예를 들어 TLS는 웹 데이터의 보호와 인증을 제공하지만 이번 평문 HTTP 실습에서는 아직 사용하지 않습니다. 보안 연결은 뒤의 이름·주소 서비스 레슨에서 다룹니다. 현재 그림에 TLS 성공을 표시하지 않습니다.
물리 계층이 정상이라는 증거와 포트에 IP가 있다는 사실도 다릅니다. 주소를 파일에 적어 놓은 것만으로 인터페이스가 실제로 올라온 것은 아닙니다. 링크 상태와 주소 설정을 따로 확인합니다. 가상 veth는 물리 케이블 대신 커널 안의 연결을 모델링합니다. 가상 링크 성공을 실제 스위치의 케이블 품질이나 전기적 상태 검사로 보고하지 않습니다. 관측 대상의 이름과 공간을 표 첫 열에 적습니다.
캡슐화는 데이터에 전달 정보를 더하는 과정입니다
발신 측은 HTTP 요청 바이트를 TCP에 넘기고, TCP 세그먼트는 IP 패킷 안에, IP 패킷은 Ethernet 프레임 안에 실립니다. 수신 측은 각 층의 정보를 해석해 내부 데이터로 진행합니다. 도식은 Ethernet[IP[TCP[HTTP]]]로 그립니다. 대괄호는 포함 관계를 표현하는 표기이며 네 종류가 모두 사람이 읽을 수 있는 문자열로 전송된다는 뜻은 아닙니다. 헤더의 상세 바이트 표현은 서재에서 더 읽습니다.
HTTP 요청 하나와 TCP 세그먼트 하나가 항상 일대일로 대응하지 않습니다. 요청은 여러 세그먼트로 나뉠 수 있고 수신 프로그램은 다시 바이트 스트림으로 읽습니다. 이번 표의 한 줄은 요청을 설명하는 논리적 예시입니다. 패킷 개수나 전송 크기를 예측하는 표가 아닙니다. 실제 캡처에서 TCP 조각을 보고 HTTP 요청이 여러 번 실행됐다고 판단하면 재전송과 분할을 혼동할 수 있습니다.
출발지 포트 41010은 s1의 이 예시 연결을 구분하는 값이고 목적지 TCP 80은 프로젝트의 평문 웹 대상입니다. 포트가 80이라는 사실만으로 실제 웹 서버가 실행 중이라고 말할 수 없습니다. 목적지 IP는 server1의 위치를 표시하고 목적지 MAC은 현재 링크의 전달 상대를 표시합니다. 같은 이름의 destination 열을 두 계층에서 공유하지 않고 tcp_destination_port, ip_destination, ethernet_destination으로 나눕니다.
라우터를 지나며 무엇이 바뀌는지 씁니다
s1이 다른 /24의 server1으로 보낼 때 첫 프레임의 목적지 MAC은 게이트웨이 r1의 학생망 인터페이스입니다. 프레임 안 IP 목적지는 server1입니다. r1은 받은 Ethernet 포장을 벗겨 IP 경로를 판단한 뒤 서버망용 새 Ethernet 프레임을 만듭니다. NAT가 없는 이번 구성에서는 출발지·목적지 IP는 유지되고 IPv4 TTL이 감소합니다. 헤더 전체가 한 바이트도 바뀌지 않는다고 쓰지 않습니다.
같은 학생망의 s2로 보내면 연결된 경로를 사용하고 프레임 목적지는 s2의 MAC입니다. 스위칭을 하는 브리지는 그 프레임을 같은 링크 영역에서 전달합니다. IP 라우터를 거치지 않는 학생 간 전달에서 브리지가 TTL을 감소시킨다고 표시하면 계층을 혼동한 것입니다. 다만 같은 IP 대역이라는 계산만으로 실제 같은 링크에 연결돼 있다고 확정하지 않습니다. 이번 실습은 두 학생 포트를 브리지로 연결하는 조건을 명시합니다.
응답은 방향을 바꾸어 따로 그립니다. server1이 s1으로 응답할 때 서버망 게이트웨이 MAC을 찾고 IP 목적지는 s1이 됩니다. 최초 요청의 Ethernet 프레임이 뒤집혀 학교 전체를 돌아오는 것으로 그리지 않습니다. 다음 홉과 프레임은 링크마다 정해집니다. 요청이 서버에 도착했더라도 응답 경로가 없으면 이용자는 실패를 봅니다. 표에는 요청과 응답 두 행씩을 넣어 왕복을 검토합니다.
증거보다 넓은 결론을 내리지 않습니다
TCP 연결을 확인했는데 HTTP 상태 404가 왔다면 해당 연결을 통해 응용 응답을 받은 것입니다. 그 응답은 요청한 자원이 없다는 응용 결과이며 케이블 단선 증거가 아닙니다. 반대로 연결 시간 초과는 방화벽·경로·상대 프로세스·응답 경로 등 여러 원인이 가능해 계층 하나를 바로 확정하지 않습니다. 실패가 나타난 단계와 원인을 구별하면 신입의 조사 보고서가 훨씬 정확해집니다.
HTTP와 IP의 내용을 표에 섞는 실수는 검사기로 일부 잡을 수 있습니다. URL 경로 /timetable은 응용 데이터이고 10.20.30.11은 네트워크 주소입니다. MAC을 서버 IP 칸에 넣으면 경로를 계산할 수 없고 IP를 MAC 칸에 넣으면 링크 전달 그림이 모호해집니다. 따라하기에서는 계층 목록과 포함 순서를 출력해 표 틀을 만든 뒤 수동으로 각 값이 어떤 질문에 답하는지 적습니다.
제출 전 동료가 표만 보고 발신 단말·최종 서버·첫 전달 상대를 각각 찾을 수 있는지 확인합니다. 실습 제출물은 외운 일곱 이름 목록이 아니라 요청과 응답의 계층 표입니다. 학교 서비스 요구 여덟 행 중 student/web을 선택하고 현재 구현 여부는 별도 주석으로 남깁니다. 전체 프로토콜 비교와 MTU의 영향은 연결된 서재로 보내고 여기서는 주소 역할과 캡슐화 순서를 설명하는 데 집중합니다.
따라하기
계층별 필드 틀 만들기
Python 3에서 다음 코드를 실행하고 계산 근거를 기록합니다.
for layer, field in [('Ethernet','destination MAC'),('IPv4','destination IP'),('TCP','destination port'),('HTTP','method and path')]:
print(layer + ': ' + field)실행 결과
Ethernet: destination MAC IPv4: destination IP TCP: destination port HTTP: method and path
캡슐화 순서 만들기
Python 3에서 다음 코드를 실행하고 계산 근거를 기록합니다.
payload='HTTP'
for layer in ['TCP','IPv4','Ethernet']:
payload=layer+'['+payload+']'
print(payload)실행 결과
Ethernet[IPv4[TCP[HTTP]]]
첫 홉과 최종 목적지 분리
Python 3에서 다음 코드를 실행하고 계산 근거를 기록합니다.
request={'ip_destination':'10.20.30.11','ethernet_peer':'r1 student interface','tcp_port':80}
for key,value in request.items():
print(key, value)실행 결과
ip_destination 10.20.30.11 ethernet_peer r1 student interface tcp_port 80
왕복 표 완성
s1에서 server1, server1에서 s1의 두 방향을 그립니다. 각 방향에서 첫 Ethernet 상대와 최종 IP 목적지를 별도 열에 씁니다. r1 이후의 새 프레임과 TTL 감소를 표시하고 미관측 값을 실제 MAC으로 꾸미지 않습니다.
확인 문제
실습
student/web 요구를 골라 Ethernet·IPv4·TCP·HTTP 계층과 관찰 필드를 표로 제출합니다. s1↔server1의 요청·응답 각각에서 첫 홉 MAC 상대, 최종 IP 목적지, TCP 목적지 포트와 HTTP 요청 경로를 구분합니다. r1에서 새 프레임과 TTL 감소를 표시합니다. 같은 망 s1↔s2 그림도 덧붙이고 “같은 /24이며 같은 브리지” 조건을 명시합니다. 평가 기준은 캡슐화 포함 순서, 계층별 필드 분리, 요청·응답 왕복, 실제 관측과 설계값의 구분입니다.
더 읽기
면접 질문
- 같은 서브넷과 다른 서브넷으로 통신하는 흐름을 설명합니다.