TCP(Transmission Control Protocol)
UDP(User Datagram Protocol)
TCP와 UDP는 OSI 모델 4계층인 전송 계층에 속하는 프로토콜들이다. 같은 transport protocol이지만 이 두 프로토콜엔 차이가 존재한다.
OSI 4계층, Transport Layer
4계층은 목적지 단말 안에서 동작하는 여러 애플리케이션 프로세스 중 통신해야 할 목적지 프로세스를 정확히 찾아가고, 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내기 위한 역할을 한다.
TCP(Transmission Control Protocol)
TCP는 네트워크상으로 데이터를 전송할 때 사용되는 신뢰성있는(reliable) 연결 기반(connection-oriented) 프로토콜이다. TCP는 데이터 전달의 정확성과 올바른 순서를 보장한다.
기본적인 웹브라우징에 사용되는 HTTP 또한 TCP 기반이다. 클라이언트와 서버는 HTTP 요청/응답을 본격적으로 교환하기 전에, 우선 먼저 TCP 연결을 성사시켜야하며, 이를 TCP 3way handshakes라고 부른다. 이와 관련해선 이전 포스팅에 상세한 설명을 적어놓았다:
HTTP에 대한 상세한 사항은 아래 글들에 있다:
2021.10.01 - [Learn to Code] - HTTP란?
2021.10.24 - [Learn to Code] - HTTP/1.1 vs. HTTP/2
1. 신뢰성(Reliability)
TCP는 acknowledgment 기능을 가지고 있다. 데이터를 전달받는 측에서 데이터를 받았을 경우 "저 받았어요~"하고 답신을 보내주는 것이다. 만약 데이터 패킷이 중간에 소실되었거나 순서와 다르게 도착한다면, TCP는 해당 데이터를 전달받는 측에 다시 보내게(retransmit) 된다. 이를 통해 데이터 신뢰성이 확보될 수 있다.
Q. 데이터 패킷(Data packet)이란?
네트워크 상에서 전송되는 데이터의 유닛을 뜻한다. 데이터 그 자체에 대한 실제 정보와 이를 올바르게 전달하기 위한 추가 정보가 포함된 패키지라고 생각하면 된다.
Q. 어떤 경우에 ACK가 오지 않을까?
- 데이터 패킷 실종 (congestion, interference와 같은 이슈)
- 네트워크 딜레이
- 받는 측 서버 다운
- 방화벽, 필터링 등
2. 연결 지향적(Connection-oriented)
TCP는 데이터를 전송하기 전에 연결을 먼저 형성한다. 이는 three-way handshake라는 절차를 통해 진행된다. 이를 통해 데이터를 전송하는 측과 받는 측이 모두 데이터 교환을 할 준비가 되었다는 것이 보장되었을 때 본격적인 데이터 전송이 시작된다.
Three-way handshake란 클라이언트와 서버간 연결을 확립하기 위해 TCP가 사용하는 필수적인 절차이다. 클라이언트와 서버 모두가 신뢰성있고 순서를 지키는 방식으로 데이터를 교환할 준비가 되었는지 확인하는 것이다. Three-way handshake는 아래 3가지 단계를 거친다:
1. SYN(Synchronize)
- 클라이언트가 SYN 플래그가 추가된 TCP segment를 서버에 보낸다.
- 이 segments엔 클라이언트가 연결을 시작하고 싶다는 의도가 담겨있다.
- 또한, 클라이언트는 랜덤한 초기 시퀀스 넘버(ISN, initial sequence number)를 생성한다.
2. SYN-ACK(Synchronize-Acknowledge)
- 서버가 클라이언트로부터 전송된 SYN segment를 받는다.
- 서버는 SYN 플래그와 ACK 플래그가 담긴 TCP segment로 응답한다.
3. ACK(Acknowledge)
3. 데이터 순서 보장(Ordered delivery)
TCP는 데이터 패킷들이 보내진 순서대로 받아질 수 있도록 보장한다. 그래서, 데이터의 integrity나 순서가 중요한 서비스의 경우 사용하기에 알맞다.
4. 플로우 컨트롤(Flow control)
TCP는 받는 측에서 데이터를 한번에 너무 많이 받아 병목현상이 생기는 일을 방지하기 위해서 데이터 플로우를 컨트롤한다. 이를 통해 data congestion을 예방할 수 있다.
UDP(User Datagram Protocol)
UDP는 최소한의 에러 확인과 데이터 패킷의 전송을 보장하지 않는(?!) 가벼운(lightweight) 비연결성(connectionless) 전송 프로토콜이다. 주로, 데이터의 100% 전송 여부보다 실시간성의 우선순위가 높은 서비스에서 주로 사용된다.
1. 비연결성(Connectionless)
TCP와는 다르게, UDP는 데이터를 전송하기 전에 먼저 연결을 만들지 않는다. 그렇기 때문에 각 UDP 패킷은 독립적으로 다루어진다.
2. Low overhead
UDP는 TCP에 비해 오버해드가 적다. TCP에 있는 에러 체킹이나 acknowledgment가 UDP에는 없기 때문이다. 그래서 속도에 있어서 이점이 있다.
3. 데이터 전송이 보장되지 않는다
UDP를 전달받는 측은 데이터를 전달 받았을 때 전달받았다는 acknolwedgment를 보내지 않는다. 마찬가지로, 데이터 잘 전달받았다는 내용을 보낸 측에서 알 수 없기 때문에 "이게 안갔나?" 하고 다시 보내는 일(=retransmission)도 UDP에선 일어나지 않는다. 그래서, 데이터가 중간에 소실되어 도착하지 않았거나 아니면 순서가 뒤죽박죽 섞여 도착한 경우, TCP와는 다르게 UDP가 이를 복구하기 위한 절차를 진행하지 않기 때문에 앱에서 순서를 맞추는 일을 진행해야 한다.
4. 순서 보장이 되지 않는다
UDP는 데이터 패킷의 순서가 보낸이 마음처럼 보내지지 않을 수 있다. 만약 순서가 중요한 서비스를 개발해야할 경우엔 앱에서 이를 직접 관리해야한다.
5. 데이터 에러 감지 기능
TCP는 checksum을 사용해서 받은 데이터에 문제가 있는지 확인하는 기능이 있다. 여기서 말하는 발견 가능한 에러란 여러 종류가 있을 수 있는데, 패킷 자체가 실종되는 경우이거나 아니면 비트 에러(bit error), 데이터 오염(data corruption) 등이 있을 수 있다. 비트 에러는 패킷에 포함된 바이너리 데이터가 실제 전달받은 데이터와 다를 경우를 뜻하며 데이터 오염은 전기자기장 방해나 소음, 아니면 전송 중 발생할 수 있는 다른 여러 요소들에 의해 발생할 수 있다.
TCP와 UDP 비교
기능 | TCP | UDP |
신뢰성 | 데이터 전달 잘받았다는 답변이 있으며, 신뢰성이 있다 | 데이터 전달이 보장되지 않으며 확신도 보내지 않는다 |
연결지향 여부 | 연결기반 (three-way handshake) | 비연결 |
데이터 순서 보장 | YES | NO |
플로우 컨트롤 | YES | NO (네트워크 congestion 발생 가능) |
오버해드 | acknowledgement가 필요하기 때문에 오버해드가 큼 | 적음 |
사용처 | 웹 브라우징, 이메일, 파일 전송 등 | 미디어 스트리밍, 온라인 게임, VoIP 등 |
속도 vs. 신뢰성 | 신뢰성의 우선순위가 높다 | 속도의 우선순위가 높다 |
'Learn to Code' 카테고리의 다른 글
[Next.js] 버전 13+으로 업데이트하기 (0) | 2023.10.07 |
---|---|
[React] 커스텀훅(Custom Hook) (0) | 2023.08.16 |
클라이언트 사이드 렌더링 vs. 서버 사이드 렌더링 (CSR vs. SSR) (0) | 2023.08.03 |
이벤트 버블링(Event Bubbling)이란? (0) | 2023.07.27 |
레이지로딩(lazy loading)이란? (0) | 2023.07.27 |
댓글