01 · 메시지에 주소 붙이기

메시지는 주소를 겹겹이 붙여 보냅니다.

택배 상자에 주소표를 붙이듯, 인터넷 메시지에도 받을 프로그램·목적 컴퓨터·다음 장비의 주소표를 붙입니다. 아래에서 다섯 장면만 넘겨보세요.

이것만 기억하세요보낼 때 주소표를 붙이고
받을 때 반대로 뗀다

아래 파란 버튼만 누르세요

내용에 주소표를 붙여 보내는 5장면

  1. 1내용 준비
  2. 2주소 포장
  3. 3신호 전송
  4. 4포장 열기
  5. 5내용 도착
준비
“SET user:1 kim”를 보낼 준비가 됐어요

아래 ‘포장 시작’을 누르면 복잡한 네트워크 과정을 다섯 장면으로 보여드려요.

보낼 메시지
시작 전
내 컴퓨터192.168.0.10Redis 서버192.168.0.20 : 6379
"SET user:1 kim" 명령이 준비됐어요.보내기를 누르면 이 명령이 어떻게 포장되는지 한 단계씩 보여드려요.

이유 세 가지만

계층을 나눠 놓은 이유

01역할이 나뉘어 있어요.

먼 길 찾기는 IP 주소가, 문 앞 배달은 MAC 주소가, 프로그램 구분은 포트가 맡아요.

02한 층만 바꿔도 돼요.

와이파이를 유선으로 바꿔도(L1·L2) 그 위의 IP·TCP·프로그램은 그대로 동작해요.

03문제를 층별로 좁혀요.

선이 빠졌는지, 주소가 틀렸는지, 프로그램이 죽었는지 층을 따라가며 찾을 수 있어요.

내용 만들기주소표 붙이기신호로 전송주소표 떼기내용 읽기
규격 기반 시뮬레이션입니다.

이 페이지는 실제 패킷 캡처가 아니라 TCP·IP·이더넷 규격의 헤더 구성을 따라 만든 교육용 시뮬레이션입니다. 순서 번호·체크섬 같은 계산 필드는 고정 예시값이고, IP·MAC 주소는 사설 대역의 예시값입니다. 실제 통신에는 3-way handshake, TLS 암호화, 라우팅 등 더 많은 단계가 있습니다.

참고: RFC 791 (IP) · RFC 9293 (TCP) · IEEE 802.3 (Ethernet) · Redis RESP 규격

이 데모에 대하여

명령 하나가 왕복하는 22단계를 펼칩니다

고른 명령이 내려가면서 포장을 네 겹 얻고, 회선을 건너고, 올라가면서 그 포장을 한 겹씩 잃는 과정을 단계별로 보여줍니다. 요청 11단계와 응답 11단계를 합쳐 22단계이고, 각 단계마다 그 시점에 붙어 있는 헤더 전부와 가장 안쪽 데이터가 함께 계산돼 있습니다. 계층을 정지된 그림 한 장으로 설명하는 자료는 많지만, 그 그림만으로는 헤더가 언제 붙고 언제 떨어지는지가 잡히지 않습니다. 계층을 그림으로 설명하는 자료는 많지만, 같은 데이터가 단계마다 어떤 모습인지를 붙였다 떼며 확인할 수 있는 형태로 만든 것이 이 화면의 목적입니다.

  1. SET · GET · DEL 중 하나를 고릅니다. 명령에 따라 실려 가는 바이트가 달라집니다.
  2. 내려가는 네 단계에서 상자가 한 겹씩 늘어나는 것을 봅니다.
  3. 각 헤더의 필드를 눌러 그 값이 무엇을 뜻하는지 확인합니다.
  4. 회선을 건너는 단계에서 포장이 더 늘지도 줄지도 않는다는 점을 봅니다.
  5. 올라가는 네 단계에서 상자가 바깥부터 하나씩 벗겨지는 순서를 확인합니다.
  6. 응답이 돌아올 때 출발지와 목적지가 뒤바뀌어 있는지 비교합니다.
  7. 명령을 바꿔 가장 안쪽 바이트가 규격에 맞게 다시 계산되는지 확인합니다.
  8. 같은 데이터가 단계마다 세그먼트 · 패킷 · 프레임으로 불리는 것을 따라가 봅니다.

화면이 실제로 계산하는 값들

01

가장 안쪽 데이터는 진짜 규격으로 인코딩합니다.

화면 맨 안쪽에 보이는 바이트는 설명용으로 적어 둔 글자가 아니라, Redis 가 실제로 쓰는 형식에 맞춰 코드가 만들어 낸 것입니다. 명령 토큰 개수를 앞에 적고 각 토큰마다 길이와 내용을 붙이는 규칙을 그대로 구현했고, 길이를 셀 때는 글자 수가 아니라 UTF-8 바이트 수를 셉니다. 그래서 명령을 바꾸면 안쪽 바이트도 규격에 맞게 함께 바뀝니다.

02

일곱 계층 중 넷만 헤더를 붙입니다.

