1. 전송 계층이란?
전송 계층은 OSI 7 계층 중 4번째 계층으로, 응용 계층과 네트워크 계층 사이에서 데이터를 전달하며, 통신의 신뢰성을 보장합니다.
구체적으로, 전송 계층은 신뢰할 수 있는 통신과 연결형 통신 기능을 통해 IP(Internet Protocol)의 한계를 극복하고, 사용자가 실행하고 있는 프로그램을 식별하는 역할을 수행합니다.
1.1 IP의 한계
IP(Internet Protocol)는 데이터를 패킷 단위로 전달하지만, 다음과 같은 한계가 있습니다.
- 비신뢰성(신뢰할 수 없는 통신)
- 데이터 손실, 순서 변경, 중복 발생 가능
- 패킷 손실 발생 시 확인 및 복구하지 않음
- 연결 없음(비연결형 통신)
- 송신자와 수신자 간 연결 상태를 관리하지 않음
- 사전 연결 설정 없이 단순히 패킷을 목적지로 전송
그럼에도 IP를 이용하는 이유를 살펴본다면 ?!
- 사전 연결 수립 없이 데이터를 전송하므로 지연 시간 감소
- 신뢰성을 보장하는 연결형 통신은 더 많은 자원을 소모되며 성능에 영향
따라서, IP는 단순하고 효율적인 통신을 제공하며, 빠른 데이터 전달이 중요한 환경에서 강점을 가집니다.
1.2 전송 계층의 주요 역할
- 종단 간 통신 (End-to-End Communication)
- 송신자와 수신자 간 데이터 전송 보장 → 프로세스 간 통신을 지원하여 애플리케이션의 데이터 전달을 가능하게 합니다.
- 데이터 신뢰성 (Data Reliability)
- 패킷 손실 복구 및 순서 보장 → 데이터가 순서대로 도착하도록 하여 정확한 데이터 전송을 지원합니다.
- 포트 관리 (Port Management)
- 포트 번호를 통해 애플리케이션 간 통신 식별
- ex) HTTP(80번 포트), HTTPS(443번 포트), DNS(53번 포트)
- 흐름 제어와 혼잡 제어 (Flow & Congestion Control)
- 흐름 제어 : 송신자가 수신자의 처리 속도에 맞게 전송 속도 조절
- 혼잡 제어 : 네트워크 혼잡 상태를 방지해 데이터 손실 최소화

2. 주요 프로토콜 : TCP와 UDP
전송 계층의 핵심 프로토콜로는 TCP와 UDP가 있습니다. 두 프로토콜은 데이터 전송 방식과 목적이 다르며, 서로 다른 용도로 사용됩니다.
2.1 TCP (Transmission Control Protocol)
TCP는 연결 지향적이고, 데이터의 신뢰성을 보장하는 프로토콜입니다.
특징
- 데이터 손실, 중복, 순서 변경 없이 신뢰성 보장
- 송신자와 수신자 간 연결 설정(3-way handshake)이 필요
- 흐름 제어와 혼잡 제어를 통해 효율적인 데이터 전송 가능
주요 동작
- 3-way handshake : 연결 설정을 위한 과정
- 클라이언트와 서버 간에 데이터 송수신 전에 연결을 수립
- 4-way handshake : 연결 종료를 위한 과정
- 흐름 제어 : 슬라이딩 윈도우를 사용해 송신 속도를 수신자의 처리 속도에 맞춤
- 혼잡 제어 : 네트워크 상태를 감지해 송신 속도를 조절
- Slow Start, Congestion Avoidance, Fast Recovery 등
사용 사례
- HTTP/HTTPS : 웹 페이지 데이터 전송
- FTP : 파일 전송
- SMTP/IMAP/POP3 : 이메일 서비스
2.2 UDP (User Datagram Protocol)
UDP는 비연결성을 가지며, 데이터를 빠르고 간단하게 전송하기 위한 프로토콜입니다.
특징
- 연결 과정 없이 데이터를 바로 전송
- 신뢰성 보장 없음(패킷 손실, 순서 변경 가능)
- 헤더 구조가 간단해 전송 속도가 빠름.
장점
- 빠른 응답 속도가 필요한 애플리케이션에 적합
- 연결 설정/유지가 필요 없으므로 네트워크 자원 절약
단점
- 데이터 손실 복구 메커니즘이 없음
- 데이터의 순서를 보장하지 않음
사용 사례
- DNS 조회 : 도메인 이름 변환
- VoIP(Voice over IP) : 인터넷 기반 음성 통화
- 스트리밍 서비스 : 실시간 비디오/오디오 전송
2.3 TCP와 UDP의 차이점

