본문 바로가기
Computer Science/컴퓨터 네트워크

TCP & UDP

by Libi 2021. 7. 8.
반응형

이전 글들을 통해 전송 계층에서 신뢰적인 데이터를 전송하기 위해 어떠한 상황들을 고려하고 구축했는지 간단하게 살펴봤다. 이번에는 최종적으로 구축한 프로토콜을 토대로 현재 TCP/IP 전송계층에서 사용되는 대표적인 프로토콜 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)에 대해서 알아보자.

TCP와 UDP는 전송계층의 프로토콜로 모두 세그먼트를 한 컴퓨터에서 다른 컴퓨터로 전달해 주는 IP 프로토콜(비신뢰적)을 기반으로 구현되어 있는 프로토콜이다. 하지만 두 프로토콜은 상당히 다른 특징을 가지고 있다. 하나씩 살펴보자.

TCP(Transmission Control Protocol)

TCP는 연결 지향형, 신뢰적인 데이터 전송 서비스를 제공하는 프로토콜이다. 신뢰적인 데이터 전송 서비스는 전송하는 세그먼트의 신뢰도를 높인다는 의미이고 연결 지향형이라는 뜻은 상대방과 연결이 된 상태에서만 통신을 하겠다는 의미이다.

TCP 프로토콜은 오직 종단 시스템에서만 동작한다. 따라서, 중간 라우터들은 전혀 TCP 연결을 감지하지 못한다.

TCP 연결은 전송이 양방향으로 동시에 일어날 수 있도록 전이중(Full-duplex) 서비스를 제공한다. 또한 TCP 연결은 항상 단일 송신자와 단일 수신자 사이의 점대점(Point-to-Point) 방식이다. 따라서 한 송신자가 여러 수신자에게 데이터를 전송하는 멀티캐스팅 방식은 불가능하다.

TCP는 신뢰적인 데이터 전송을 위해 오류 검출, 재전송, 순서 번호, 응답 번호, 타이머 등을 사용한다. 이전에 신뢰적인 데이터 전송 프로토콜을 구축하기 위해 사용했던 것들이다.

TCP는 송신자가 수신자의 버퍼를 오버플로 시키는 것을 방지하기 위해 흐름 제어(Flow Control) 서비스를 제공한다. 송신자는 수신 윈도우(Receive Window)라는 변수를 통해 패킷 처리 속도를 제어한다. 수신 윈도우는 수신 측에서 가용한 버퍼 공간이 얼마나 되는지를 송신자에게 알려 주는 용도이다.

TCP는 네트워크 혼잡에 따라 연결에 트래픽을 보내는 전송률을 각 송신자가 제한하도록 하는 혼잡 제어(Congestion Control) 서비스를 제공한다. 흐름 제어처럼 송신자는 혼잡 윈도우(Congestion Window)라는 변수를 통해 송신자의 송신율을 제한한다.

TCP는 연결 지향형 서비스를 제공하기 위해 핸드셰이크(handshake)라는 것을 사용한다. 악수라는 뜻처럼 말 그대로 상대방과 서로 연결되었다는 것을 확인하겠다는 의미이다. 연결을 위해 세 방향 핸드셰이크(Three Way Handshake), 연결을 해제하기 위해 네 방향 핸드셰이크(Four Way Handshake)를 사용한다.

먼저 연결을 위한 세 방향 핸드셰이크이다.

  1. 클라이언트 측 TCP는 서버 TCP에게 SYN, 순서 번호를 포함하여 세그먼트를 송신한다.
  2. 서버 측 TCP는 세그먼트를 수신하여 연결에 TCP 버퍼와 변수들을 할당한다. 그다음 SYN, 클라이언트에 대한 확인 응답 번호, 자신의 순서 번호를 포함한 세그먼트를 클라이언트에게 송신한다.
  3. 클라이언트 측 TCP는 세그먼트를 수신하여 연결에 TCP 버퍼와 변수들을 할당한다. 그다음 SYN, 서버에 대한 확인 응답 번호, 자신의 순서 번호를 포함한 세그먼트를 마지막으로 서버에게 송신한다. 이때 SYN은 0으로 설정하는데 연결이 되었다는 의미이다.

 

위 과정을 통해 클라이언트와 서버는 서로 연결되었다는 것을 확인한다. 그렇다면 왜 세 방향 핸드셰이크일까? 두 방향으로도 가능하지 않을까라는 의문이 들 수 있을 것이다.

앞에서 TCP는 전이중 방식이라고 설명하였다. 두 방향 핸드셰이크를 진행한다면 클라이언트 측은 답변을 받았기 때문에 세그먼트가 잘 전송되었다고 알 수 있지만 서버 측은 자신의 세그먼트에 대한 답변을 받지 못하였기 때문에 알 수 없다.

 

다음으로 연결을 해제하기 위한 네 방향 핸드셰이크이다.

  1. 먼저 종료하기를 요청한 클라이언트 측 TCP는 서버 TCP에게 FIN을 포함한 세그먼트를 송신한다.
  2. 서버는 클라이언트에게 확인 응답 세그먼트를 보낸다. FIN 세그먼트를 보내지 않는 이유는 2 Way Handshake의 문제처럼 점대중 방식을 생각하면 될 것이다. 서버에서 아직 보내야 하는 데이터가 남아있을 수 있기 때문이다.
  3. 확인 응답 세그먼트를 보낸 다음 서버는 클라이언트에게 FIN을 포함한 세그먼트를 보낸다.
  4. 클라이언트는 FIN 세그먼트에 대한 확인 응답을 보낸다. 이 시점에서 두 호스트의 모든 자원은 할당이 해제된다.

위의 서비스들을 제공하기 위한 TCP 세그먼트 구조는 다음과 같다.

TCP는 많은 서비스들을 제공해 주는 대신 오류 검출, 재전송, ACK/NAK, 순서 번호, 타이머, 윈도우, FIN, SYN 등의 신뢰적인 데이터 전송, 혼잡 제어, 흐름 제어 등을 위한 요소들이 헤더 필드에 포함되어야 하기 때문에 무거우며 속도가 느린 단점이 있다.

UDP(User Datagram Protocol)

UDP는 비연결 지향형, 비신뢰적인 데이터 전송 서비스를 제공하는 프로토콜이다. 또한 흐름 제어, 혼잡 제어 서비스 또한 제공해 주지 않는다.

TCP에 비해 신경 쓸 것들이 적기 때문에 헤더 필드에 포함되는 요소들이 적으며 속도 면에서 뛰어나다. 따라서 UDP는 빠른 전송이 필요한 상황에 주로 사용된다. 대표적인 예로는 스트리밍 방송이 있다.

UDP는 제공해 주는 서비스가 거의 없기 때문에 TCP에 비해 상당히 간단한 구조를 가지고 있는 것을 확인할 수 있다. UDP 또한 체크섬을 통해 오류 검사를 진행한다. 다만 헤더 부분만 검사할 뿐 데이터는 검사하지 않는다.

반응형

댓글