
[CS/네트워크] 03. 전송 계층: 데이터 전송의 '신뢰성' 수호자
⚡ 한 줄 요약: 데이터 유실이나 순서 뒤바뀜이 없는 '신뢰성'을 보장하고, 포트 번호를 통해 데이터를 정확한 응용 프로그램에 배달하는 전송 계층의 핵심 원리를 파악합니다.
1. 👋 들어가며: 전송 계층은 왜 존재할까요?
우리가 인터넷으로 대용량 데이터를 보낼 때,
데이터는 한 번에 덩어리째 이동하지 않고 아주 작은 패킷 단위로 쪼개져서 전송됩니다.
이 과정에서 일부 패킷이 사라지는 손실이 발생하거나, 도착하는 순서가 뒤섞이는 문제가 생길 수 있습니다.
전송 계층은 이러한 불안정한 네트워크 환경 위에서 '신뢰할 수 있는 통신'을 가능하게 만드는 품질 관리자 역할을 수행합니다.
- 🧐 Why:
- 물리적으로 떨어진 두 기기가 서로의 상태를 확인하고, 한 비트의 오차도 없이 데이터를 주고받기 위한 약속이 필요하기 때문입니다.
- 🎯 Goal:
- 전송 계층의 핵심 키워드인 '신뢰성'을 이해하고, TCP와 UDP의 차이점 및 연결 설정 과정을 마스터합니다.
📂 2. 전송 계층: 네트워크의 '신뢰성' 수호자
네트워크 계층이 목적지까지 가는 '길'을 찾는다면, 전송 계층은 그 길을 통해 가는 데이터가 '무사히' 도착하도록 책임집니다.
📌 2-1. 신뢰성
- 정의: 전송 계층을 관통하는 가장 핵심적인 키워드는 바로 '신뢰성'입니다.
이는 데이터를 정확하고 완전하게, 즉 손실 없이 순서대로 전달하는 것을 의미합니다.
- 신뢰성이 중요한 이유:
- 신뢰성이 보장되지 않으면 응용 프로그램의 사용자 경험이 크게 저하됩니다.
- 대용량 데이터는 한 번에 가는 게 아니라 작은 패킷 단위로 쪼개져서 전송됩니다.
- 이 과정에서 일부 패킷이 사라지거나(손실), 도착 순서가 뒤섞이는 문제가 빈번하게 발생하기 때문입니다.
- 전송 계층의 역할:
- 데이터가 손실 없이 정확히 전달되도록 다양한 매커니즘을 제공합니다.
- 전송 계층은 데이터의 헤더에 다양한 정보(순서 번호, 오류 제어 등)를 추가하여,
쪼개진 패킷들이 무사히 조립될 수 있도록 관리하는 역할을 담당합니다.
- 즉, 데이터의 '품질'을 보장하는 최종 책임자입니다.
📂 3. TCP vs UDP: 목적에 따른 두 가지 전략
전송 계층에는 성격이 정반대인 두 가지 프로토콜이 있습니다.
이들의 차이점을 정확히 아는 것이 네트워크 공부의 핵심입니다.
📌 3-1. 두 프로토콜의 결정적 차이
- TCP(Transmission Control Protocol)
- 특징:
- 신뢰성을 최우선으로 하는 연결 지향적 프로토콜입니다.
- 핵심 원리:
- 데이터를 주고받기 전, 3-way handshake 과정을 통해 클라이언트와 서버 간에 견고한 커넥션을 먼저 맺습니다.
- 기능:
- 데이터의 순서 보장, 흐름 제어, 오류 복구 기능을 모두 수행하며 20 ~ 60바이트의 복잡한 헤더를 가집니다.
- UDP(User Datagram Protocol)
- 특징:
- 신뢰성보다는 속도와 효율성을 중시하는 비연결 지향적 프로토콜입니다.
- 핵심 원리:
- 연결 설정 과정 없이 데이터를 즉시 전송하며, 오류 제어나 순서 보장을 하지 않는 대신
헤더가 8바이트로 매우 가볍습니다.
📌 3-2. 서비스 목적에 따른 사용 사례
- 동영상 스트리밍과 UDP:
- 스트리밍이나 온라인 게임에서는 속도가 생명입니다.
- 화면에서 한두 프레임이 깨지거나 드랍되더라도 전체 영상이 끊기지 않고 실시간으로 재생되는 것이
훨씬 중요하기 때문에, 확인 과정을 생략하는 UDP를 주로 사용합니다.
- 신뢰성이 중요한 TCP:
- 데이터가 단 1비트라도 틀리면 안 되는 웹 브라우징(HTTP), 파일 전송(FTP), 이메일 등은 반드시 TCP를 기반으로 동작합니다.
💡 비유로 이해하기
- TCP는 '등기 우편':
- 수령인의 사인을 받아야 하고(handshake), 배송 확인을 꼼꼼히 하며, 만약 분실되면 다시 보내줍니다.
- 안정적이지만 확인 절차 때문에 조금 느립니다.
- UDP는 '일반 전단지 배포':
- 집집마다 빠르게 전단지를 뿌리는 것과 같습니다.
- 누군가 전단지를 못 받았거나 바람에 날아가더라도 기사님은 멈추지 않고 계속 뿌립니다.
- 꼼꼼함은 부족해도 속도는 압도적입니다.
- 결론:
- 전송 계층은 패킷 조각들이 흩어지지 않게 관리하는 품질 관리팀이며,
꼼꼼하게 관리할지(TCP) 아니면 속도에 올인할지(UDP)를 결정한다고 이해하면 완벽합니다.
📂 4. 연결의 시작: 3-way Handshake
데이터를 주고받기 전, 송신자와 수신자가 서로의 존재를 확인하고 통신 준비를 마치는 신뢰의 프로세스입니다.
📌 4-1. 세번의 악수 과정
- 이름의 유래:
- 그림처럼 총 3번의 데이터 전송이 일어나기 때문에 '3-way Handshake'라고 부릅니다.
- 이 과정을 통해 양측은 데이터를 주고받을 완벽한 준비를 마칩니다.
- TCP 헤더의 역할:
- SYN(Synchronization):
- 연결 요청 신호입니다.
- TCP 헤더에는 여러 플래그 비트(1비트 공간)가 있는데,
이 중 SYN 비트를 1로 설정해서 보내는 것이 "나랑 연결할래?"라는 의미입니다.
- 시퀀스 번호:
- 처음 보낼 때 완전한 난수(랜덤 값)를 담습니다.
- 만약 이 번호가 예측 가능하면 해킹의 위험이 크기 때문에 보안을 위해 난수를 생성합니다.
- 서버의 응답과 확인:
- 서버는 클라이언트의 요청을 승인하는 ACK, ACK 번호와 자신의 연결 요청인 SYN을 함께 보냅니다.
- 이때 ACK 넘버는 클라이언트로부터 받은 랜덤 시퀀스 넘버에 1을 더한 값입니다.
- 이 정보 역시 TCP 헤더에 포함됩니다.
- 최종 연결 완료:
- 클라이언트가 마지막 ACK를 보내고 서버가 이를 받으면, 양쪽에서 데이터를 담을 버퍼를 각각 생성합니다.
- 이 모든 과정이 끝나면 비로소 송/수신자 사이에 '커넥션'이 생성된 것입니다.
📌 4-2. HTTP가 TCP를 선택한 이유
- 리소스의 파편화:
- 웹 페이지 하나를 열면 단순히 HTML 문서 하나만 받는 게 아닙니다.
- CSS, JavaScript, 이미지, 광고 데이터 등 수많은 리소스를 함께 받아야 하며,
이들은 여러 개의 패킷으로 나뉘어 전송됩니다.
- 신뢰 전송:
- 이 데이터들을 하나라도 누락 없이 안정적으로 받기 위해 HTTP는 전송 계층에서 TCP 프로토콜을 사용합니다.
- HTTP 자체는 비연결적(Stateless)이지만,
그 안에서 실제 데이터를 실어 나르는 과정은 연결 지향적인 TCP가 담당하며 안정성을 보장하고 있는 것입니다.
📂 5. 연결의 종료: 4-way Handshake
데이터 전송이 모두 끝났다면, 맺었던 커넥션을 안전하게 해제하고 네트워크 자원을 정리해야 합니다.
📌 5-1. 네 번의 작별 인사
- FIN(Finish):
- 연결 종료를 요청할 때 사용합니다.
- SYN과 마찬가지로 TCP 헤더의 FIN 비트를 1로 설정해서 보냅니다.
- 작동 원리:
- 이름처럼 4번의 데이터 교환을 통해 커넥션을 완전히 해제합니다.
📌 5-2. 왜 시작(3단계)과 끝(4단계)의 횟수가 다를까?
가장 핵심이 되는 차이는 '응답과 요청을 동시에 할 수 있는가'에 있습니다.
- 연결할 때(3-way):
- 서버가 클라이언트의 요청에 답하면서(ACK), 동시에 "나도 너랑 연결하고 싶어"라는 요청(SYN)을 한 번에 묶어서 보낼 수 있습니다.
- 서로 연결하겠다는 의사만 확인하면 되기 때문입니다.
- 끊을 때(4-way):
- 클라이언트가 "나 이제 끝낼래(FIN)라고 보내면, 서버는 일단 "응 확인했어(ACK)"라고 먼저 답합니다.
- 하지만 서버는 아직 보내야 할 데이터가 남았거나 하던 일이 마무리되지 않았을 수 있습니다.
- 그래서 본인의 일을 모두 마친 뒤에야 비로소 별도로 "나도 이제 끝낼 준비 됐어(FIN)"라고 보냅니다.
- 결론:
- 연결을 끝낼 준비가 서로 다를 수 있기 때문에, ACK와 FIN을 합치지 못하고 4단계로 나누어 진행하는 것입니다.
💡 비유로 이해하기
- 3-way Handshake (소개팅 시작)
- 나: "안녕하세요, 우리 대화 좀 할까요?" (SYN)
- 상대: "네 좋아요! 저도 대화하고 싶어요!" (ACK + SYN)
- 나: "네, 그럼 대화 시작하죠! (ACK)" → 커넥션 생성
- 4-way Handshake (소개팅 끝)
- 나: "이제 늦었으니 전 가볼게요." (FIN)
- 상대: "아, 가시는군요. 확인했어요." (ACK) → 잠시 대기(상대는 짐을 챙겨야 함)
- 상대: "(짐 다 챙긴 후) 저도 이제 준비 다 됐어요. 안녕히 가세요!" (FIN)
- 나: "네, 잘 가세요!" (ACK) → 커넥션 해제
📂 6. 전송 계층의 핵심, TCP 총정리
📌 6-1. TCP의 정의와 존재 이유
TCP는 데이터 전송의 신뢰성을 최우선으로 하는 프로토콜입니다.
단순히 데이터를 보내는 것에 그치지 않고, 다음의 기능을 완벽하게 수행합니다.
- 신뢰성 있는 연결: 송신자와 수신자 사이의 논리적인 통로를 확보합니다.
- 데이터 순서 보장: 쪼개진 패킷들이 순서대로 조립될 수 있게 합니다.
- 흐름/오류 제어: 데이터가 깨지거나 수신자가 감당 못 할 만큼 빠르게 오는 것을 방지합니다.
📌 6-2. TCP 헤더 구조: "이것만은 꼭 기억하자"
| 핵심 필드 | 역할 및 쓰임새 |
|---|
| 포트 번호 | 어떤 애플리케이션(프로세스)으로 데이터를 전달할지 결정하는 주소입니다. |
| 시퀀스 번호 | 패킷의 전송 순서를 나타내며, 난수로 시작하여 해킹 위험을 방지합니다. |
| ACK 번호 | 상대방으로부터 다음에 받기를 기대하는 데이터 번호를 나타냅니다. |
| 컨트롤 비트 | SYN(연결 요청), ACK(확인 응답), FIN(종료 요청) 등 현재 패킷의 상태를 알립니다. |
| 윈도우 사이즈 | 수신자가 현재 한 번에 받을 수 있는 데이터의 양(버퍼 여유 공간)을 알려줍니다. |
| 체크섬 | 전송 도중 데이터에 오류가 생겼는지 확인하는 '몸무게 재기' 역할을 합니다. |
📌 6-3. TCP가 신뢰성을 보장하는 3가지 매커니즘
-
연결 관리 (Handshake)
- 생성(3-Way): SYN과 ACK를 주고받으며 송신자와 수신자 간의 커넥션을 맺습니다.
- 해제(4-Way): FIN과 ACK를 사용하여 안전하게 연결을 종료하고 자원을 반납합니다.
-
오류 감지 및 재전송
- 이론적 모델인 RDT 3.0을 실제로 구현하여 손실 없는 전송을 보장합니다.
- 체크섬으로 에러를 찾고, ACK가 오지 않으면 타이머 기반 재전송이나 빠른 재전송을 통해 유실된 데이터를 보호합니다.
- 시퀀스 번호를 사용하여 데이터가 뒤죽박죽 와도 원래 순서대로 조립합니다.
-
속도 및 트래픽 조절
- 흐름 제어: 수신자의 처리 속도에 맞춰 윈도우 사이즈를 조절하며 전송량을 결정합니다.
- 혼잡 제어: 네트워크 트래픽 과부하를 방지하기 위해 전체적인 데이터 전송 속도를 유연하게 조절합니다.
📂 7. 전송 계층의 교통정리: 멀티플렉싱과 디멀티플렉싱
컴퓨터 안에는 수많은 앱(프로세스)이 동시에 떠 있습니다.
이들이 엉키지 않고 하나의 네트워크 통로를 사이좋게 나누어 쓰는 원리를 알아봅니다.
📌 7-1. 데이터를 한데 모으기: 멀티플렉싱
- 정의:
- 여러 애플리케이션 프로세스에서 보내는 데이터를 하나의 전송 계층 프로토콜(TCP/UDP)을 통해 처리하는 과정입니다.
- 핵심 역할:
- 여러 프로세스가 네트워크를 동시에 사용할 수 있도록 하여 여러 데이터를 한 번에 전송하는 역할을 합니다.
- 작동 과정:
- 애플리케이션이 데이터를 전송 계층으로 전달합니다.
- 전송 계층(TCP/UDP)이 각 데이터에 출발지 포트 번호와 목적지 포트 번호를 추가합니다.
- 완성된 패킷을 네트워크 계층으로 전달하여 목적지로 전송합니다.
- 실전 예시:
- 사용자가 웹 사이트(HTTP, 포트 80)와 이메일(SMTP, 포트 25)을 동시에 사용하면
전송 계층은 각각의 포트 번호를 붙여 데이터를 한꺼번에 실어 나릅니다.
📌 7-2. 데이터를 알맞게 배달하기: 디멀티플렉싱
- 정의:
- 수신된 데이터 패킷을 각 애플리케이션 프로세스로 분배하는 과정입니다.
- 핵심 역할:
- 수신된 패킷의 포트 번호를 확인하여 올바른 애플리케이션에 전달하는 역할을 합니다.
- 작동 과정:
- 수신된 데이터 패킷을 전송 계층에서 확인합니다.
- 패킷의 목적지 포트 번호를 확인하여 어떤 애플리케이션이 받아야 하는지 결정합니다.
- 해당 애플리케이션 프로세스에 데이터를 전달합니다.
- 실전 예시:
- 웹 서버는 포트 80에서 여러 클라이언트의 요청을 한꺼번에 받습니다.
- 이때 전송 계층은 각 패킷에 적힌 출발지 포트 번호를 보고, 어떤 클라이언트와 연결된 것인지 구분하여 정확한 소켓에 데이터를 전달합니다.
💡 비유로 이해하기: 아파트 우편함 시스템
- 멀티플렉싱 (발신측):
- 아파트 101동 사람들이 각자 편지를 씁니다.
- 경비 아저씨(전송 계층)는 편지 봉투에 보내는 사람 호수(출발지 포트)와 받는 사람 호수(목적지 포트)를 적어 하나의 커다란 우편 자루에 담아 우체국으로 보냅니다.
- 디멀티플렉싱 (수신측):
- 우편 자루를 받는 상대방 아파트 경비 아저씨는 자루를 풀어 편지 봉투에 적힌 호수(목적지 포트)를 하나씩 확인합니다.
- 그리고 80호 편지는 80호 앱에, 25호 편지는 25호 앱에 정확히 넣어줍니다.
- 핵심:
- '포트 번호'라는 이름표 덕분에 수많은 앱이 하나의 네트워크망을 공유해도 대화가 섞이지 않는 것입니다.
🎁 8. 정리
🔑 요약
-
전송 계층의 핵심 키워드는 신뢰성으로, 패킷 손실이나 순서 뒤바뀜 문제를 해결하여 데이터 품질을 보장합니다.
-
TCP는 3-way handshake를 사용하는 연결 지향적 프로토콜로 신뢰성이 높으며,
UDP는 연결 설정 없이 속도를 우선시하여 스트리밍 등에 적합합니다.
-
연결 설정은 3-way handshake로 진행되지만, 해제는 서버의 남은 작업 처리를 위해 4-way handshake로 단계를 나누어 신중하게 진행합니다.
-
포트 번호는 멀티플렉싱과 디멀티플렉싱의 핵심 주소이며, 이를 통해 수많은 애플리케이션 데이터가 섞이지 않고 정확히 배달합니다.
-
TCP 헤더의 시퀀스 번호와 ACK 번호는 데이터의 순서를 맞추고 유실된 패킷을 재전송하게 만드는 신뢰성 보장의 핵심 장치입니다.