[핵심 답변]
TCP는 연결형, 신뢰성 전송 프로토콜 입니다. 연결지향적 서비스를 제공하기 위해 데이터를 전송하기 전에 3way handsaking을 하여 두 호스트의 전송 계층 사이에 논리적 연결을 설립합니다. 신뢰성 있는 서비스를 제공하기 위해 오류제어, 흐름제어, 혼잡제어 등을 실행합니다. 신뢰성을 보장하기 위해서 header가 더 크고 속도가 비교적 느리다는 단점이 있습니다.
UDP는 비연결형 프로토콜로 3-way handshake 등의 세션 수립 과정이 없습니다. 또한 비신뢰성 프로토콜로 흐름제어, 오류제어, 혼잡 제어를 제공하지 않습니다. 이러한 단순성 덕분에 적은 양의 오버헤드갖고 수신여부를 확인하지 않아서 속도가 빠릅니다
TCP는 신뢰성이 중요한 통신(HTTP, File 전송 등)에 쓰이고, UDP는 실시간성이 중요한 통신(동영상 스트리밍 등)에 주로 사용됩니다.
[면접
TIP]
TCP/UDP의 차이점을 묻는 질문이 종종 나옵니다. 특히 네트워크 관련 회사와 통신이 중요한 회사의 경우에는 자주 나오는 질문중 하나 입니다.
깊은 내용까지 잘 파고들지 않기 때문에 TCP/UDP 각각의 장점, 단점 그리고 활용 정도에 주안점을 두고 공부하시면 충분히 답변하실 수 있습니다.
TCP/IP 전송계층
TCP/IP는 인터넷에서 사용하는 프로토콜 그룹을 칭합니다. TCP/IP는 Application layer(응용계층), Transport layer(전송계층), Network layer, Data link layer, Physical layer로 5개의 계층으로 나뉩니다.
그 중에 전송계층은 두 응용 계층 사이에서의 process-to-process 통신을 제공합니다. 전송계층은 응용계층으로부터 메시지를 받아 전송계층 패킷으로 캡슐화하여 전송합니다.(segment 또는 datagram으로 부릅니다.)
전송계층의 주된 프로토콜은 TCP, UDP입니다. TCP(Transmission Control Protocol)는 연결형, 신뢰성 전송 프로토콜입니다. TCP로 전송하는 패킷을 segment라고 부릅니다. UDP(User, Datagram Protocol)는 비연결형, 비신뢰성 전송 프로토콜입니다. UDP로 전송하는 패킷을 datagram이라고 합니다.
TCP(Transfer Control Protocol)
TCP는 연결형, 신뢰성 전송 프로토콜입니다.
연결지향적 서비스를 제공하기 위해 데이터를 전송하기 전에 먼저 두 호스트의 전송 계층 사이에 논리적 연결을 설립합니다. 그 후 데이터 전송을 하고 데이터 전송을 완료했으면 연결을 해제합니다. TCP의 통신은 이렇게 connection setup, data transfer, connection termination의 세 단계로 나뉩니다.
신뢰성 있는 서비스를 제공하기 위해 TCP가 전체 스트림을 순서에 맞고 오류 없이, 또한 부분적인 손실이나 중복 없이 전송하는 것을 보장합니다. 이를 가능하게 하는 방법은 오류제어, 흐름제어, 혼잡제어 등이 있습니다. 흐름제어는 데이터를 보내는 속도와 데이터를 받는 속도의 균형을 맞추는 것을 뜻합니다. 오류제어는 훼손된 segment의 감지 및 재전송, 손실된 segment의 재전송, 순서가 맞지 않게 도착한 segment를 정렬하고 중복 segment 감지 및 폐기를 합니다. 이는 TCP header의 checksum, 확인응답, 타임-아웃 등을 통해 수행됩니다.
UDP(User Datagram Protocol)
UDP는 비연결형, 비신뢰성 전송 프로토콜입니다.
UDP는 논리적 연결을 설립하지 않고 datagram을 전송하는 비연결형 프로토콜입니다. 또한 흐름제어, 오류제어, 혼잡 제어를 제공하지 않는 간단한 프로토콜입니다. 이러한 단순성은 적은 양의 오버헤드갖기 때문에 작은 메시지를 보내거나 신뢰성을 크게 고려하지 않아도 되는 상황에서 사용합니다.
ex) 매우 큰 문서파일을 인터넷을 통해 다운받고 있다고 가정해 봅시다. 이 경우엔 신뢰성이 보장되는 프로토콜을 사용해야 합니다. 다운로드 완료된 파일의 일부분이 손실되거나 훼손되어 있으면 안되기 때문입니다. 문서 파일 전송시에 발생하는 지연은 중요한 문제가 아닙니다. 따라서 UDP를 사용하면 안되고 TCP를 사용해야 합니다.
ex) live방송과 같이 실시간 상호작용을 하는 응용프로그램을 사용한다고 가정해 봅시다. 음성과 영상을 한프레임씩 전송을 합니다. 전송계층에서 훼손되거나 손실된 프레임을 재전송 해야된다면 전체적으로 지연이 될겁니다. 따라서 UDP를 통해서 한프레임씩 datagram으로 전송한다면 훼손되거나 손실된 패킷은 그냥 무시하고 나머지 패킷을 응용프로그램으로 전달한다. 손실된 패킷으로 인해 짧은 시간동안 화면의 일부분이 공백으로 표시되더라도 대부분의 시청자들은 인식하지 못합니다. 이 때는 신뢰성보다 실시간성이 더 중요하기때문에 UDP를 사용합니다.