[네트워크] TCP vs UDP
TCP (Transmission Control Protocol)
TCP는 신뢰성 있는 데이터 전송을 지원하는 연결 지향형 프로토콜이다.
TCP는 네트워크에 연결된 컴퓨터에서 실행되는 프로그램 간 안정적으로, 순서를 지키며, 에러없이 교환할 수 있게 한다.
TCP의 특징은 다음과 같다.
1. 연결형 서비스로 가상 회선 방식 이용
: 3way handshaking 과정을 통해 연결을 설정하고, 4way handshaking 과정을 통해 연결을 해제한다.
2. 흐름 제어 (Flow Control)
: 데이터 처리 속도를 조절해 수신자의 버퍼 오버플로우를 방지한다.
3. 혼잡 제어 (Congestion Control)
: 네트워크 내 패킷 수가 과도하게 증가하지 않도록 방지한다.
4. 높은 신뢰성을 보장
: 신뢰성이 높은 전송을 하여 UDP 보다 속도가 느리다.
5. 전이중(Full-Duplex), 점대점(Point to Point) 방식
UDP (Unit Datagram Protocol)
UDP는 비연결형 프로토콜로 정보를 주고받는 신호 절차를 거치지 않는 프로토콜이다.
UDP는 일방적으로 데이터를 전달하는 통신 프로토콜로 TCP보다 전송 속도가 빠르다.
UDP의 특징은 다음과 같다.
1. 비연결형 서비스로 데이터 그램 방식 이용
: 데이터의 전송 순서가 뒤바뀔 수 있다.
2. 데이터 수신 여부를 확인 X
: TCP의 3way handshaking 과정 등이 존재하지 않는다.
3. 낮은 신뢰성
: 제대로 전송되었는지, 오류가 없는지 확인이 불가해 TCP보다 낮은 신뢰성을 가지고 있다.
4. TCP보다 속도 빠름
5. 1:1, 1:N, N:M 통신 가능
TCP vs UDP
앞서 설명한 특징에 따라 TCP와 UDP의 차이점은 위와 같은 표로 정리될 수 있다.
즉, 신뢰성이 필요한 통신에서는 TCP를 사용하고
신뢰성이 필요하지 않으면서 빠른 속도를 요구하는 통신에서는 UDP를 사용하게 된다.
TCP에 대한 의문
의문 1) TCP는 어떻게 신뢰성 있는 데이터 통신을 할 수 있을까?
TCP는 신뢰성을 보장하기 위해 재전송 과정이 발생한다.
패킷이 손실되었을 때, TCP 재전송 과정이 발생하며 수신자는 TCP Segment의 Header에
Checksum 부분을 확인하여 오류 발생 여부를 알게 된다.
데이터가 잘못 전송되었을 경우에는 TCP Flag 중 ACK Flag를 reset(0)하여 보내고,
제대로 전송되었을 경우에는 ACK Flag를 set(1)하고 ACK number에 수신자가 받은
SEQ Num + 1의 값을 보내게 된다.
의문 2) TCP 재전송이 발생해 통신 순서가 뒤바뀌면 어떻게 순서를 보장할 수 있는가?
순서가 뒤바뀐 TCP도 문제가 되지 않는 부분은 Sequence Number가 존재하기 때문에
수신자 측에서 해당 Number를 기준으로 데이터 청크(Data chunks)를 잘 붙여주기만 하면 되기 때문이다.
의문 3) 만약, 수신자가 송신자에게 ACK, NAK(부정 확인응답)도 못 보내는 상황이라면?
이러한 경우에는 Timeout 개념을 사용하게 된다.
일정 시간 동안에 ACK 또는 NAK 응답이 오지 않는다면,
Timeout된 시점에서 다시 TCP Segment를 보내주게 된다.
최근에는 RTO를 사용하여 타이머의 작동 시간을 가져온다.
RTO(Retransmission Time Out)
TCP RTO는 TCP 프로토콜에서 재전송 시간, 타이머가 작동하는 시간을 의미한다.
TCP는 데이터를 전송할 때, 전송한 패킷이 제대로 전송되지 않으면 재전송을 시도한다.
이때, 재전송 시간이 지연되면 성능 저하와 불안정성이 발생할 수 있다.
위 사진에서 나오는 RTT는 Round Trip Time으로 네트워크 통신을 하는 두 노드 간
패킷이 전달되는데 소요된 시간을 의미한다.
연결지향형 프로토콜 vs 비연결형 프로토콜
앞서 설명한 TCP는 연결지향형 프로토콜, UDP는 비연결형 프로토콜이라고 한다.
그렇다면, 이 두 단어의 차이점에는 어떠한 것이 존재할까?
연결지향형 (Connection Oriented) 프로토콜
연결지향형 프로토콜은 연결, 데이터 전송, 연결 종료 총 3단계를 거치게 된다.
Segment를 다루는 TCP 프로토콜이 사용되며,
프로토콜에 의해 연속적으로 패킷의 상태 정보를 유지하게 된다.
그렇기 때문에 신뢰성 있는 정보를 보장하며 1:1 통신을 하게 된다.
TCP는 세그먼트라 불리는 패킷을 순서대로 목적지에 도달하도록 한다.
신뢰성을 보장하기 위해 TCP 세그먼트 내에는 Checksum이 존재하며,
각 바이트마다 일정한 Sequence Number가 할당된다.
모든 세그먼트가 잘 도착했는지 알기 위해 Ack 및 재전송 메커니즘이 제공된다.
비연결형 (Connectionless) 프로토콜
비연결형 프로토콜은 주로 IP, UDP와 같은 프로토콜이 사용되며,
각각의 패킷들이 독립적이라는 특성을 가지고 있다.
그렇기 때문에 신뢰성이 없다고 표현하며 1:N, N:M, (또는 1:1) 통신을 하게 된다.
각 프로토콜에 맞는 패킷 교환 방식
연결지향형과 비연결형 프로토콜은 각각에 맞는 패킷 교환 방식을 사용하게 된다.
가상회선 패킷 교환 방식
가상회선 패킷 교환 방식은 위와 같은 전송 방식을 가지고 있다.
데이터를 전송하기 전 논리적 연결이 설정되는데 이를 가상회선이라고 한다.
각 패킷에는 가상회선 식별 번호인 VCI가 포함되고,
모든 패킷을 전송하면 가상회선이 해제된 후 패킷들은 전송된 순서대로 도착한다.
가상회선 방식은 경로를 선택하는 것이 경로를 설정할 때 한 번만 수행된다.
데이터그램 패킷 교환 방식
데이터그램 패킷 교환 방식은 위와 같은 전송 방식을 가지고 있다.
데이터를 전송하기 전 논리적 연결이 설정되지 않고 패킷이 독립적으로 전송되는 데 이를 데이터그램이라고 한다.
패킷을 수신한 라우터는 최적의 경로를 선택해 패킷을 전송하게 되는데,
하나의 메시지에서 분할된 여러 패킷은 서로 다른 경로로 전송될 수 있고
송신 측에서 전송한 순서와 수신 측에 도착한 순서가 다를 수 있다.
그래서 이게 TCP랑 UDP랑 어떤 상관이..?
앞선 설명들을 쭉 따라서 보게 되면 다음과 같은 결론을 도출할 수 있게 된다.
순서를 보장하며, 논리적 연결을 통해 신뢰성을 보장하는 가상 회선 방식이 TCP
독립적으로 패킷이 전송되며, 신뢰성을 보장할 수 없는 데이터 그램 방식이 UDP
그렇다면, UDP는 신뢰성을 보장할 수 있는 방법이 없는 것일까?
UDP Header에도 Checksum이 존재한다.
고로 UDP는 신뢰성을 보장한다(?) 는 사실 UDP는 선택적 Checksum을 제공한다.
UDP 헤더의 Checksum은 최소한의 오류만 검출할 수 있도록하는 목적을 가지고 있다.
TCP 처럼 재전송이 발생하고, 재전송에 대한 Checksum을 확인하는 그런 방식이 아니기 때문에
신뢰성을 보장하지 못한다고 표현하는 것이라 생각한다.
하지만, RUDP (Reliable UDP) 라는 것이 존재한다.
RUDP는 TCP 및 UDP의 특징을 모두 가진 프로토콜로 신뢰성을 가지는 UDP라고 표현할 수 있다.
패킷 순서와 무결성, 도착을 보장하기 때문에 다음과 같은 이름이 붙여진 것 같다.
참고 문헌
1) https://velog.io/@sms8377/Network-TCP%EC%9D%98-%EC%9E%AC%EC%A0%84%EC%86%A1%EA%B3%BC-%ED%83%80%EC%9E%84-%EC%95%84%EC%9B%83
2) https://simhyejin.github.io/2016/07/04/connectionoriented-connectionless/#independence
3) https://woovictory.github.io/2018/12/28/Network-Packet-Switching-Method/
4) https://woo-dev.tistory.com/341