계층 목록에는 일곱 개가 다 나오지만, 실제로 포장이 생기는 것은 네 곳입니다. 표현 계층과 세션 계층은 이 예제에서 별도 헤더로 나타나지 않으며 화면에서도 그렇게 표시해 두었습니다. 교과서의 일곱 칸과 실제 인터넷 프로토콜이 일대일로 대응하지 않는다는 점을 감추지 않고 드러내는 편이, 나중에 실제 패킷을 봤을 때 덜 혼란스럽습니다.

03

각 계층이 붙이는 주소가 서로 다릅니다.

전송 계층은 어느 프로그램인지를 포트 번호로, 네트워크 계층은 어느 컴퓨터인지를 IP 주소로, 데이터링크 계층은 바로 다음 장비가 누구인지를 하드웨어 주소로 적습니다. 세 주소가 가리키는 대상의 범위가 다르다는 것이 계층을 나누는 이유이고, 화면에서 세 헤더를 동시에 펼쳐 볼 수 있게 한 것도 그 차이를 나란히 확인하라는 뜻입니다.

04

TTL 은 무한 순환을 막는 장치입니다.

네트워크 계층 헤더에 들어 있는 64 는 이 패킷이 지날 수 있는 장비 수의 상한입니다. 라우터를 지날 때마다 하나씩 줄고 0 이 되면 버려지므로, 경로 설정이 잘못돼 패킷이 원을 그리며 돌더라도 영원히 남지 않습니다. 이 값이 어떻게 줄어드는지는 이 화면이 아니라 경로를 다루는 데모에서 단계마다 확인할 수 있습니다.

05

포장을 벗기는 순서는 붙인 순서의 반대입니다.

받는 쪽은 가장 바깥 포장부터 확인합니다. 하드웨어 주소가 내 것인지 보고 떼고, IP 주소가 내 것인지 보고 떼고, 포트 번호를 보고 어느 프로그램에 넘길지 정합니다. 각 단계에서 확인하는 것이 그 계층이 붙인 주소 하나뿐이라, 아래 계층은 위 계층이 무엇을 싣고 있는지 몰라도 자기 일을 할 수 있습니다.

06

왕복을 한 화면에 넣었습니다.

요청만 보여주면 계층이 한 방향으로만 동작하는 것처럼 오해하기 쉽습니다. 응답 11단계를 이어 붙여 두면 같은 절차가 반대 방향으로 한 번 더 일어나고, 그때 출발지와 목적지의 모든 주소가 서로 뒤바뀐다는 것이 눈에 들어옵니다. 명령 하나에 이만큼의 절차가 두 번 필요하다는 점이 이 화면에서 가장 오래 남는 부분입니다.

07

포트 두 개의 성격이 다릅니다.

목적지 포트는 미리 정해진 번호라 보내는 쪽이 알고 있어야 하지만, 출발지 포트는 연결할 때마다 운영체제가 비어 있는 번호를 골라 붙입니다. 응답이 돌아올 때 이 번호를 보고 어느 프로그램에게 줄지 정하기 때문에, 같은 컴퓨터에서 여러 창을 열어도 답이 섞이지 않습니다. 화면에서 두 포트에 각각 다른 설명을 붙여 둔 것이 이 차이를 짚기 위한 것입니다.

08

계층마다 부르는 이름이 달라집니다.

같은 데이터가 전송 계층에서는 세그먼트, 네트워크 계층에서는 패킷, 데이터링크 계층에서는 프레임으로 불립니다. 내용물이 바뀐 것이 아니라 어느 계층의 시점에서 보느냐에 따라 부르는 말이 달라지는 것인데, 이 이름들이 문서에서 섞여 나오면 서로 다른 것처럼 읽히기 쉽습니다. 화면이 단계마다 현재 이름을 함께 표시하는 이유입니다.

예시 값이 섞여 있고, 실제 통신이 아닙니다.

가장 안쪽 데이터는 실제 규격으로 인코딩하지만, 헤더에 들어 있는 순서 번호와 체크섬은 계산한 값이 아니라 자리를 보여주기 위한 예시입니다. IP 주소는 사설 대역, 하드웨어 주소는 문서용 예시 값입니다. 브라우저는 네트워크에 아무것도 보내지 않으며 화면의 모든 값은 계산해 만든 것입니다. 또한 이 예제는 데이터가 한 조각에 담기는 경우만 다루므로 큰 데이터가 여러 조각으로 나뉘는 과정, 조각이 사라졌을 때의 재전송, 암호화가 끼어들 때 포장이 하나 더 늘어나는 상황은 보이지 않습니다. 실제 패킷을 확인하려면 패킷 캡처 도구가 필요하고, 이 화면은 거기서 무엇을 봐야 할지 익히는 용도입니다.

참고 자료Redis 직렬화 프로토콜(RESP) 규격RFC 791 — Internet Protocol (IP 헤더와 TTL)RFC 1918 — 사설 주소 대역

실험을 마쳤다면