개발자공부일기
OSI전송 계층 본문
전송 계층은 OSI 모델의 4번째 계층으로, 애플리케이션 계층과 네트워크 계층 사이에 존재합니다. 응용 계층(Application Layer)에서 내려온 데이터를 처리하고 네트워크 계층(Network Layer)을 통해 전송하기 위한 중간다리 역할을 합니다. 이 계층은 데이터 패킷을 전달하고, 오류 검출 및 수정, 흐름 제어, 연결 수립 등의 기능을 수행합니다. 또한, 전송 계층에서는 TCP(전송 제어 프로토콜)와 UDP(사용자 데이터그램 프로토콜)와 같은 프로토콜을 사용해 데이터를 전달합니다. 이러한 프로토콜들은 각기 다른 전송 방식과 특징을 가지고 있습니다. 전송 계층은 송신자와 수신자 간의 논리적인 종단 간(end-to-end) 통신을 관리하며, 데이터의 신뢰성, 정확성, 순서를 보장합니다
전송 계층에는 크게 2가지 통신 방법이 있다.
연결형 통신
신뢰할 수 있고 정확한 데이터를 목적지에 문제 없이 전달하는 통신
신뢰성/정확성을 위해 여러 번 확인하고 데이터를 보낸다.
이러한 통신을 위해 사용되는 프로토콜이 TCP이다.
전송이 양방향으로 동시에 일어나는 전이중 방식이다.
각 연결이 정확히 2개의 종단점을 가지는 점대점 방식이다.
비연결형 통신
데이터를 빠르고 효율적으로 전달하는 통신
효율성을 위해 확인 절차 없이 일방적으로 데이터를 보낸다.
ex) 동영상을 시청할 때, 데이터가 유실되어 화질이 조금 떨어지더라도 버벅거리지 않게 하기 위해 사용한다.
이러한 통신을 위해 사용되는 프로토콜이 UDP이다.
데이터를 데이터그램 단위로 처리한다.
전송 계층의 주요 기능
- 데이터 분할 및 재조립
전송 계층은 응용 계층에서 받은 큰 데이터를 작은 단위(세그먼트)로 나눠 네트워크 계층으로 전달하며, 수신 측에서는 이를 다시 원래의 형태로 재조립합니다. 이는 데이터 전송 중 발생할 수 있는 오류를 줄이고, 대역폭 효율성을 높이는 데 기여합니다. - 신뢰성 있는 전송
데이터 전송 중 손실되거나 손상된 세그먼트를 감지하고, 이를 재전송하거나 수정하는 메커니즘을 제공합니다. TCP를 사용하는 경우, 데이터가 수신 측에 정확히 도달했는지 확인하는 ACK(Acknowledgment)를 통해 신뢰성을 보장합니다. - 흐름 제어 (Flow Control)
송신자와 수신자 간 데이터 전송 속도를 조절하여, 수신자가 처리할 수 있는 데이터 이상이 전송되지 않도록 방지합니다. 이를 통해 송신자 과부하로 인한 데이터 손실을 줄입니다. - 혼잡 제어 (Congestion Control)
네트워크가 과부하 상태에 빠지지 않도록, 송신 속도를 동적으로 조정합니다. TCP에서는 혼잡 제어 알고리즘(예: AIMD, Slow Start)을 통해 네트워크 트래픽을 효율적으로 관리합니다. - 다중화와 역다중화 (Multiplexing and Demultiplexing)
여러 응용 프로그램이 동일한 네트워크 연결을 공유할 수 있도록 다중화(Multiplexing)를 수행하며, 수신 측에서는 이를 적절히 분리(역다중화)하여 각 응용 프로그램으로 데이터를 전달합니다.
TCP와 UDP
TCP (Transmission Control Protocol)
TCP는 연결 지향적 프로토콜로, 신뢰성과 데이터의 순서를 보장합니다. 데이터 전송 전 송신자와 수신자 간에 연결 설정이 이루어지며, 주로 신뢰성이 중요한 응용 프로그램에서 사용됩니다.
- 특징:
- 3-way Handshake를 통해 연결 설정 및 종료.
- 데이터 재전송, 오류 감지 및 수정.
- 흐름 제어와 혼잡 제어 지원.
- 사용 사례:
웹 브라우징(HTTP, HTTPS), 이메일(SMTP, IMAP, POP3), 파일 전송(FTP).
UDP (User Datagram Protocol)
UDP는 비연결 지향적 프로토콜로, 데이터 전송 속도를 중시하며 신뢰성과 순서를 보장하지 않습니다. 전송 속도와 오버헤드 감소가 중요한 응용 프로그램에서 사용됩니다.
- 특징:
- 핸드셰이킹 과정이 없음.
- 데이터 순서 보장 및 재전송 기능 없음.
- 낮은 지연 시간(Latency) 제공.
- 사용 사례:
스트리밍 서비스, VoIP, 온라인 게임, DNS 조회.
Handshaking
참고:https://javacpp.tistory.com/73
핸드셰이킹(Handshaking)은 네트워크 연결을 시작하거나 종료하기 전에 송신자와 수신자 간에 신호를 교환하여 연결 상태를 확인하는 과정입니다. TCP에서는 3-way Handshaking 과정을 통해 연결을 설정합니다.
3-way Handshaking 과정
- SYN (Synchronize)
클라이언트가 서버에 연결을 요청하는 메시지(SYN 패킷)를 보냅니다. - SYN-ACK (Synchronize-Acknowledgment)
서버는 클라이언트의 요청을 수락하고, 응답 메시지(SYN-ACK 패킷)를 보냅니다. - ACK (Acknowledgment)
클라이언트가 서버의 응답을 확인하며 연결이 설정됩니다.
연결 종료 (4-way Handshaking)
TCP 연결을 종료할 때는 4-way Handshaking이 이루어집니다.
- FIN (Finish)
클라이언트가 연결 종료 요청(FIN 패킷)을 보냅니다. - ACK
서버가 이를 확인하는 응답을 보냅니다. - FIN
서버가 클라이언트에게 연결 종료 요청을 보냅니다. - ACK
클라이언트가 서버의 요청을 확인하며 연결이 종료됩니다.
1. 데이터 분할(Segmentation)
개념
- 전송 계층은 애플리케이션 계층에서 전달받은 데이터를 전송 가능한 크기로 나눕니다.
이러한 작은 조각을 세그먼트(segment)라고 합니다.
필요성
- 네트워크 MTU 제한
- 네트워크는 전송 가능한 데이터의 최대 크기(MTU, Maximum Transmission Unit)를 제한합니다.
- 일반적으로 이더넷의 MTU는 1500바이트입니다.
- 따라서 전송 계층은 데이터를 이 크기에 맞게 분할해야 합니다.
- 효율적인 네트워크 전송
- 데이터를 작은 단위로 나누면, 네트워크 혼잡 시 일부만 손실되므로 손실된 부분만 재전송하면 됩니다.
동작 과정
- 데이터 나누기
- 애플리케이션에서 받은 데이터를 전송 계층의 세그먼트 크기에 맞게 나눕니다.
- 헤더 추가
- 각 세그먼트에 전송 계층의 헤더(TCP 또는 UDP 헤더)를 추가합니다.
- TCP 헤더에는 다음 정보가 포함됩니다:
- 순서 번호(Sequence Number): 데이터 조각의 순서를 나타냅니다.
- 확인 번호(Acknowledgment Number): 수신자가 받은 데이터의 확인 정보를 담습니다.
- 포트 번호(Port Number): 데이터를 수신 애플리케이션과 연결합니다.
2. 데이터 재조립(Reassembly)
개념
- 전송 계층은 수신한 세그먼트를 원래의 데이터로 복원하는 과정을 수행합니다.
필요성
- 데이터 순서 보장
- 네트워크는 패킷을 비순서적으로 전달할 수 있습니다(다른 경로를 거치기 때문).
- 따라서 수신 측에서 데이터를 순서대로 재조립해야 합니다.
- 손실된 데이터 처리
- 손실된 데이터가 있을 경우, 순서를 기반으로 손실 부분을 재전송 요청합니다.
동작 과정
- 순서 확인
- TCP는 순서 번호(Sequence Number)를 사용해 데이터를 올바른 순서로 재배열합니다.
- 수신된 데이터 중 일부가 손실되거나 늦게 도착한 경우, 빈 자리를 채우지 않고 대기합니다.
- 데이터 조합
- 모든 세그먼트가 도착하면 순서대로 조합하여 원래 데이터로 복원합니다.
- ACK(확인 응답) 전송
- 수신 측은 송신 측에 데이터가 제대로 도착했음을 알리기 위해 ACK 패킷을 전송합니다.
3. TCP와 UDP의 차이점
- TCP(신뢰성 있는 프로토콜):
- 데이터의 분할 및 재조립을 완벽히 보장합니다.
- 순서 번호, 확인 응답(ACK), 재전송 메커니즘을 통해 데이터의 신뢰성을 유지합니다.
- 손실된 세그먼트를 다시 요청하고, 순서대로 재조립합니다.
- UDP(신뢰성 없는 프로토콜):
- 데이터 분할은 수행하지만, 재조립에 대한 보장은 없습니다.
- 순서 번호나 ACK가 없으므로, 수신자가 데이터를 받지 못하거나 순서가 틀려도 이를 복구하지 않습니다.
4. 데이터 분할과 재조립의 예시
예제: 5,000바이트 데이터를 전송하는 경우
- 데이터 분할
- 애플리케이션 계층에서 받은 5,000바이트 데이터를 MTU 1,500바이트에 맞게 분할합니다.
- 세그먼트는 각각 약 1,460바이트(헤더 제외)로 나뉩니다:
- Segment 1: 1,460바이트 (0–1,459바이트)
- Segment 2: 1,460바이트 (1,460–2,919바이트)
- Segment 3: 1,460바이트 (2,920–4,379바이트)
- Segment 4: 620바이트 (4,380–5,000바이트)
- 전송
- 나뉜 세그먼트가 네트워크를 통해 전송됩니다.
- 데이터 재조립
- 수신 측은 세그먼트의 순서 번호를 확인하며 데이터를 올바른 순서로 배열합니다.
- 모든 세그먼트가 도착하면 원래의 5,000바이트 데이터를 복원합니다.
5. TCP의 신뢰성 있는 재조립의 주요 기술
- Sliding Window Protocol
- 데이터 흐름을 관리하며, 송신자가 수신자의 처리 능력에 맞게 데이터를 조정해서 전송.
- Timeout and Retransmission
- 특정 시간 동안 ACK를 받지 못한 데이터는 재전송.
- Duplication Check
- 중복된 세그먼트는 무시.
- Out-of-Order Handling
- 순서가 틀린 세그먼트는 올바른 위치에 임시 저장.
어라 근데 이거 네트워크 계층에서도 보던거 아닌가? 비교해보자
전송 계층과 네트워크 계층의 데이터 분할 및 재조립 비교
특징 | 전송 계층 | 네트워크 계층 |
작동 대상 | 애플리케이션 데이터(세그먼트) | 전송 계층에서 받은 데이터(패킷) |
분할 크기 기준 | 송수신 애플리케이션과 네트워크 연결 조건 | 네트워크의 MTU 크기 |
재조립 위치 | 수신 측의 전송 계층(TCP/UDP) | 수신 측 네트워크 계층 |
책임 | 데이터 신뢰성 보장, 손실 처리, 순서 보장 | 데이터그램 조각화 및 홉 간 전송 |
프로토콜 | TCP, UDP | IP |
결과물 | 세그먼트(Segment) | 패킷(Packet), 조각(Fragment) |
전송 계층에서 흐름 제어(Flow Control)와 오류 제어(Error Control)는 데이터 전송의 신뢰성, 효율성, 정확성을 보장하는 중요한 메커니즘입니다. 이 두 개념은 주로 TCP(Transmission Control Protocol)에서 구현되며, UDP에서는 간단한 오류 처리만 존재합니다.
1. 흐름 제어 (Flow Control)
목적
흐름 제어는 송신자가 수신자의 처리 능력을 초과하는 속도로 데이터를 전송하는 것을 방지하는 메커니즘입니다. 즉, 송신자가 수신자의 처리 능력에 맞게 데이터를 전송하도록 제어하여 수신자의 버퍼 오버플로우(Overflow)나 패킷 손실을 방지합니다.
작동 방식
TCP의 흐름 제어는 슬라이딩 윈도우(Sliding Window) 방식을 사용하여 이루어집니다. 송신자는 윈도우 크기(Window Size)를 사용하여 얼마나 많은 데이터(세그먼트)를 한 번에 보낼 수 있는지 결정합니다. 수신자는 수신 윈도우 크기(Receiver Window Size)를 송신자에게 알려주어, 송신자가 한 번에 보낼 수 있는 데이터의 양을 조정합니다.
슬라이딩 윈도우(Sliding Window)
슬라이딩 윈도우는 송신자와 수신자 간에 동적으로 데이터의 흐름을 관리하는 방식입니다. 윈도우 크기(Window Size)는 송신자가 보내는 데이터의 크기를 결정하며, 송신자는 수신자가 처리할 수 있는 양만큼 데이터를 보냅니다. 수신자는 데이터를 받으면 송신자에게 "이 데이터를 받았음"을 확인하는 ACK(확인 응답)을 보내며, 송신자는 그만큼 송신 윈도우를 슬라이드시켜 새 데이터를 전송할 수 있습니다. 윈도우 크기는 수신자가 데이터를 처리할 수 있는 능력을 기반으로 설정됩니다.
예시
송신자는 데이터를 1,000바이트씩 전송하고, 수신자의 수신 버퍼가 3,000바이트인 경우, 송신자는 3개의 세그먼트를 보낼 수 있습니다. 그러나 수신자가 데이터를 처리할 수 없으면, 송신자는 데이터를 더 이상 전송하지 않고 기다립니다.
2. 오류 제어 (Error Control)
목적
오류 제어는 데이터 전송 중 발생할 수 있는 오류를 탐지하고 복구하는 기능입니다. 이는 데이터의 정확성을 보장하며, 네트워크 전송 중 손실되거나 변형된 데이터를 처리하는 역할을 합니다.
작동 방식
오류 제어는 주로 TCP에서 제공되며, 오류를 감지하고 복구하는 메커니즘을 포함합니다.
오류 탐지(Error Detection)
체크섬(Checksum)은 송신자가 데이터를 보내기 전에 계산하여 추가하는 값입니다. 수신자는 데이터를 받은 후 체크섬 값을 다시 계산하여 송신자가 보낸 체크섬과 일치하는지 확인합니다. 만약 두 값이 일치하지 않으면, 데이터가 전송 중 오류가 발생했음을 의미하고, 송신자는 데이터를 재전송합니다.
오류 복구(Error Recovery)
오류가 발견되면, 재전송 메커니즘이 시작됩니다.
TCP의 재전송: 송신자는 데이터가 제대로 전송되었는지 확인하기 위해 ACK(확인 응답) 패킷을 사용합니다. 만약 송신자가 일정 시간 동안 ACK를 받지 못하면, 타임아웃(timeout)이 발생하고, 송신자는 해당 데이터를 다시 전송합니다.
중복 ACK: 수신자가 중복된 ACK를 보내는 경우, 송신자는 데이터가 손실되었음을 인지하고 재전송합니다.
시퀀스 번호(Sequence Number)
TCP는 데이터가 정확한 순서대로 전송되도록 보장하기 위해 시퀀스 번호를 사용합니다. 각 세그먼트에는 고유한 시퀀스 번호가 할당되어, 수신자가 패킷을 올바른 순서로 재조립할 수 있게 합니다. 만약 데이터가 손실되거나 순서가 틀렸다면, 수신자는 중복된 ACK나 타임아웃을 통해 송신자에게 재전송을 요청합니다.
자동 재전송 요청(ARQ: Automatic Repeat Request)
ARQ는 오류가 발생한 경우 자동으로 데이터를 재전송하는 프로토콜입니다. TCP에서는 ARQ 방식이 구현되어 있어, 데이터가 손실되면 재전송을 요청하고, 재전송된 데이터는 오류 없이 전송될 때까지 계속 시도됩니다.
'TIL(Today I Learned)' 카테고리의 다른 글
인덱스 (0) | 2024.12.20 |
---|---|
IOCP (0) | 2024.12.19 |
OSI 네트워크 계층 (0) | 2024.12.17 |
라우터와 라우팅 (0) | 2024.12.13 |
DNS, 3-way Handshake, SSL/TLS (0) | 2024.12.12 |