네트워크 세계에서 흔히 볼 수 있는, 그리고 중요한 개념 중 하나가 TCP 와 UDP 프로토콜입니다. TCP 와 UDP 프로토콜은 OSI 7계층의 4계층에서 동작하는 프로토콜로써, 각 호스트 간 (예> 클라이언트 <-> 서버) 데이터 전송을 위한 전반적인 조율 담당하고 있습니다.
(OSI 7 계층 상세 내용 참고 : 클릭)
예를 들어, 책 100 페이지를 네트워크를 통해 전송한다고 가정해 보겠습니다. (네트워크는 회선 교환 방식과 같이 하나의 회선을 통해서만 데이터를 전송하지 않고, 패킷 교환 방식을 채택하여 여러가지 경로를 통해 책의 여러 페이지들을 나누어서 전송할 수 있습니다.) UDP 는 상대방이 수신했는지 안했는지 상관하지 않고 100 페이지를 네트워크가 한 번에 전송해줄 수 있을 만큼의 몇 페이지 씩으로 크기를 나누어 계속 보내기만 합니다. (4계층에서 중계만 해줌) 상대방이 잘 수신했는지도 확인하지 않죠. 그러나 TCP 의 경우에는 보내는 쪽에서 몇 페이지씩 나누어 보낸 후, 수신 측에서 해당 페이지들을 잘 수신했는지 응답을 하면 그 때 다시 나머지 페이지들을 보냅니다.
위와 같은 TCP 와 UDP 의 세부적인 원리, 특징 그리고 기능들이 어떤 것들이 있는지 아래와 같이 상세히 알아보도록 하겠습니다.
1. TCP (Transmission Control Protocol)
연결형 서비스를 지원하는 프로토콜로써, 호스트 간 신뢰성 있는 데이터 전달과 흐름제어를 가능하게 합니다. 일반적으로 TCP 와 IP 를 함께 사용하는데, IP가 데이터의 배달을 담당한다면 TCP 는 전송하는 데이터의 추적 및 관리하게 해 줍니다. 프로토콜 번호는 6 입니다.
– TCP 동작 원리 및 절차
(1) 3-Way Handshaking 과정을 통해 먼저 양쪽의 호스트 들이 인사를 합니다. 순서는 반드시 SYN -> SYN/ACK -> ACK 입니다. 이 후 ‘Established’ 상태가 되어 TCP 커넥션이라는 가상의 통신 회선이 구성 됩니다. 단, 이 때는 실제 데이터를 교환하지 않습니다.
(2) 데이터는, 확인 응답 / 전송 제어 / 흐름 제어 를 통해 주고 받습니다.
> 확인 응답의 경우, 시퀸스 번호와 ACK 번호를 통해 데이터를 수신한 위치를 파악하여 수신을 확인한 다음 이 후의 데이터를 전송합니다.
> 전송 제어의 경우, 특정 시간 만큼 기다리는 동안 상대방이 데이터를 수신했다는 ACK 번호를 보내지 않을 경우 데이터를 다시 보내는 방식입니다.
> 흐름 제어의 경우, TCP 세션에서 지정된 윈도우 사이즈를 보내는 동안에는 ACK 를 보내지 않고 연속해서 데이터를 보내면서 신뢰성을 유지하는 동시에 전송 효율을 높이는 방식입니다.
– 특징
(1) 신뢰성 보장 (Reliable)
TCP 의 구성 특성상 패킷 손실, 중복, 순서바뀜 등이 없도록 합니다. TCP 와 함께 동작하는 IP 계층의 신뢰성 없는 서비스를 보완해 줍니다.
(2) 연결지향적 (Connection-oriented)
같은 전송 계층의 UDP 가 비연결성 (Connectionless) 의 특징을 갖고 있는 것과 달리, TCP 는 연결지향적입니다. 특히 TCP 는 느슨한 연결 (Loosly Connected) 의 성격을 갖고 있으며, 강한 연결을 구성하는 가상 회선과는 그 성격이 다릅니다. 또한 연결 관리를 위해 연결 설정 및 연결 해제 과정을 수행합니다. (시작/종료) 이에 7계층의 어플리케이션 또는 프로세스는 TCP 가 제공하는 연결성을 바탕으로 서로 통신할 수 있습니다.
(3) 연결 식별 / 다중화 / 포트번호
> 각 호스트의 소켓 (호스트의 IP 주소 및 포트번호) 정보로 하나의 연결 (회선) 임을 식별할 수 있습니다.
> 단일 연결 뿐 만 아니라 다수 연결의 동시 처리도 가능합니다. (패킷 기반 통신)
> TCP 는 포트 번호를 참조하여 어플리케이션과의 연결점을 식별할 수 있습니다.
(4) 전이중 전송방식 (Full-Duplex, 양방향성)
호스트 간 각각의 프로세스가 서로 동시에 세그먼트를 전달할 수 있습니다. (데이터 순서 번호 파악 및 유지)
(4) 멀티캐스트 불가능
1:1 통신을 하므로 유니캐스트 통신을 합니다. 단일 송신자와 단일 수신자 간에 단일 경로 연결이 설정되는 특징을 갖습니다. (단, 차세대 전송계층 프로토콜인 MPTCP 에서는 다수의 경로와 다수의 연결이 가능해졌습니다.)
(5) 응용 계층과 바이트(Byte) 의 흐름으로 데이터를 주고받음
TCP 계층과 상위의 응용 계층 간 데이터를 주고 받는 과정을 바이트들 (Bytes) 의 연속적인 흐름으로 보고, 이들을 묶어 세그먼트화하여 전송합니다. 이는 응용 계층의 개발자들이 흐름제어, 회선관리, 전송단위 등을 신경쓰지 않도록 하게 합니다. (** TCP 세그먼트 : TCP 에서 IP 로 전달되는 정보의 단위. 양 끝단의 TCP 모듈간에 서로 교환되는 데이터. 통상, 수 백 바이트 정도 크기로 나타냄. )
(6) 세그먼트화 (데이터를 패키징 처리)
바이트들을 모아서 세그먼트화 하고 TCP 헤더를 붙인 다음, 이들의 순서를 제어합니다. 아울러 TCP 세그먼트의 (한 번에 보낼 수 있는) 최대 크기를 MSS 라고 합니다. (단, MTU 보다 더 작아야 함)
(7) 흐름제어 (Flow Control)
송신 및 수신 속도를 일치시키는 작업을 합니다. 예를 들어, 서버는 100Mbps 속도를 제공하지만, 사용자 컴퓨터에서는 10Mbps 속도만 이용 가능한 경우에는 데이터의 손실이 발생할 수 있습니다. 특히 이러한 경우에는 불필요한 응답과 데이터 전송이 빈번히 송신/수신 측 간에 발생할 수 있습니다. 이런 경우를 방지하기 위하여 Stop and Wait 방식과 Sliding Window 방식을 사용합니다.
> Stop and Wait : 전송한 패킷에 대해 매번 확인 응답을 받고 나서 그 다음 패킷을 전송하는 방법
> Sliding Window : 수신 측에서 수용 가능한 윈도우 크기만큼 송신 측에서 확인응답 없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법
(8) 혼잡제어 (Congestion Control)
네트워크가 혼잡하다고 판단될 때 (예> 특정 라우터에 트래픽이 몰릴 경우 호스트는 데이터를 재전송하여 결국 혼잡이 가중됨), TCP 는 데이터의 전송 속도를 강제로 줄입니다. 혼잡제어를 위한 주요 방법으로는 느린 시작, 혼잡 회피, 수신 윈도우 및 혼잡 윈도우 크기결정 등이 있습니다. 아울러, 흐름제어가 송신 측과 수신 측 사이의 전송 속도를 다루는데 반해 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서의 전송 문제를 다루는 영역입니다.
(9) 비 실시간적 응용
TCP 통신 방식의 특성상 TCP 는 데이터의 전달에 대한 신뢰성 보장을 하지만, 속도 지연에는 취약할 수 있기 때문에 실시간 통신이 필요한 상황에서는 대체로 UDP 를 사용합니다. (예> 영상 스트리밍 서비스)
– 헤더 상세 내용
(1) Source Port (16 bit)
송신 측의 포트 번호를 표시합니다. 응용 서비스에 따라 정해지 포트번호가 있을 수 있지만, 대부분 처음 세그먼트를 전송하는 측에서 임의의 포트번호를 할당합니다.
(2) Destination Port (16 bit)
수신 측의 포트 번호를 표시합니다. 응용 서비스에 따라 포트 번호가 정해져 있습니다. (예> SSH, Telnet 등)
(3) Sequence Number (32 bit)
TCP 의 순서 번호를 표시합니다. 통신을 시작하는 호스트 간 임의로 번호를 할당하여 시작합니다.
(4) Acknowledgment Number (32 bit)
상대방 측에서 보낸 세그먼트를 잘 받았다는 것을 응답하기 위한 번호입니다.
(5) Header Length – Offset (4bit)
TCP 헤더의 길이를 표시합니다. (4바이트 단위) TCP 헤더는 최소 20 bytes, 최대 60 bytes 입니다.
(6) Reserved (4 bit)
사용하지 않는 필드이며, 모두 0 으로 표기합니다.
(7) Flag (8bit) – URG, ACK, PSH, RST, SYN, FIN
제어 비트 (Control bits) 라고도 하며, 세그먼트의 종류를 표시하는 필드입니다.
(8) Window Size (16bit)
상대방이 확인 메세지를 보내지 않고도 전송할 수 있는 최대 크기의 세그먼트를 바이트 수로 표기합니다. (흐름제어의 Sliding Window 기법)
(9) Checksum (16bit)
헤더와 데이터의 에러를 확인하기 위한 필드입니다.
(10) Urgent Pointer (16bit)
현재 TCP 의 일련번호 (Sequence Number) 로 부터 긴급 데이터까지의 바이트 오프셋 (Offset), 즉 긴급 데이터의 위치를 숫자로 표기합니다. 따라서 해당 세그먼트의 일련번호에 Urgent Pointer 값을 더해서 긴급 데이터의 끝부분이 어디인지를 알 수 있습니다.
(11) Option (0~40 bytes)
세그먼트의 최대 사이즈를 지정하는 등 추가 옵션이 있을 경우 표시합니다.
2. UDP (User Datagram Protocol)
비연결형 서비스를 지원하는 프로토콜로써, TCP 와 비교하여 호스트 간 완전성 또는 신뢰성이 없는 데이터 전달을 합니다. 그러나 가상 회선을 굳이 확립할 필요가 없고 유연한 특성이 있으므로 효율적인 응용 계층의 데이터 전송이 필요한 곳에 적합합니다. 프로토콜 번호는 17 입니다.
– UDP 동작 원리 및 절차
TCP 에 비해 UDP 는 전송만 할 뿐 확인 응답을 하지 않아 비교적 단순한 구조입니다.
– 특징
(1) 비연결성이고, 신뢰성이 없으며, 순서화되지 않은 데이터그램 (Datagram) 서비스를 제공합니다. TCP 와 비교하면 다음과 같습니다.
> 확인응답 없음 : 메세지가 제대로 도착했는지 확인하지 않습니다.
> 순서제어 없음 : 수신된 메세지의 순서를 맞추지 않습니다. (TCP 헤더와 달리 순서번호 필드 없음)
> 흐름제어 없음 : 흐름 제어를 위한 피드백을 제공하지 않습니다.
> 오류제어 거의 없음 : 검사합을 제외한 특별한 오류 검출 및 제어가 없습니다. 따라서 응용 계층 등의 UDP를 사용하는 프로그램 쪽에서 오류제어 기능을 스스로 갖추어야 합니다. (예> 별도 프로그램을 구현 하는 등의 방안이 필요)
> 비연결성 : TCP 와 같이 Handshaking 과정이 없으므로 논리적인 가상 회선 연결이 필요 없습니다.
(2) 빠른 요청과 응답 및 멀티캐스팅이 가능합니다.
> 빠른 요청과 응답이 필요한 실시간 통신 또는 응용계층 프로그램에 적합합니다. (예> 비디오 스트리밍 등)
> 1:n 의 여러 다수 지점에 동시 전송 가능합니다. (멀티캐스팅)
> 전송 속도에 특별한 제한이 없음
(3) 헤더가 단순
헤더는 고정 크기의 8 바이트 (TCP는 20 바이트) 만 사용합니다. 따라서 TCP 와 비교하여 헤더의 처리에 적은 리소스가 필요합니다.
(4) 데이터 전송 단위 : 메세지 (TCP 데이터 전송 단위 : 세그먼트)
(5) 최대 데이터 크기 : 65,507 바이트 (65,535 바이트 에서 UDP 헤더 8 바이트 를 제외)
(6) 사용 사례
주로 다음과 같은 실시간성 보장 또는 빠른 연결이 필요한 서비스들에 이용 됩니다.
> 도메인 이름 서비스 (DNS)
> IPTV
> 음성 인터넷 프로토콜 (VoIP)
> TFTP
> IP 터널
> 비디오 스트리밍
> 온라인 게임
– 헤더 상세 정보
TCP 의 헤더 구조에 비해 UDP 헤더의 구조는 매우 단순합니다.
(1) Source Port (16 bit)
출발지의 포트 번호를 표시합니다. 응용 계층의 서비스에 따라 특정 포트 번호로 정해지는 경우도 있지만, 대부분 처음 UDP 메세지를 전송하는 측에서 할당하는 임의의 번호를 사용합니다.
(2) Destination Port (16bit)
목적지 포트번호를 표시합니다. 응용 계층의 서비스에 따라 특정 포트 번호가 지정되어 있을 수 있습니다. (예> DNS 의 53 등)
(3) Length (16 bit)
헤더와 데이터를 포함하여 전체 UDP 메세지의 길이를 바이트 단위로 표시합니다.
(4) Checksum (16 bit)
헤더와 데이터의 에러를 확인하고 검출하는 필드입니다. UDP 헤더는 에러 복구를 위한 필드가 필요 없으므로 TCP 헤더에 비해 간단한 구조입니다.
3. TCP vs UDP 비교/차이점
위와 같은 TCP 와 UDP 각각의 특성을 고려해보면 TCP 와 UDP 의 차이점은 다음과 같습니다.
4. MPTCP (Multipath TCP)
2013년도에 IETF 에서는 MPTCP 라는 새로운 기술을 발표합니다. MPTCP 는 다수의 TCP 경로를 구성하고, 구성한 다수의 경로로 동시에 데이터를 송수신하는 방법입니다. 예를 들어 사용자가 100 Mbps 속도의 LTE 대역폭과 500 Mbps 속도의 Wi-Fi 대역폭을 모두 이용 할 수 있을 때, MPTCP Gateway 는 이를 하나의 망 인것 처럼 구성하여 최대 600Mbps 의 대역폭을 이용할 수 있게 해줍니다. 사용자는 빠른 속도의 데이터 서비스와 데이터 요금 절감 효과를 경험할 수 있으며 이동통신사는 망 효율성을 극대화 할 수 있습니다.
– 출처
RFC 793 (TCP) : https://tools.ietf.org/html/rfc793
RFC 768 (UDP) : https://tools.ietf.org/html/rfc768
RFC 6824 (MPTCP) : https://tools.ietf.org/html/rfc6824
#Steven