❗본 포스팅은 널널한 개발자님의 강의 영상을 바탕으로 개인적으로 정리한 내용입니다
🎯 이번 포스팅의 목표는 데이터의 패킷 분할까지의 과정을 이해하는 것!
패킷이 어떻게 분할되는지 이해하려면 먼저 각 계층별 데이터 단위를 이해하고 이를 실전에서 어떻게 활용하는지 감을 잡기 위해 소켓도 간단히 다뤄보도록 하겠습니다.
🧩 계층별 데이터 단위

위 그림을 보면 TCP/IP에서 각 계층별 데이터 단위가 어떻게 나뉘는지 확인할 수 있어요.
하지만 우리의 최종 목표는 ‘패킷 분할’을 완벽하게 이해하는 것! 그러니 좀 더 세부적인 그림을 통해 깊이 있게 접근해 보도록 하겠습니다.

주의❗
위 그림에서 L1 ~ L4는 OSI 7 계층에서의 각 계층을 의미합니다.
이전 그림과 비교해 보면, 이번 그림에서는 Socket이 추가된 걸 확인할 수 있어요.
그렇다면 Socket이란 대체 무엇일까요? 🤔
많은 개발자들이 "소켓이 뭐야?" 라는 질문에서 막히는데, 사실 저도 그중 한 명이었습니다… 😅
여러분에게만 알려드리는 소켓의 정체는 바로!! 🥁🥁🥁🥁
🎉 파일(File) 이었습니다. (충격과 공포의 반전 😱)
📌 Socket이란?
소켓은 파일의 일종으로, User mode의 애플리케이션 프로세스가 Kernel mode의 네트워크 프로토콜을 쉽게 사용할 수 있도록 만든 인터페이스 입니다.
즉, TCP를 쉽게 쓰기 위한 인터페이스라고 이해할 수 있겠죠.
💡 그리고 여기서 소켓 수준의 데이터 단위를 "Stream"이라고 합니다.
Stream은 말 그대로 데이터의 흐름(덩어리) 자체를 의미합니다.
즉, 데이터를 패킷 단위로 나누기 전, 연속적인 데이터 흐름을 다루는 방식이라고 이해하면 됩니다.
소켓을 이용하면 TCP나 UDP에 대한 깊은 지식 없이도 다른 프로세스와 통신할 수 있어요.
네트워크와 인터넷이 작동하는 핵심 메커니즘이기도 하고요.
🐧 Everything is a File! (리눅스 철학 한 스푼🥄)
리눅스에서 소켓은 파일처럼 취급됩니다.
이 말이 처음엔 낯설 수도 있지만, 리눅스에서는 "모든 것은 파일이다" 라는 철학이 있죠.

🔪 데이터 해부학 - 패킷 쪼개기! Stream에서 Packet까지의 여정
운영체제(OS) 입장에서 Stream이란 연속적으로 이어진, 크기를 정확히 알 수 없는 데이터입니다.
📌 Stream의 특징
- 시작은 있지만 끝을 정확히 알 수 없음
- 데이터의 끝을 정해주는 것은 애플리케이션(Process)에서 결정
즉, 운영체제는 Stream을 그대로 다루는 것이 아니라, 애플리케이션이 정한 기준에 따라 데이터를 나누고, 이를 패킷으로 쪼개서 전송하게 되는 것이죠!
📌 Segment와 Packet의 최대 크기: MSS와 MTU 다시 보기
- Segment의 최대 크기: MSS(Maximum Segment Size)라고 부르며, 1460 byte 입니다. 이건 TCP가 "한 번에 이 정도만 실어!" 하고 정한 데이터 크기라고 이해할 수 있죠.
- Packet의 최대 크기: MTU(Maximum Transmission Unit)라고 하며, 1500 byte 입니다. TCP 헤더(20 byte)와 IP 헤더(20 byte)를 포함한 전체 크기라고 볼 수 있죠.
🤔 그럼 4MB의 Stream은 어떻게 전송될까요?

📌 데이터 분할 과정: Stream에서 Packet까지
1️⃣ Process에서 데이터 생성: 애플리케이션이 만든 data가 소켓을 통해 Stream 형태로 내려옵니다.
2️⃣ Transport 계층(TCP)에서 분할: TCP가 "너무 커, 잘게 쪼개야 해!" 하면서 MSS(1460 byte) 단위로 세그먼트를 만드는데. 이게 바로 분할(Segmentation)이 되는 순간입니다.
3️⃣ 패킷 완성: 각 세그먼트에 TCP 헤더(20 byte)와 IP 헤더(20 byte)가 붙어서 MTU(1500 byte) 크기의 패킷이 되며 이제 네트워크로 떠날 준비를 완료하게 됩니다!
4️⃣ 전송 및 조립: 패킷들이 네트워크를 타고 수신 측으로 날아가면, 상대편에서 "이 퍼즐 다시 맞춰야지" 하면서 원래 Stream으로 복원하는 과정을 통해 네트워킹을 하게 됩니다.
💡 즉, 운영체제는 Stream을 그대로 보내는 것이 아니라, MTU 크기에 맞춰 패킷을 쪼개서 전송하는 것이 핵심!
✍️ 마무리하며
이번에는 패킷 분할을 깊이 파헤치면서, 계층별 데이터 단위와 소켓의 정체, 그리고 Stream이 Packet으로 변하는 과정을 하나씩 살펴봤습니다. 특히 "어느 지점에서 패킷이 쪼개지는지", "쪼개진 데이터가 어떻게 네트워크를 통해 전달되어 다시 합쳐지는지"를 이해하는 과정이 꽤나 흥미로웠습니다.
사실 저도 CS를 처음 공부할 때는 "데이터가 한 번에 전송되는 게 아니라 패킷으로 나뉘어 간다" 정도로만 알고 있었습니다. 그런데 이렇게 정리해 보니, 단순히 외웠을 때와는 비교할 수 없을 만큼 깊이 있는 이해가 생긴 것 같습니다. 알 듯 말 듯했던 개념들이 "아, 이거였구나!" 하고 퍼즐 맞춰지듯 정리되는 느낌이랄까요?
이 글을 읽는 모두에게 조금이라도 네트워크가 더 친숙하게 다가왔길 바라며, 다음 포스팅에서 재미있는 주제로 찾아뵙도록 하겠습니다!
읽어주셔서 감사합니다 🙇
'해피 코딩 > Network' 카테고리의 다른 글
[네트워크] 스타벅스에서 IPv4주소의 기본 구조 이해하기 (1) | 2025.03.22 |
---|---|
[네트워크] 사무실 네트워크는 이렇게 움직인다! (0) | 2025.03.15 |