혼자 공부하는 네트워크 CH4. 전송 계층

2024. 12. 17. 02:43·CS

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 서버 실행 결과
TCP 클라이언트 실행 결과

TCP 실행 흐름

  1. 서버: 소켓 생성
    • 서버는 127.0.0.1 IP와 포트 12345를 사용해 소켓 생성 및 대기
    • 클라이언트의 연결 요청을 listen()으로 대기
  2. 클라이언트: 소켓 생성 및 연결 요청
    • 클라이언트는 서버의 IP와 포트로 연결 요청 (connect())
  3. 서버: 연결 수락
    • 서버는 accept()로 클라이언트 연결 요청을 수락
    • 통신 가능한 소켓(conn)과 클라이언트 주소(addr) 반환
  4. 클라이언트: 문자열 전송
    • 클라이언트는 사용자 입력 문자열을 sendall()로 서버에 전송
  5. 서버: 데이터 수신 및 처리
    • 서버는 recv()로 클라이언트가 보낸 데이터를 수신
    • 받은 문자열을 뒤집어서 처리
  6. 서버: 결과 전송
    • 처리된 데이터를 클라이언트로 전송 (sendall())
  7. 클라이언트: 결과 수신
    • 서버가 보낸 결과를 recv()로 수신 후 출력
  8. 서버 & 클라이언트: 연결 종료
    • 작업 완료 후, 각각 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 서버 실행 결과
UDP 클라이언트 실행 결과

UDP 실행 흐름

  1. 서버: 소켓 생성
    • 서버는 127.0.0.1 IP와 포트 54321에서 데이터를 대기 (bind())
  2. 클라이언트: 소켓 생성
    • 클라이언트는 socket()으로 소켓 생성 후 서버와 연결 없이 바로 데이터 전송 가능
  3. 클라이언트: 문자열 전송
    • 사용자 입력 문자열을 sendto()로 서버에 전송
  4. 서버: 데이터 수신 및 처리
    • 서버는 recvfrom()으로 클라이언트 데이터를 수신
    • 받은 문자열을 뒤집어서 처리
  5. 서버: 결과 전송
    • 처리된 데이터를 sendto()로 클라이언트 주소로 전송
  6. 클라이언트: 결과 수신
    • 서버에서 보낸 결과를 recvfrom()으로 수신 후 출력
  7. 클라이언트 & 서버: 소켓 종료
    • 클라이언트는 작업 종료 후 소켓 닫기 (close())

TCP와 UDP 실행 흐름의 주요 차이


4. 최신 트렌드 : 전송 계층의 발전

4.1 QUIC (Quick UDP Internet Connections)

좌측 : TCP ❘ 우측 : QUIC

특징

  • 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 문제 존재

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
'CS' 카테고리의 다른 글
  • 웹 개발 시 꼭 챙겨야 할 보안 체크 리스트
  • 혼자 공부하는 네트워크 CH5. 응용 계층
  • 혼자 공부하는 네트워크 CH3. 네트워크 계층
  • 혼자 공부하는 네트워크 CH2. 물리 계층과 데이터 링크 계층
uoaheu
uoaheu
uoaheu 님의 블로그 입니다.
  • uoaheu
    uoaheu 님의 블로그
    uoaheu
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • 알고리즘 (7)
      • CS (9)
      • FRONTEND (9)
        • React (12)
        • Kotlin (1)
        • JS (5)
        • HTML (2)
      • SQL (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    toss 분석
    멀티캠퍼스it부트캠프
    엘지유플러스유레카프론트엔드
    토스 uiux
    boj25418
    유레카3기
    toss uiux
    부트캠프후기
    mysql
    백준1926번
    알고리즘
    이더넷프레임
    mysql 피벗테이블
    useactionstate
    리액트usestate
    BFS
    혼자서 공부하는 네트워크
    토스 앱 분석
    mysql로 피벗테이블만들기
    토스분석
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
uoaheu
혼자 공부하는 네트워크 CH4. 전송 계층
상단으로

티스토리툴바