정리하자면,
TCP : 신뢰성이 중요한 서비스(웹 브라우징, 이메일 등)에 적합
UDP : 속도가 중요한 서비스(스트리밍, 실시간 통신 등)에 적합
3. 실습으로 배우는 전송 계층
3.1 Python Socket 프로그래밍
: 클라이언트가 서버로 문자열을 보내면, 서버에서 해당 문자열을 뒤집어서 반환하는 예제
3.1.1 TCP 코드
# tcp_server.py
import socket
# 1. TCP 소켓 생성
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 12345)) # IP와 포트 설정
server.listen(1) # 클라이언트 연결 대기
print("Server is ready and waiting for connections...")
while True:
# 2. 클라이언트 연결 수락
conn, addr = server.accept()
print(f"Connected by {addr}")
# 3. 클라이언트로부터 데이터 수신
data = conn.recv(1024) # 최대 1024바이트 읽기
if not data:
break
received_text = data.decode()
print(f"Received from client: {received_text}")
# 4. 문자열 뒤집기 처리
reversed_text = received_text[::-1] # 문자열을 뒤집음
print(f"Sending back: {reversed_text}")
# 5. 클라이언트로 결과 전송
conn.sendall(reversed_text.encode())
# 연결 종료
conn.close()
# tcp_client.py
import socket
# 1. TCP 소켓 생성
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 서버 연결
client.connect(("127.0.0.1", 12345))
# 3. 사용자로부터 문자열 입력 받기
user_input = input("Enter a string to reverse: ")
# 4. 서버로 문자열 전송
client.sendall(user_input.encode())
# 5. 서버로부터 결과 수신
data = client.recv(1024) # 최대 1024바이트 읽기
print(f"Reversed string from server: {data.decode()}")
# 6. 연결 종료
client.close()


TCP 실행 흐름
- 서버: 소켓 생성
- 서버는 127.0.0.1 IP와 포트 12345를 사용해 소켓 생성 및 대기
- 클라이언트의 연결 요청을 listen()으로 대기
- 클라이언트: 소켓 생성 및 연결 요청
- 클라이언트는 서버의 IP와 포트로 연결 요청 (connect())
- 서버: 연결 수락
- 서버는 accept()로 클라이언트 연결 요청을 수락
- 통신 가능한 소켓(conn)과 클라이언트 주소(addr) 반환
- 클라이언트: 문자열 전송
- 클라이언트는 사용자 입력 문자열을 sendall()로 서버에 전송
- 서버: 데이터 수신 및 처리
- 서버는 recv()로 클라이언트가 보낸 데이터를 수신
- 받은 문자열을 뒤집어서 처리
- 서버: 결과 전송
- 처리된 데이터를 클라이언트로 전송 (sendall())
- 클라이언트: 결과 수신
- 서버가 보낸 결과를 recv()로 수신 후 출력
- 서버 & 클라이언트: 연결 종료
- 작업 완료 후, 각각 close()로 소켓을 닫아 연결 종료
3.1.2 UDP 코드
# udp_server.py
import socket
# 1. UDP 소켓 생성
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("127.0.0.1", 54321)) # IP와 포트 설정
print("UDP Server is ready and waiting for messages...")
while True:
# 2. 클라이언트로부터 데이터 수신
data, addr = server.recvfrom(1024) # 최대 1024바이트 읽기
received_text = data.decode()
print(f"Received from {addr}: {received_text}")
# 3. 문자열 뒤집기 처리
reversed_text = received_text[::-1] # 문자열을 뒤집음
print(f"Sending back: {reversed_text}")
# 4. 클라이언트로 결과 전송
server.sendto(reversed_text.encode(), addr)
# udp_client.py
import socket
# 1. UDP 소켓 생성
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 사용자로부터 문자열 입력 받기
user_input = input("Enter a string to reverse: ")
# 3. 서버로 문자열 전송
server_address = ("127.0.0.1", 54321)
client.sendto(user_input.encode(), server_address)
# 4. 서버로부터 결과 수신
data, server = client.recvfrom(1024) # 최대 1024바이트 읽기
print(f"Reversed string from server: {data.decode()}")
# 5. 소켓 종료
client.close()


UDP 실행 흐름
- 서버: 소켓 생성
- 서버는 127.0.0.1 IP와 포트 54321에서 데이터를 대기 (bind())
- 클라이언트: 소켓 생성
- 클라이언트는 socket()으로 소켓 생성 후 서버와 연결 없이 바로 데이터 전송 가능
- 클라이언트: 문자열 전송
- 사용자 입력 문자열을 sendto()로 서버에 전송
- 서버: 데이터 수신 및 처리
- 서버는 recvfrom()으로 클라이언트 데이터를 수신
- 받은 문자열을 뒤집어서 처리
- 서버: 결과 전송
- 처리된 데이터를 sendto()로 클라이언트 주소로 전송
- 클라이언트: 결과 수신
- 서버에서 보낸 결과를 recvfrom()으로 수신 후 출력
- 클라이언트 & 서버: 소켓 종료
- 클라이언트는 작업 종료 후 소켓 닫기 (close())
TCP와 UDP 실행 흐름의 주요 차이

