경험 중심 1인칭 답변
TCP는 연결 지향 프로토콜로, 데이터 전송 전 3-way handshake로 연결을 수립하고 신뢰성을 보장합니다. 패킷 손실 시 재전송하고, 순서를 보장합니다. 반면 UDP는 비연결성으로 handshake 없이 데이터를 바로 전송합니다. 신뢰성 보장이 없어 손실이 발생할 수 있지만, 오버헤드가 작아 실시간 스트리밍이나 게임처럼 속도가 우선시되는 상황에 적합합니다.
HTTP 버전별 차이를 정리하면 다음과 같습니다. HTTP/1.1은 요청마다 TCP 연결을 재사용(keep-alive)하지만, 요청-응답이 순서대로 처리되는 HOL blocking이 있습니다. HTTP/2는 멀티플렉싱으로 하나의 TCP 연결에서 여러 요청을 동시에 처리합니다. 또 헤더 압축(HPACK)으로 오버헤드를 줄이고, 서버 푸시도 지원합니다. 단, TCP 레벨의 HOL blocking은 여전히 존재합니다.
HTTP/3는 UDP 기반의 QUIC 프로토콜을 사용합니다. TCP의 연결 수립 지연 없이 빠르게 연결하고, 패킷 손실이 다른 스트림에 영향을 주지 않아 TCP 레벨 HOL blocking도 해결됩니다. 불안정한 네트워크 환경에서 특히 효과적입니다.
실제 트러블슈팅 사례로는, HTTP/2를 적용한 API 서버에서 특정 요청이 지연되는 현상을 경험했는데, 분석 결과 하나의 연결에 스트림이 과도하게 몰려 max concurrent streams 한도에 걸리는 문제였습니다. 연결 수를 늘리는 방향으로 해결했습니다.