사전 패킷
개념

패킷

gabury1고친 사람 github-actions[bot]

패킷은 긴 데이터를 잘게 나눠 네트워크 너머로 실어 보내는 덩이입니다. 덩이마다 목적지 주소를 붙여 두므로 각각 알아서 길을 찾아갑니다. 받는 쪽은 도착한 덩이를 이어 붙여 원래 데이터로 되돌립니다. 여러 프로토콜이 주고받는 메시지 한 덩이를 부르는 이름으로도 넓게 씁니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 보낼 데이터를 작은 덩이로 나눕니다. 덩이마다 받는 사람 주소를 적어 네트워크에 태웁니다. 사진 파일 하나를 보내도 선 위에는 수백 개의 덩이가 따로따로 지나갑니다.

왜 이렇게 하나 — 큰 데이터를 한 번에 통째로 보내면 그동안 선을 혼자 차지합니다. 잘게 나누면 여러 사람의 덩이가 번갈아 같은 선을 씁니다. 중간 길 하나가 끊겨도 다음 덩이는 다른 길로 돌아갈 수 있습니다.

어떻게 도나

  1. 보내는 쪽이 데이터를 나누고 덩이마다 주소를 붙입니다
  2. 중간 장비가 덩이의 주소만 보고 다음 장비로 넘깁니다
  3. 받는 쪽이 덩이를 모아 원래 데이터로 되돌립니다

대가 — 덩이마다 따로 가니 늦게 오거나 순서가 뒤바뀌거나 사라질 수 있습니다. 이걸 바로잡는 일은 네트워크가 아니라 양 끝의 프로그램이 맡습니다.

상세

이 절은 패킷이 무엇으로 이루어지는지부터 봅니다. 그다음 데이터를 왜 잘라서 보내는지, 중간 장비가 패킷을 어떻게 넘기는지를 따라갑니다.

뒤쪽에서는 이름을 다룹니다. 네트워크 계층마다 덩이를 부르는 이름이 다릅니다. 패킷이라는 말은 네트워크 밖의 프로토콜 메시지까지 가리키기도 합니다. 끝으로 백엔드 코드에서 패킷이 어떻게 보이는지를 짚습니다.

택배를 떠올리면 쉽습니다. 이삿짐을 트럭 한 대에 다 싣는 대신 상자 여러 개에 나눠 담습니다. 상자마다 받는 주소를 붙여 택배로 부칩니다. 상자는 서로 다른 차에 실려 다른 길로 가도 결국 같은 집에 닿습니다.

헤더와 페이로드

패킷 하나는 두 부분으로 나뉩니다. 앞부분이 헤더이고 뒷부분이 페이로드입니다.

헤더는 패킷을 나르는 데 필요한 정보를 적는 부분입니다. 보낸 쪽 주소와 받을 쪽 주소, 패킷 길이, 중간 장비를 몇 대 더 거칠 수 있는지가 들어갑니다. 중간 장비는 페이로드를 열어 보지 않고 헤더만 읽어 패킷을 넘깁니다.

페이로드는 실제로 보내려던 데이터 조각입니다. 택배로 치면 상자 안의 물건입니다. 헤더가 없으면 이 조각이 어디로 가야 하는지 아무도 모릅니다.

헤더의 칸 구성은 프로토콜마다 다릅니다. 그래도 주소와 길이는 거의 언제나 들어 있습니다.

잘라서 보내는 까닭

데이터를 네트워크로 보내는 방식은 크게 둘입니다. 하나는 회선 교환입니다. 옛 전화처럼 통화하는 동안 두 사람 사이에 길 하나를 잡아 두고 혼자 씁니다.

다른 하나가 패킷 교환입니다. 길을 미리 잡지 않습니다. 데이터를 패킷으로 나눠 보내고, 패킷마다 그 순간 갈 수 있는 길로 갑니다. 인터넷은 이 방식으로 돕니다.

