TCP (Transmission Control Protocol)
인터넷 프로토콜 스위트의 핵심 프로토콜 중 하나고, 신뢰성 있는 데이터 전송을 보장함.
TCP는 송신자와 수신자가 데이터를 손실 없이 정확히 교환하도록 설계되어 있음.
주로 웹 브라우징, 이메일 전송, 파일 다운로드와 같은 상황에서 사용됨.
연결 지향적 프로토콜
연결을 설정하고 종료할 때 핸드셰이크 절차를 거침.
데이터 전송 중에는 패킷이 손실되면 자동으로 재전송 -> 수신자는 데이터를 순서대로 받을 수 있도록 함.
흐름 제어와 혼잡 제어 기능
네트워크 성능을 유지하고 패킷 손실을 줄임.
흐름 제어는 송신 속도를 조절해 수신자의 버퍼 오버플로우를 방지
혼잡 제어는 네트워크의 혼잡도를 줄이기 위해 송신량을 조절
TCP의 단점
과정이 복잡하고, 패킷 손실 시 재전송으로 인해 지연이 발생할 수 있음
그러나 높은 신뢰성을 제공해 대다수의 인터넷 애플리케이션에서 기본 통신 프로토콜로 사용됨.
Handshake
네트워크 통신에서 두 장치(클라이언트와 서버)가 연결을 설정하기 위해 수행하는 초기 절차
클라이언트와 서버가 서로를 인식하고, 데이터를 교환할 준비가 되었음을 확인하는 과정
주로 TCP나 TLS와 같은 프로토콜에서 사용
핸드셰이크 과정은 프로토콜에 따라 다르며, 대표적인 예로 TCP의 3-way 핸드셰이크가 있음.
클라이언트는 서버로 SYN 패킷을 보내 연결을 요청하고,
서버는 이를 확인 후 SYN-ACK 패킷을 클라이언트에 응답함.
마지막으로 클라이언트가 ACK 패킷을 보내면 연결이 성립됨.
핸드셰이크는 보안 통신에서도 중요한 역할을 함.
TLS에서는 클라이언트와 서버가 서로의 신원을 확인하고 암호화 키를 교환하는 TLS 핸드셰이크가 이뤄짐.
이를 통해 두 통신 장치는 안전하게 데이터를 주고받을 수 있음.
TCP와 HTTP/2의 통신 순서
HTTP/2는 TCP 위에서 작동하므로, TCP 연결이 먼저 설정된 후 HTTP/2 프로토콜이 해당 연결을 통해 데이터를 전송함.
1. TCP 3-Way Handshake
TCP는 연결 지향 프로토콜로, 통신을 시작하기 전에 3-Way 핸드셰이크를 통해 연결을 설정함. 과정은 다음과 같음:
- SYN: 클라이언트가 서버에게 연결 요청을 보내기 위해 SYN 패킷을 전송함.
- SYN-ACK: 서버가 클라이언트의 요청을 수락하고 응답으로 SYN-ACK 패킷을 보냄.
- ACK: 클라이언트가 서버로 ACK 패킷을 보내 연결이 설정됨. 이후 클라이언트와 서버 간의 데이터 전송이 가능해짐.
이 과정을 통해 신뢰성 있는 연결이 성립되면 HTTP/2 프로토콜이 이 TCP 연결을 사용해 데이터를 전송할 수 있게 됨.
2. HTTP/2 통신 순서
HTTP/2는 TCP 연결이 설정된 후 멀티플렉싱, 헤더 압축, 서버 푸시 등 다양한 기능을 통해 효율적으로 데이터를 전송함. HTTP/2의 통신 과정은 다음과 같음:
- 프레임(Frame) 전송: HTTP/2는 모든 데이터를 프레임 단위로 나누어 전송함. 요청과 응답은 **스트림(stream)**이라는 독립적인 채널로 나뉘고, 각각의 스트림은 여러 프레임으로 구성됨. 이 프레임들은 TCP 연결 위에서 멀티플렉싱되어, 한 번의 연결에서 동시에 여러 요청과 응답을 주고받을 수 있음.
- 헤더 압축: HTTP/2는 HPACK 알고리즘을 사용해 헤더를 압축함. 클라이언트와 서버는 각 프레임의 헤더를 압축하여 전송하며, 이를 통해 네트워크 대역폭 사용량을 줄임.
- 서버 푸시(Server Push): 서버는 클라이언트 요청이 없더라도 관련 리소스를 미리 전송할 수 있음. 예를 들어, HTML 문서 요청 시 CSS와 JavaScript 파일을 함께 전송해 클라이언트가 리소스를 미리 로드하도록 함.
3. 데이터 전송 및 연결 종료
HTTP/2는 TCP 연결이 끊기기 전까지 여러 요청을 반복적으로 주고받음. 데이터를 전송한 후에는 TCP 연결을 유지한 채 새로운 요청을 수행할 수 있으며, 모든 데이터 전송이 완료된 후에는 TCP 4-Way 핸드셰이크로 연결을 종료함.
- FIN: 클라이언트가 연결을 종료하기 위해 FIN 패킷을 전송함.
- ACK: 서버가 FIN 패킷을 받아들여 ACK 패킷으로 응답함.
- FIN: 서버가 연결을 종료하기 위해 FIN 패킷을 클라이언트로 보냄.
- ACK: 클라이언트가 ACK 패킷을 보내 연결이 종료됨.
TCP 핸드셰이크와 HTTP/2의 프레임 전송을 통해 클라이언트와 서버 간에 빠르고 효율적인 데이터 전송이 이루어짐.
UDP (User Datagram Protocol)
TCP와 달리 비연결형 프로토콜
신뢰성보다는 빠른 전송 속도를 우선시하며, 데이터가 순서에 관계없이 전달될 수 있음.
주로 스트리밍, 온라인 게임, VoIP 등 실시간 성이 중요한 애플리케이션에서 사용됨.
UDP는 연결 설정이나 핸드셰이크가 없고, 단순히 데이터를 데이터그램 단위로 전송함.
패킷이 손실되거나 순서가 바뀌어도 재전송이나 재정렬을 수행하지 않으며,
이를 통해 TCP보다 훨씬 적은 오버헤드를 가짐.
UDP는 수신자 측에서만 데이터를 수신했는지 확인할 수 있음.
빠르긴 하나, 패킷 손실이나 순서 오류가 발생할 수 있는 환경에서는 신뢰성 보장 기능이 없어 제한적임.
UDP와 HTTP/3의 통신 순서
HTTP/3는 TCP 대신 UDP를 기반으로 작동하며, 주로 QUIC 프로토콜을 사용해 연결 설정 및 데이터 전송을 관리함.
UDP는 비연결형 프로토콜이지만, HTTP/3는 QUIC을 통해 연결 설정 및 데이터 전송의 신뢰성을 보장함.
1. QUIC Handshake (HTTP/3의 연결 설정)
HTTP/3는 UDP 위에서 QUIC 프로토콜을 사용해 연결을 설정함. QUIC은 TCP와 달리 핸드셰이크 과정이 간소화되어 더 빠르게 연결을 설정할 수 있음.
- 초기 클라이언트 헬로(Client Hello): 클라이언트는 서버에 QUIC 연결을 요청하기 위해 Client Hello 패킷을 보냄. 이 패킷에는 암호화 및 인증에 필요한 초기 데이터를 포함함.
- 서버 헬로(Server Hello): 서버는 클라이언트의 요청을 수신하고, 응답으로 Server Hello 패킷을 보냄. 이를 통해 양측은 보안 설정을 완료하고 암호화 키를 교환함.
- 완료 후 데이터 전송 가능: 초기 패킷 교환만으로 연결 설정과 암호화가 완료되므로, 클라이언트와 서버는 거의 즉시 데이터 전송을 시작할 수 있음.
QUIC 핸드셰이크는 기존의 TCP 핸드셰이크 및 TLS 설정보다 효율적이며, 연결 설정 시간을 크게 단축함.
2. HTTP/3 데이터 전송
QUIC 연결이 설정되면, HTTP/3는 이 연결을 사용해 데이터를 전송함. HTTP/3는 HTTP/2와 마찬가지로 스트림과 프레임을 사용하지만, UDP 기반 QUIC을 통해 더 빠르고 효율적인 전송이 가능함.
- 스트림 멀티플렉싱(Multiplexing): HTTP/3는 QUIC의 스트림 기능을 사용해, 하나의 연결에서 여러 스트림을 동시에 전송함. 스트림 간 독립성이 보장되므로, 하나의 스트림에서 패킷 손실이 발생해도 다른 스트림에 영향을 주지 않음.
- 헤더 압축 및 전송: HTTP/3는 HTTP/2와 같이 HPACK 대신 QPACK이라는 헤더 압축 방식을 사용함. QPACK은 HTTP/3에서 멀티플렉싱을 고려한 방식으로, 각 프레임의 헤더를 압축해 대역폭 사용을 줄이고 전송 속도를 향상시킴.
- 서버 푸시(Server Push): HTTP/3는 서버가 클라이언트 요청이 없어도 관련 리소스를 미리 전송할 수 있는 서버 푸시 기능을 지원함. 예를 들어, HTML 문서를 요청하면 필요한 CSS와 JavaScript 파일을 서버가 미리 전송해 클라이언트가 더 빠르게 로드할 수 있게 함.
3. 연결 종료
HTTP/3는 데이터 전송이 완료되면 QUIC 연결을 종료함. UDP는 본래 비연결형이지만, QUIC은 연결 설정과 해제 과정을 지원함.
- 종료 요청: 클라이언트 또는 서버가 QUIC 연결을 종료하고자 할 때, 종료 요청 패킷을 보냄.
- 확인 후 연결 종료: 상대방이 해당 요청을 수락하고 확인 응답을 보내면, 연결이 안전하게 종료됨.
UDP 위에서 QUIC과 HTTP/3 프로토콜이 결합되면서, HTTP/3는 TCP 기반 HTTP/2보다 더 빠르고 안정적인 연결 설정과 데이터 전송을 제공함. HTTP/3는 특히 패킷 손실이 발생하기 쉬운 모바일 환경에서 더 나은 성능을 발휘함.
'[프로그래밍] CS' 카테고리의 다른 글
[Computer Science] 엔드포인트 규칙 (2) | 2024.11.03 |
---|---|
[Computer Science] IP (0) | 2024.11.01 |
[Computer Science] HTTP (Hyper Text Transfer Protocol) (2) | 2024.11.01 |
[Computer Science] 데이터 모델 (0) | 2024.05.09 |
[Computer Science] 프론트엔드 사이드를 구성하는 요소 (0) | 2024.05.05 |