4. 최신 트렌드 : 전송 계층의 발전
4.1 QUIC (Quick UDP Internet Connections)

특징
- UDP 기반의 전송 계층 프로토콜
- QUIC은 TCP가 아닌 UDP(비연결형 통신)를 기반으로 동작
- TCP의 복잡한 연결 설정 과정(3-way handshake)을 제거해 빠른 데이터 전송 실현
- TCP의 단점 개선
- TCP는 연결 설정(3-way handshake)으로 인해 초기 연결 시 지연 발생
- QUIC은 UDP 위에 신뢰성, 흐름 제어, 혼잡 제어 기능을 추가해 TCP의 장점을 유지하면서 초기 연결 지연 크게 감소
- TLS 통합
- QUIC은 TLS(Transport Layer Security) 암호화를 기본적으로 포함하고 있어, 보안 연결을 신속하게 설정함
- TCP는 연결 설정 후 TLS를 별도로 수행해야 하므로 상대적으로 느림
- Multiplexing 지원
- QUIC은 한 연결 내에서 여러 스트림을 동시에 처리(다중화)할 수 있어, 웹 페이지 로드 속도를 향상시킴
- TCP는 하나의 스트림에 문제가 발생하면 다른 스트림도 대기해야 하는 Head-of-Line Blocking 문제 존재

사용 사례
- HTTP/3
- HTTP/3는 QUIC을 전송 계층으로 사용하여, 웹 페이지 로딩 속도와 사용자 경험 향상
- 구글 크롬, 유튜브, 페이스북 같은 대규모 웹 서비스에서 QUIC과 HTTP/3를 적극 활용
비유를 해보자면,
TCP = 고속도로에 톨게이트(3-way handshake)가 있어 차량이 진입 전 멈추는 것
QUIC = 톨게이트를 없애고, 차량이 바로 고속도로에 진입할 수 있도록 만든 시스템
즉, 데이터 전송이 훨씬 빠르고 효율적이다.
4.2 Multipath TCP (MPTCP)
특징
- 다중 경로 지원
- MPTCP는 데이터 전송 시 하나의 네트워크 경로가 아닌 여러 경로를 동시에 사용
- ex) Wi-Fi와 LTE를 동시에 활용해 데이터 전송 속도와 안정성 개선
- 전송 안정성
- 만약 하나의 경로가 끊기더라도, 다른 경로를 통해 데이터를 전송할 수 있어 연결이 안정적
- ex) Wi-Fi 신호가 약해져도 LTE로 데이터 전송을 계속 진행
- 부하 분산
- 데이터를 여러 경로에 분산 전송하므로, 전송 속도가 빨라지고 네트워크 혼잡을 줄일 수 있음
사용 사례
- 모바일 기기
- MPTCP는 스마트폰에서 Wi-Fi와 LTE를 동시에 사용해 빠르고 안정적인 인터넷 제공
- ex) 애플의 Siri는 MPTCP를 활용해 Wi-Fi와 셀룰러 데이터를 병렬로 사용하여 응답 속도 개선
- 클라우드 서비스
- 데이터 센터 간 연결에서도 MPTCP를 사용해 안정적이고 빠른 데이터 동기화 가능
비유를 해보자면,
일반 TCP = 단일 도로를 따라 데이터를 전송
MPTCP = 여러 도로를 동시에 사용해 차량을 나눠 보냄
→ 만약 한 도로에서 사고(연결 장애)가 발생해도 다른 도로로 우회할 수 있으므로 더 빠르고 안정적이다.

다시 정리해 본다면,
QUIC : 연결 지연이 적고 빠른 데이터 전송을 목표로 한 UDP 기반 기술MPTCP : 여러 네트워크를 동시에 활용해 데이터 전송을 빠르고 안정적으로 만드는 TCP 확장 기술
'CS' 카테고리의 다른 글
| 개발자가 컴퓨터 구조를 알아야 하는 이유 (0) | 2025.01.13 |
|---|---|
| 웹 개발 시 꼭 챙겨야 할 보안 체크 리스트 (0) | 2025.01.07 |
| 혼자 공부하는 네트워크 CH5. 응용 계층 (2) | 2024.12.19 |
| 혼자 공부하는 네트워크 CH3. 네트워크 계층 (1) | 2024.12.12 |
| 혼자 공부하는 네트워크 CH2. 물리 계층과 데이터 링크 계층 (3) | 2024.12.09 |