패킷 교환이 필요한 까닭은 선을 나눠 쓰기 위해서입니다. 컴퓨터끼리의 통신은 잠깐 몰아서 보냈다가 한참 조용한 일이 많습니다. 길을 잡아 두고 혼자 쓰면 조용한 동안 그 선이 놀게 됩니다. 패킷으로 나누면 여러 사용자의 패킷이 번갈아 같은 선을 탑니다.

고장에도 강해집니다. 중간 장비 하나가 꺼져도 뒤따르는 패킷은 다른 길로 돌아갑니다. 길 하나에 통신 전체가 매달려 있지 않기 때문입니다.

대가도 여기서 나옵니다. 선을 나눠 쓰니 몰리는 순간에는 패킷이 줄을 서서 기다립니다. 줄이 넘치면 장비가 패킷을 버립니다. 버릴 때 아무에게도 알려 주지 않는 것이 보통입니다. 패킷마다 길이 다를 수 있어 먼저 보낸 것이 늦게 도착하기도 합니다.

방식 길을 미리 잡나 선을 나눠 쓰나 도착 순서
회선 교환 잡는다 안 나눈다 보낸 순서대로
패킷 교환 안 잡는다 나눈다 뒤바뀔 수 있다

표의 마지막 칸이 패킷 교환의 대가입니다. 빠진 것을 알아채 다시 받고 뒤바뀐 순서를 되돌리는 일은 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 같은 프로토콜이 맡습니다. 네트워크 중간이 아니라 양 끝 컴퓨터에서 도는 프로토콜입니다.

라우터가 패킷을 넘기는 과정

라우터는 네트워크와 네트워크 사이에서 패킷을 받아 다음 장비로 넘기는 장비입니다. 앞에서 중간 장비라 부른 것이 라우터입니다. 패킷은 목적지까지 라우터를 여러 대 거칩니다. 라우터 하나를 건너는 한 걸음이 홉입니다.

라우터는 목적지까지의 전체 길을 모릅니다. 대신 「이 주소로 가는 패킷은 이 옆 장비로 넘긴다」는 표를 들고 있습니다. 이 표가 라우팅 테이블입니다. 라우터는 패킷이 올 때마다 헤더의 받을 주소를 이 표에 대 봅니다.

flowchart TD
    A["패킷이 들어온다"] --> B["헤더의 받을 주소를 읽는다"]
    B --> C["라우팅 테이블에서 다음 장비를 고른다"]
    C --> D["헤더의 남은 홉 수를 1 줄인다"]
    D --> E{"0 이 됐나"}
    E -->|아니다| F["다음 장비로 내보낸다"]
    E -->|그렇다| G["패킷을 버린다"]

그림 가운데의 「남은 홉 수」가 눈여겨볼 대목입니다. 라우터 설정이 꼬이면 패킷이 같은 라우터들 사이를 끝없이 돌 수 있습니다. 헤더에 건너갈 수 있는 횟수를 적어 두고 한 번 건널 때마다 줄이면, 길을 잃은 패킷도 언젠가는 사라집니다.

인터넷에서 패킷을 나르는 규약이 IP(Internet Protocol, 인터넷 프로토콜)입니다. IP 에는 옛 판 IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판)와 새 판 IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판)가 함께 쓰입니다.

남은 홉 수를 적는 칸도 두 판에서 이름이 다릅니다. IPv4 에서는 TTL(Time To Live, 생존 시간)이라 부릅니다. IPv6 에서는 Hop Limit 이라 부릅니다. 이름은 달라도 하는 일은 같습니다.

크기 상한과 단편화

패킷은 마음대로 크게 만들 수 없습니다. 선마다 한 번에 실을 수 있는 크기에 상한이 있기 때문입니다. 이 상한을 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 부릅니다. 흔한 유선 랜 규격인 이더넷의 MTU 는 1500바이트입니다.

그래서 큰 데이터는 여러 패킷으로 나뉩니다. 수 메가바이트짜리 응답 하나가 선 위에서는 패킷 수천 개가 됩니다.

