UDP와 TCP는 둘 다 전송 계층 프로토콜로, 데이터를 네트워크를 통해 보내는 방식을 정의한다.
✅ UDP (User Datagram Protocol)
: 신뢰성 없는 비연결형 프로토콜
📍특징
- 비연결성: 연결 설정 없이 데이터를 보냄
- 신뢰성 없음: 순서가 바뀌거나, 중간에 데이터가 사라질 수 있음
- 빠른 속도: 연결 설정 없이 데이터가 전송되고, 헤더가 간단하여 처리 시간이 짧음
- 낮은 오버헤드: 간단한 프로토콜 구조로, CPU와 메모리 자원 소모가 적음
- TCP는 20Byte의 헤더 오버헤드를 갖지만, UDP는 8Byte의 오버헤드를 가짐
- 멀티캐스트 및 브로드캐스트 지원: 여러 수신자에게 데이터를 동시에 전송 가능
- 혼잡 제어 미지원: 네트워크 상태에 관계없이 데이터를 전송
속도가 빠르고, 멀티캐스트 및 브로드캐스트를 지원하기 때문에 실시간 스트리밍 서비스에 적합하다.
하지만, 데이터 전송의 신뢰성이 없다는 단점이 있다.
📍활용
- 실시간 스트리밍
- 온라인 게임
- 화상 통화
- DNS 조회
📍체크섬(checksum)
: 전송된 패킷 안의 비트 오류를 검출하는 데 사용
UDP는 비신뢰성 프로콜이므로, 기본적인 데이터 무결성을 보장하기 위해 체크섬을 사용한다.
체크섬은 전송된 데이터그램이 손상되지 않았는지 확인하는 데 사용된다.
데이터 무결성: 데이터가 변경되거나 손상되지 않도록 보장하는 것
🏷️ 계산 과정
[송신자]
- 송신하는 데이터그램을 16 비트의 데이터 단위로 나눈다
- 모든 데이터 단위를 1의 보수 연산으로 더하여 합을 구한다
- 합의 1의 보수를 체크섬으로 생성하고, 데이터그램에 추가하여 전송한다
[수신자]
- 수신된 데이터그램을 16비트의 데이터 단위로 나눈다
- 모든 데이터 단위를 1의 보수 연산으로 더하여 합을 구한다
- 합의 모든 비트가 1이면, 데이터그램의 무결성이 보장된 성공적 수신을 의미한다. 한 비트라도 0이면, 비트에 오류가 발생한 것이다.
🏷️ 한계
UDP 체크섬은 기본적인 오류 검출만 제공한다.
패킷 손실, 순서 왜곡 같은 문제는 검출할 수 없다.
또한, 각 데이터 단위에서 발생하는 오류의 합이 0이 되는 오류도 검출할 수 없다.
✅ 신뢰적인 데이터 전송의 원리
패킷 손상이 발생하는 네트워크 / 패킷 손실이 발생하는 네트워크에서 어떻게 신뢰적인 데이터를 전송할 수 있을까?
- 패킷 손상: 송신한 패킷 내부 비트들이 하위 계층에서 손상되는 경우
- 패킷 손실: 전송한 패킷이 손실되는 경우 or 전송한 패킷에 대한 확인 응답 패킷이 손실되는 경우
📍Stop-And-Wait 프로토콜 = Automatic Repeat Request(ARQ)
: 송신자가 하나의 패킷을 전송한 후, 그 패킷에 대한 ACK(긍정 응답) 또는 NAK(부정 응답)을 받기 전까지는 다음 패킷을 전송하지 않는 방식
🏷️ 특징
- 오류 검출: 체크섬(checksum)을 사용해 패킷의 비트 오류 발견
- 수신자 피드백: 수신자는 패킷을 올바르게 받으면 긍정확인 응답(ACK)을, 아니면 부정확인 응답(NAK)을 보냄
- 순서가 올바르지 않은 패킷을 수신하면, 가장 최근에 올바르게 수신한 패킷에 대한 ACK를 보냄
- 송신자의 재전송: 비트 오류가 있는 패킷을 수신하면 NAK를 송신자에게 보내고, 송신자는 이를 보고 해당 패킷을 재전송
- 송신자는 수신자가 패킷을 정확하게 수신했다는 것을 확인받기 전까지 새로운 데이터를 전송하지 않음
- 수신자가 보낸 ACK 또는 NAK 패킷 또한 손상된 경우도 송신자가 패킷 재전송
- 순서번호(squence number): 송신자와 수신자는 패킷을 구별하기 위해 패킷에 순서번호를 매김
- ARQ에서 송신자는 어떤 패킷을 송신하는지 알아야 하고, 수신자는 어떤 패킷을 수신했는지 알아야 함
🏷️ 장점
- 구현이 간단하다.
- 수신자가 과부하되는 것을 방지할 수 있다.
🏷️ 단점
- 링크 이용률이 낮다.
- 전송 속도가 느리다.
📍파이프라인 프로토콜
: 여러 개의 프레임을 연속으로 전송하고, 수신자의 ACK를 나중에 받아 처리하는 방식
Stop-and-wait 방식은 송신자가 패킷을 전송하는데 오랜 시간이 걸린다.
그리고 이러한 성능 이슈는 파이프라인 프로토콜을 통해 해결할 수 있다.
파이프라이닝에서도 패킷 손상과 손실이 발생하는데, 이러한 오류에 대해 두 가지 기본적인 접근 방법인 SR과 GBN이 있다.
🏷️ 장점
- 링크 이용률이 높다.
- 전송 속도가 빠르다.
🏷️ 단점
- 구현이 복잡하다.
- 윈도우 크기 관리, 패킷 순서 관리, 타이머 복수 관리 등
- 수신 측 버퍼가 필요하다.
1️⃣ SR(Selective Repeat)
- 송신자는 여러 패킷을 전송 가능 (슬라이딩 윈도우 사용)
- 수신자는 순서에 상관없이 도착한 패킷을 버퍼에 저장
- 오류난 패킷만 선택적으로 재전송
- 장점: 가장 효율적인 방식 (오류 있는 것만 재전송)
- 단점: 구현 복잡도 높음 (수신 버퍼, 개별 ACK 필요)
2️⃣ GBN(Go-Back-N)
- 송신자는 최대 N개의 패킷을 연속으로 전송 (슬라이딩 윈도우 사용)
- 수신자는 순서대로 도착한 패킷만 수용
- 중간에 하나라도 오류 나면 그 이후 모든 패킷을 버리고 재전송 요구
- 장점: 구현이 비교적 간단
- 단점: 패킷 하나 오류 나면 이후 전부 재전송 (비효율)
✅ TCP (Transmissioin Control Protocol)
: 신뢰성 있는 연결형 프로토콜
📍특징
- 연결형: 데이터를 보내기 전에 연결(3-way handshake) 필요
- 신뢰성 있음: 데이터가 순서대로, 정확하게 도착하는지 확인
- 흐름 제어 & 혼잡 제어: 네트워크 상황에 따라 속도 조절 가능
- 전이중(full-duplex), 점대점(point to point) 방식 사용
- 전이중: 전송이 양방향으로 동시에 일어날 수 있음
- 점대점: 각 연결이 정확히 2개의 종단점을 가짐
- 멀티캐스팅이나 브로드캐스팅을 지원하지 않음
📍3 way handshake
: TCP의 연결 성립 과정 (Connection Establishment)
TCP는 논리적인 접속을 성립하기 위해서 3 way handshake를 사용한다.
즉, 정확한 전송을 보장하기 위해 서버와 클라이언트가 세션을 수립하는 과정이다.
= 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장
SYN(synchronize sequence number) : 연결 요청 플래그
ACK(acknowledgement) : 응답
- 클라이언트는 서버에 접속을 요청하는 `SYN(M)` 패킷을 보낸다. 클라이언트는 이를 보내고 `SYN/ACK` 응답을 기다리는 `SYN_SENT` 상태가 된다.
- 서버는 클라이언트의 요청인 `SYN(M)`를 받고, 클라이언트에게 요청을 수락한다는 `ACK(M+1)`과 `SYN(N)`이 설정된 패킷을 보낸다. 이때 서버는 `SYN_RECEIVED` 상태가 된다.
- 클라이언트는 서버의 수락 응답인 `ACK(M+1)`와 `SYN(N)` 패킷을 받고 `ACK(N+1)`를 서버로 보내면 연결이 성립된다. 서버는 `ESTABLISHED` 상태가 된다.
📍4 way handshake
: TCP의 연결 해제 과정 (Connection Termination)
클라이언트와 서버 사이에 세션을 종료하기 위해 수행되는 절차이다.
- 클라이언트가 연결을 종료하겠다는 `FIN` 플래그를 전송한다
- 서버는 클라이언트의 요청인 `FIN`을 받고, 확인 메시지로 `ACK`를 보낸다
- 그리고, 데이터를 모두 보낼 때까지 `TIME_OUT` 상태가 된다
- 데이터를 모두 보내고 통신이 끝났으면 연결이 종료됐다고 클라이언트에게 `FIN` 플래그를 전송한다
- 클라이언트는 확인 메시지 `ACK`를 보낸다. 이를 받은 서버는 소켓 연결을 `close`한다.
- 클라이언트는 아직 서버로부터 받지 못한 데이터가 있을 것을 대비해 일정 시간 동안 세션을 남겨 놓고 `TIME_WAIT` 상태에서 잉여 패킷을 기다린다.
📍3가지 재전송 시나리오
🏷️ Lost ACK scenario
- 세그먼트는 수신측에 정상적으로 도착
- ACK가 손실됨
- timeout 발생
- 세그먼트 재전송
- 재전송된 세그먼트를 받은 수신 측은, 이미 수신했으므로 그냥 버림
🏷️ Premature Timeout (조기 타임아웃 시나리오)
- 송신자가 세그먼트 전송
- 수신자는 세그먼트를 올바르게 수신 후, ACK 전송
- 그런데 네트워크 지연 등으로 인해 ACK가 도착하기 전에 송신자의 타이머가 만료
- 송신자는 타이머가 만료되었다고 판단하고 재전송 수행
🏷️ Cumulative ACK (누적 확인 응답)
- 수신자는 여러 개의 세그먼트를 연속적으로 수신 후, 각 세그먼트에 대한 ACK 전송
- 첫 번째 세그먼트에 대한 ACK 손실
- 하지만 송신자는 두 번째 세그먼트에 대한 ACK는 올바르게 수신
- 송신자는 첫 번째 세그먼트도 올바르게 전송됨을 알 수 있으므로, 재전송하지 않음
📍TCP의 빠른 재전송
: 타임아웃을 기다리지 않고, 중복 ACK가 3번 연속으로 수신되면 해당 세그먼트를 즉시 재전송하는 TCP의 재전송 메커니즘
- 기본적으로 TCP는 ACK를 못 받으면 timeout 후에 재전송하는 방식임
- 그런데 타임아웃을 기다리면 너무 느리고 비효율적
- 그래서 중복 ACK가 3번 오면 손실 됐다고 판단하고 바로 재전송
[예시]
- 송신자가 세그먼트 1, 2, 3, 4를 순서대로 보냄
- 수신자가 1, 2는 정상 수신하고 세그먼트 3이 손실
- 수신자는 세그먼트 4를 받지만, 중간에 3이 없으므로 ACK 2만 계속 보냄
- 송신자는 ACK 2를 3번 연속 받으면 타이머 기다리지 않고 바로 3번 세그먼트 재전송
📍Flow Control(흐름 제어)
: 송신측과 수신 측의 데이터 처리 속도 차이를 조절해 주는 것
- 수신자가 처리 가능한 만큼만 데이터를 보내도록 함
- 수신 측에서 받을 수 있는 윈도우 사이즈는 rwnd를 이용하여 계산
- 수신자가 rwnd 값으로 자신이 수용 가능한 버퍼 크기를 송신자에게 알려줌
- 송신자는 rwnd만큼만 데이터를 전송 가능
📍Congestion Control(혼잡 제어)
: 데이터 전송량을 조절하여 네트워크가 혼잡해지지 않게 조절하는 것
cwnd(Congestion window size)를 통해서 패킷의 전송량을 조절
cwnd는 패킷 손실 혹은 패킷 손상으로 인해서 timeout 혹은 3-duplicate-ack를 받았을 때 조절하는 작업을 수행
- Slow Start: 처음엔 천천히 보내다가 점점 전송량 증가 (cwnd를 지수적으로 증가)
- Congestion Avoidance: 혼잡이 감지되기 전까지 서서히 증가 (선형 증가)
- Fast Retransmit: 세 개의 중복 ACK 수신 시, 타임아웃 기다리지 않고 바로 재전송
- Fast Recovery: 혼잡이 발생한 경우, cwnd를 줄인 후 천천히 증가 (slow start로 안 돌아가고 조정)
'⚙️ CS' 카테고리의 다른 글
[운영체제] 시스템 콜 & 인터럽트 (0) | 2025.04.15 |
---|---|
[네트워크] IP 주소 & 서브넷 & 라우팅 (1) | 2025.04.10 |
[네트워크] XSS, CSRF, SQL Injection & 웹 캐시와 프록시 서버 (1) | 2025.03.28 |
[네트워크] HTTP 상태유지 기술 & SOP와 CORS & REST (2) | 2025.03.28 |