TCP
- Transmission Control Protocol은 연결 기반 프로토콜.
- 두 노드 간에 연결을 먼저 맺은 뒤 데이터를 주고 받는다.
- TCP에서 두 노드가 연결을 맺기 위한 과정을 3-Way Handshake 라 부른다.
sequenceDiagram
client->>server: SYN
server-->>client: SYN-ACK
client->>server: ACK
- TCP의 장점은 신뢰성.
- TCP는 패킷 순서를 보장하고 패캣이 유실될 경우 재전송하는 기능 제공하여 안정적으로 데이터 전송 가능.
- 이런 이유로 애플리케이션 계층의 HTTP, SMTP 같은 많은 프로토콜이 TCP 기반으로 동작함.
- TCP가 전송을 보장하기 위해 사용하는 시퀀스 번호, 확인 응답, 재전송 등이 추가되면서 전송속도는 UDP 대비 느리다.
- 예를 들어 일부 패킷이 유실되면 해당 패킷이 도착할 때까지 이후 패킷 제대로 처리 못하는 HOL Blocing(Head-of-Line Blocking)문제가 있는데 전체적인 전송속도를 저하시킨다.
UDP
- 응답 확인이나 패킷 정렬같은거 안해서 전송속도가 TCP 대비 빠름.
- 이런 이유로 UDP는 속도가 중요하거나 일부 데이터가 유실되더라도 문제되지 않는 통신에 주로 사용.
- UDP 사용 예로는 DNS, VolP, Game등
QUIC
- TCP는 신뢰성있지만 느리고 UDP는 빠르지만 신뢰성이 없다.
- 이 둘은 합쳐 빠르면서 신뢰성 있는 프로토콜이 있으면 얼마나 좋을까?
- 이런 목적으로 개발된 프로토콜이 바로 QUIC.
- QUIC는 UDP 기반. TCP의 연결 관리 기능은 QUIC 프로토콜 수준에서 제공.
- 예를 들어 QUIC 는 데이터에 ID(Connection ID)를 포함시키는데, 이 연결 ID 이용해서 두 노드간의 연결을 유지함.
- 또한 TCP의 혼잡 제어나 패킷 유실 복구 같은 기능을 QUIC 프로토콜 수준에서 제어한다.
- QUIC는 TLS(Transport Layer Security)를 통합함.
- QUIC 패킷은 기본적으로 암호화되어 전송된다.
- 또 TCP 기준의 HTTPS는 TPC 연결 위한 3-way handshake와 TLS연결 위한 TLS Handshake를 진행해서 여러 차례 통신 뒤 연결이 수립되는데 QUIC는 이를 통합해서 이 과정을 단축함.
- HTTP/3 프로토콜은 QUIC를 기반으로함.

- QUIC는 멀티플렉싱 지원한다. QUIC는 한 연결에서 여러 스트림을 동시에 처리 가능.
- 여러 스트림 동시 처리 하므로 1개의 스트림에서 HOL 블로킹 발생해도 다른 스트림에 영향 안줌.
- 참고로 HTTP/2 도 멀티플렉싱 지원하지만 TCP 자체에서 발생하는 HOL 블로킹 문제는 해결 못한다.
- 포트 번호는 부호 없는 16비트 정수 씀. 즉 2의 16제곱까지 인데 65535까지됨. 이거 때문에 저 포트개수가 한계인걸로 오해하는 경우 많음.
- 실제 한 장비에서 생성 가능한 TCP 연결 개수는 2의 96제곱임
- TCP 각 연결은 (로컬IP, 로컬 포트, 원격IP, 원격 포트)로 구분. IP는 32비트, 포트는 16비트.
- 따라서, ㄹㅊ한 장비가 가능한 연결개수는 이론적으로
2^16 * 2^32(원격IP) * 2^16 = 2^44
- 엄청 크다. 하나의 로컬IP의 1개 포트에 연결할 수 있는 TCP 연결 개수가 65,535인것.