TCP는 신뢰성 있는 데이터 송수신을 위한 연결 지향형 프로토콜입니다. 데이터의 순서를 보장하고 흐름제어와 혼잡제어를 수행합니다. 이러한 기능들을 제공하기에 약간의 오버헤드가 발생합니다.
UDP는 비연결형 프로토콜로, 별도의 연결 수립 과정 없이 데이터를 전송합니다.
데이터의 도착 여부나 순서, 중복 제거를 보장하지 않지만 구조가 단순하고 오버헤드가 적습니다.
UDP는 신뢰성을 보장하지 않는데 왜 사용하나요?
UDP는 연결 수립, ACK, 재전송, 흐름 제어, 혼잡 제어 등의 기능을 자체적으로 제공하지 않기 때문에 TCP보다 프로토콜의 구조가 단순하고 오버헤드가 작습니다.
따라서 일부 데이터가 유실되더라도 빠르게 새로운 데이터를 전달하는 것이 더 중요한 실시간 음성·영상 통신 등에 적합할 수 있습니다.
또한 UDP를 사용한다고 해서 반드시 신뢰성을 포기해야 하는 것은 아닙니다. 필요한 경우 QUIC처럼 UDP 위의 상위 프로토콜에서 재전송이나 혼잡 제어 등의 기능을 별도로 구현할 수도 있습니다.
TCP가 Byte Stream이라는 것은 무슨 뜻인가요?
TCP는 애플리케이션이 보낸 데이터를 개별 메시지가 아니라 연속된 바이트의 흐름으로 취급한다는 의미입니다.
따라서 송신 측에서 데이터를 두 번에 나누어 전송했다고 해서 수신 측에서도 반드시 동일한 두 번의 단위로 읽히는 것은 아닙니다.
예를 들어 송신 측에서
ABC와DEF를 각각 전송해도 수신 측에서는ABCDEF를 한 번에 읽거나AB,CDEF처럼 나누어 읽을 수도 있습니다.때문에 TCP 기반으로 애플리케이션 프로토콜을 직접 설계한다면 길이 정보나 구분자 등을 사용하여 메시지의 경계를 직접 정의해야 합니다.
UDP도 TCP처럼 메시지 경계를 직접 구분해야 하나요?
UDP는 데이터그램 단위를 보존하므로 TCP처럼 바이트 스트림에서 메시지 경계를 다시 찾을 필요는 없습니다. 다만 수신 API에 제공한 버퍼가 작으면 데이터그램이 잘릴 수 있고, 하나의 업무 메시지를 여러 데이터그램으로 나눴다면 재조립은 애플리케이션 책임입니다. HTTP·SSE·WebSocket의 메시지 경계와도 구분합니다. Linux UDP 소켓 설명
TCP의 연결 지향과 UDP의 비연결은 무슨 뜻인가요?
TCP의 연결 지향은 데이터를 전송하기 전에 송신자와 수신자 사이에 논리적인 연결을 수립하고, 통신하는 동안 양쪽이 연결에 필요한 상태 정보를 관리한다는 의미입니다.
예를 들어 TCP는 연결별로 Sequence Number, 송수신 버퍼, 윈도우 크기 등의 상태를 관리합니다.
반면 UDP는 이러한 연결 상태를 만들거나 유지하지 않고 목적지 IP와 Port를 지정하여 각각의 Datagram을 독립적으로 전송합니다.
TCP가 연결을 수립하는 구체적인 과정은 3-Way Handshake를 통해 이루어집니다.
TCP가 신뢰성을 보장한다면 서버가 요청을 처리했다는 것도 보장하나요?
아닙니다. TCP ACK는 상대 TCP가 바이트를 받았다는 의미이며 비즈니스 로직 실행이나 DB 커밋을 보장하지 않습니다. 요청 처리 후 응답만 유실될 수도 있으므로, 재시도에는 멱등성과 처리 결과 확인이 필요합니다.