네트워킹의 핵심 원칙 중 하나는 통신 과정이 완벽하게 신뢰할 수 없다는 것입니다. 어떤 네트워크 환경에서든, 데이터 패킷은 다양한 이유로 손실되거나 손상될 수 있으며, 때로는 목적지에 도달하지 못할 수도 있습니다.
패킷 손실이나 손상은 여러 원인에 의해 발생할 수 있습니다. 전송 중에 발생하는 전기적인 문제로 인해 비트가 반전될 수 있으며, 네트워크의 링크, 라우터 등 시스템 구성요소의 고장으로 인해 발생하기도 합니다. 또한, 네트워크 스위치나 라우터, 또는 연결의 종단점에서 충분한 버퍼링이 이루어지지 않아 발생하는 경우도 흔합니다. 실제로 모든 시스템 구성요소가 제대로 동작하고 있더라도, 라우터의 메모리가 과부하 상태가 되면, 들어오는 패킷을 모두 처리할 수 없게 되어 일부 패킷을 포기해야 할 상황에 직면할 수 있습니다.
어떤 응용 프로그램들은 패킷 손실에 대한 자체적인 대응 방법을 가지고 있습니다. 예를 들어, UDP/IP 네트워크 스택은 패킷 손실 시 특별한 조치를 취하지 않는 방법 중 하나입니다. UDP는 손실에 대해 알 수 없지만, 패킷 손상은 체크섬을 통해 검출할 수 있습니다. 그러나 대부분의 응용 프로그램은 패킷 손실 없이 데이터를 전송하기를 원하기 때문에, 신뢰할 수 있는 통신 방법이 필요합니다.
신뢰할 수 있는 통신 계층을 구현하기 위해서는, 패킷 손실에 대응할 수 있는 새로운 메커니즘이 필요합니다. 이를 위해 '확인(acknowledgement)'과 '타임아웃(timeout)'이라는 두 가지 기술이 도입됩니다.
확인(Acknowledgement): 발신자는 수신자에게 메시지를 보내고, 수신자는 메시지를 받았다는 응답을 발신자에게 보냅니다. 발신자가 이 응답을 받지 못하면, 메시지가 손실되었다고 판단하고 재전송을 시도합니다.
타임아웃(Timeout): 메시지 전송 시, 발신자는 타이머를 설정합니다. 지정된 시간 내에 응답을 받지 못하면, 메시지를 재전송합니다.
신뢰할 수 있는 통신에서는 중복 메시지의 처리도 중요합니다. 발신자는 각 메시지에 고유 ID(예: 순서 카운터)를 부여하고, 수신자는 이를 통해 메시지가 중복되었는지를 판단합니다. 중복된 메시지를 받은 경우, 수신자는 ack를 보내지만, 해당 메시지를 응용 프로그램에는 전달하지 않습니다.

TCP는 인터넷 상에서 데이터를 신뢰성 있게, 순서대로, 에러 없이 전송하기 위해 설계된 연결 지향적 프로토콜입니다.
UDP는 비연결 지향적 프로토콜로, TCP보다 단순하며 오버헤드가 적습니다. 데이터를 데이터그램 단위로 처리합니다.
실시간 응용 프로그램: 비디오 스트리밍, 온라인 게임 등 지연 시간이 중요한 응용 프로그램에서 사용됩니다. 데이터 일부가 손실되더라도 전체 서비스에 큰 영향을 주지 않는 경우에 적합합니다.
DNS 조회: 작은 데이터 패킷을 빠르게 주고받아야 하는 DNS 조회에 주로 사용됩니다.
연결 설정: TCP는 연결을 설정해야 하지만, UDP는 설정 없이 데이터를 바로 전송합니다.
신뢰성: TCP는 데이터의 순서, 무결성, 신뢰성을 보장하지만, UDP는 보장하지 않습니다.
속도: TCP는 오버헤드가 더 많고, 데이터 전송 속도가 UDP보다 느릴 수 있습니다.
사용 사례: TCP는 이메일, 웹 페이지 로딩과 같은 신뢰성이 중요한 통신에 사용됩니다. 반면, UDP는 실시간 스트리밍, 온라인 게임 등 지연 시간이 더 중요한 응용 프로그램에 사용됩니다.