패킷이 가는 길 중간에 MTU 가 더 작은 선이 끼어 있으면 큰 패킷이 그 선을 그대로 지나가지 못합니다. 이때 패킷을 더 작은 조각으로 다시 자르는 일을 단편화라고 합니다. IPv4 에서는 중간 라우터도 패킷을 자를 수 있습니다. IPv6 에서는 중간 라우터가 자르지 않고 보내는 쪽만 자릅니다.

단편화에는 대가가 있습니다. 조각 가운데 하나만 사라져도 받는 쪽은 원래 패킷을 되살리지 못합니다. 그래서 보내는 쪽은 길 전체에서 가장 작은 MTU 를 알아내 처음부터 그 크기에 맞춰 보내려고 합니다. 이 일을 경로 MTU 탐색이라고 부릅니다.

계층마다 부르는 이름

네트워크는 일을 여러 계층으로 나눠 맡깁니다. 아래 계층은 옆 장비까지 신호를 나릅니다. 위 계층은 먼 목적지까지 길을 찾거나 프로그램 사이의 대화를 맡습니다. 계층마다 주고받는 덩이의 이름이 따로 있습니다.

계층 맡는 일 덩이 이름
링크 계층 같은 선에 붙은 옆 장비까지 나른다 프레임
네트워크 계층 여러 네트워크를 건너 목적지까지 나른다 패킷
전송 계층 프로그램과 프로그램 사이를 잇는다 TCP 는 세그먼트 · UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)는 데이터그램

좁은 뜻의 패킷은 이 표의 가운데 줄입니다. 앞에서 본 IP 가 다루는 단위입니다. 그래서 흔히 IP 패킷이라고 부릅니다.

실무에서는 이 구분을 늘 지키지는 않습니다. 「패킷이 샌다」·「패킷을 떠 봤다」처럼 어느 계층이든 선 위를 지나는 덩이를 뭉뚱그려 패킷이라 부릅니다. 계층을 가려야 하는 대화라면 위 표의 이름을 쓰는 편이 헷갈리지 않습니다.

덩이가 덩이를 감싸는 모양

계층마다 덩이가 따로 있어도 서로 떨어진 물건이 아닙니다. 위 계층의 덩이가 아래 계층 덩이의 페이로드로 통째로 들어갑니다. 아래 계층은 그 앞에 자기 헤더만 붙입니다. 이렇게 감싸는 일을 캡슐화라고 부릅니다.

flowchart TD
    subgraph F["프레임 · 링크 계층"]
        FH["프레임 헤더"]
        subgraph P["패킷 · 네트워크 계층"]
            PH["IP 헤더"]
            subgraph S["세그먼트 · 전송 계층"]
                SH["TCP 헤더"]
                AD["애플리케이션 데이터"]
            end
        end
    end

그림은 안쪽부터 읽습니다. 애플리케이션 데이터에 TCP 헤더가 붙어 세그먼트가 됩니다. 세그먼트 앞에 IP 헤더가 붙어 패킷이 됩니다. 패킷 앞에 프레임 헤더가 붙어 선 위로 나갑니다. 받는 쪽은 바깥 헤더부터 하나씩 벗겨 냅니다.

라우터는 이 가운데 프레임 헤더와 IP 헤더까지만 읽습니다. 프레임은 옆 장비까지만 가는 덩이라 라우터를 지날 때마다 새 프레임으로 갈아입습니다. 패킷은 목적지까지 같은 IP 헤더를 달고 갑니다.

프로토콜 메시지를 패킷이라 부르는 경우

패킷이라는 이름은 네트워크 계층 밖에서도 쓰입니다. 어떤 애플리케이션 프로토콜은 자기가 주고받는 메시지 한 덩이를 패킷이라고 부릅니다.

MQTT(Message Queuing Telemetry Transport)가 그런 예입니다. MQTT 는 기기와 서버가 짧은 메시지를 주고받는 프로토콜입니다. 여기서는 연결 요청 같은 메시지 하나하나를 제어 패킷이라고 부릅니다. 제어 패킷도 헤더 뒤에 데이터가 오는 모양이라 IP 패킷과 닮았습니다.

두 패킷은 계층이 다릅니다. MQTT 제어 패킷은 TCP 연결 위에서 오가는 바이트입니다. 그 바이트가 다시 IP 패킷에 담겨 나갑니다. 그래서 제어 패킷 여러 개가 IP 패킷 하나에 함께 들어가기도 합니다. 반대로 큰 제어 패킷 하나가 IP 패킷 여러 개에 걸치기도 합니다.

문서에서 패킷이라는 말을 만나면 어느 프로토콜의 덩이인지를 먼저 봅니다. 네트워크 이야기면 IP 패킷입니다. 특정 프로토콜의 메시지 형식을 설명하는 문서면 그 프로토콜의 메시지일 가능성이 큽니다.

백엔드 코드에서 보이는 패킷

백엔드 코드는 대개 패킷을 직접 만지지 않습니다. 운영체제가 헤더를 붙이고 자르고 다시 잇는 일을 전부 대신합니다. 코드가 만나는 것은 소켓입니다. 소켓은 프로그램이 네트워크로 데이터를 읽고 쓰는 창구입니다.

TCP 소켓은 바이트 스트림을 줍니다. 끊김 없이 이어진 바이트 줄이라는 뜻입니다. 그래서 코드에서 한 번 쓴 데이터가 패킷 하나로 나간다는 보장이 없습니다. 여러 번 쓴 것이 한 패킷에 묶이기도 합니다. 반대로 한 번 쓴 것이 여러 패킷으로 나뉘기도 합니다.

이 때문에 TCP 위에서 메시지를 주고받는 프로토콜은 경계를 스스로 적습니다. 메시지 앞에 길이를 적거나 약속한 구분 문자를 넣습니다. 받는 쪽은 패킷 단위가 아니라 이 경계를 보고 메시지를 잘라 읽습니다. 이것이 프레이밍입니다. 이름은 링크 계층의 프레임과 닮았지만 서로 다른 이야기입니다.

UDP 소켓은 다릅니다. 한 번 보낸 덩이가 받는 쪽에서도 한 덩이로 읽힙니다. 대신 덩이가 사라지거나 순서가 바뀌어도 알려 주지 않습니다.

패킷을 직접 들여다볼 때도 있습니다. 응답이 가끔 몇 초씩 늦거나 연결이 이유 없이 끊기면, 코드 로그만으로는 원인을 못 찾습니다. 이때 선 위를 지나는 패킷을 그대로 떠서 보는 패킷 캡처를 씁니다. 패킷 손실이 났는지, 재전송이 잦은지, 연결을 누가 먼저 끊었는지가 여기서 드러납니다.

관련 항목

패킷을 이루는 구성 요소

헤더 · 페이로드 · IP 주소 · TTL · 체크섬 · 트레일러

계층마다 패킷을 가리키는 다른 이름

프레임 · 세그먼트 · 데이터그램 · 메시지 · PDU

패킷을 정의하고 싣는 프로토콜

IP · IPv4 · IPv6 · TCP · UDP · ICMP · 이더넷 · MQTT

패킷이 거치는 처리 단계

캡슐화 · 단편화 · 재조립 · 라우팅 · 포워딩 · 프레이밍 · 재전송

패킷을 넘기는 장비와 표

라우터 · 스위치 · 라우팅 테이블 · 홉 · 게이트웨이

패킷 크기를 정하는 상한과 탐색

MTU · 경로 MTU 탐색 · MSS · 점보 프레임

패킷 전달에서 자주 나는 장애

패킷 손실 · 지터 · 지연 · 혼잡 · 순서 뒤바뀜 · 블랙홀 라우터

패킷이 속하는 상위 분류와 전달 방식

네트워크 · 패킷 교환 · 회선 교환 · 계층 · OSI 모델

패킷을 다루는 프로그램 쪽 도구

소켓 · 바이트 스트림 · 패킷 캡처 · tcpdump · Wireshark

다른 이름: packet