전송 계층 프로토콜 : TCP와 UDP

1. TCP(Transmission Control Protocol)

1.1 TCP 특징

TCP는 다음과 같은 주요한 3가지 특징을 가진다.

 

1. 연결지향형 프로토콜이다.
데이터를 전송하기 전에 송신자와 수신자 간에 안정적인 연결을 먼저 설정한다. 이 과정은 3-way handshake라 불리며, 데이터 전송의 신뢰성과 안정성을 확보하는 데 중요한 역할을 한다.
 
2. TCP는 높은 신뢰성을 제공한다.
이는 세 가지 주요 메커니즘을 통해 구현된다:
  • 흐름제어: 수신자의 처리 능력에 맞춰 데이터 전송 속도를 조절한다.
  • 혼잡제어:  네트워크의 혼잡 상태를 관리하여 효율적인 데이터 전송을 가능케 한다.
  • 오류감지: 전송 중 발생할 수 있는 데이터의 손상이나 손실을 감지하고, 필요한 경우 데이터를 재전송한다.

 

3. TCP는 1:1 통신, 즉 유니캐스트만을 지원한다.
이는 한 번에 하나의 송신자와 하나의 수신자 간에만 데이터를 주고받을 수 있다는 것을 의미한다. 이러한 특성은 개별적이고 신뢰성 있는 데이터 전송을 가능하게 한다.

 

 

 

1.2 TCP의 헤더구조

Source port (16비트):
  • 데이터를 송신하는 애플리케이션의 포트 번호를 나타낸다
Destination port (16비트):
  • 데이터를 수신하는 애플리케이션의 포트 번호를 나타낸다

Sequence number(32):
  • 전송하는 데이터의 순서를 나타낸다.
  • 세그먼트들이 목적지에 도착하면, 시퀀스 번호를 통해 올바른 순서로 정렬된다.

Acknowledgement number (32비트):
  • 이전까지 성공적으로 수신한 데이터에 대한 확인 응답 역할을 한다
  • 수신 측이 다음에 받기를 기대하는 바이트의 순서 번호이다.
  • 예를 들어  1부터 100까지의 데이터를 올바르게 받았다면, 다음 예상 시퀀스 번호는 101이 된다.

Reserved (6비트):
  • 미래의 사용을 위해 예약된 필드이다.

Flags(6):
  • URG(Urgent): 긴급한 데이터를 처리해야 할 때 사용되는 플래그 비트
  • ACK(Acknowlegement): 상대방으로 부터 패킷을 받은 뒤에, 잘 받았다고 응답할 때 사용되는 플래그 비트 
  • PSH(Push): 상위계층으로 신속하게 데이터를 전달해야할때 사용되는 플래그 비트
  • RST(Reset): TCP 연결을 강제로 종료해야할때 사용되는 플래그 비트
  • SYN(Synchronization): 통신을 시작할때 사용되는 플래그 비트
  • FIN(Finish): 연결을 종료할때 사용되는 플래그 비트

Window size(16):
  • 수신 윈도우의 크기를 나타낸다.
  • 한 번에 받을 수 있는 데이터의 양을 바이트 단위로 지정한다.
  • 네트워크의 혼잡 상황을 관리하고 흐름 제어를 가능하게 하는 데 중요한 역할을 한다.

Checksum (16비트):
  • 데이터의 무결성을 검증하기 위한 오류 검출 코드이다.
  • 체크섬을 사용하여 세그먼트가 전송 중에 손상되었는지 확인할 수 있다.

Urgent pointer (16비트):
  • URG 플래그가 설정되었을 때 사용된다.
  • 이를 통해 TCP는 긴급한 데이터를 우선적으로 처리할 수 있다.

 

 

1.2 TCP 연결 설정(3-way Handshaking)

TCP 연결은 3단계를 거친다.

*여기서 송신자는 클라이언트, 수신자는 서버를 의미한다.

1) SYN

  • 송신자가 수신자에게 통신을 하고 싶다는 의미의 SYN 플래그 비트를 전송한다.
  • 클라이언트의 TCP 헤더의 SYN 플래그를 1로 설정한다.

2) SYN+ACK

  • 수신자는 송신자의 응답을 받았고, 통신을 수락하는 의미의 SYN+ACK 플래그 비트를 전송한다.
  • 서버의 TCP 헤더의 SYN, ACK 플래그를 1로 설정한다.
  • ACK 번호는 클라이언트의 Sequence Number + 1로 설정한다.

3) ACK

  • 클라이언트는 서버의 응답을 받았다는 의미의 ACK 플래그 비트를 전송한다.
  • 클라이언트는 ACK 플래그를 1로 설정한다.
  • ACK 번호를 서버의 Sequence Number + 1로 설정하여 전송한다.

이 과정을 통해 양방향 연결이 설정되고 데이터 전송이 가능해진다.

 

 

1.3 TCP 연결 해제(4-way Handshaking)

TCP 연결해제는 4단계를 거친다.

*여기서 송신자는 클라이언트, 수신자는 서버를 의미한다.

1) FIN

  • 송신자가 수신자에게 연결을 종료하고 싶다는 의미의 FIN 플래그 비트를 전송한다.
  • 송신자의 TCP 헤더의 FIN 플래그를 1로 설정한다.

2) ACK

  • 수신자는 송신자의 FIN을 받았다는 의미의 ACK 플래그 비트를 전송한다.
  • 수신자의 TCP 헤더의 ACK 플래그를 1로 설정한다.
  • ACK 번호는 송신자의 Sequence Number + 1로 설정한다.

3) FIN

  • 수신자가 송신자에게 자신도 연결을 종료하겠다는 의미의 FIN 플래그 비트를 전송한다.
  • 수신자의 TCP 헤더의 FIN 플래그를 1로 설정한다.

4) ACK

  • 송신자는 수신자의 FIN을 받았다는 의미의 ACK 플래그 비트를 전송한다.
  • 송신자의 TCP 헤더의 ACK 플래그를 1로 설정한다.
  • ACK 번호는 수신자의 Sequence Number + 1로 설정한다.

이 과정을 통해 양방향 연결이 해제된다.

 

송신자는 ACK를 보낸 후 즉시 연결을 종료하지만, 수신자는 마지막 ACK가 손실될 경우를 대비해 일정 시간(일반적으로 MSL의 2배) 동안 대기한 후 연결을 완전히 종료한다. 이 상태를 TIME_WAIT 상태라고 한다.

 

1.4 TCP 재전송(retransmission)

TCP는 데이터 전송의 신뢰성을 보장하기 위해 여러 상황에서 재전송 메커니즘을 사용한다.

 

주요 재전송 케이스는 다음과 같다:

 

1) ACK 응답 부재로 인한 재전송

  • TCP는 설정된 시간 내에 ACK가 도착하지 않으면 타임아웃으로 간주한다.
  • 이 경우 TCP는 데이터가 손실되었다고 판단한다.
  • 그 결과, TCP는 해당 데이터 세그먼트를 다시 전송한다.

2) 순서번호가 올바르지 않거나 분실되었을 때의 재전송

2.1 순서 번호 오류

  • 송신자가 1234 순서로 전송했으나 수신자가 1243 순서로 받았다고 가정한다.
  • 수신자는 송신자에게 잘못된 순서의 데이터를 받았음을 알린다.
  • 수신자는 올바른 순서의 데이터를 재요청한다.
  • 수신자는 잘못된 순서의 데이터를 임시로 저장한다.
  • 올바른 순서의 데이터가 도착하면 수신자는 이를 재조립한다.

2.2 데이터 분실

  • 송신자가 1234 순서로 전송했으나 수신자가 123만 받고 4가 도착하지 않았다고 가정한다.
  • 수신자는 수신한 데이터(123)에 대한 ACK를 전송한다.
  • 수신자는 다음에 기대하는 순서번호를 포함하여 응답한다.
  • 송신자는 이 정보를 바탕으로 누락된 데이터(4)를 재전송한다.

이러한 재전송 메커니즘을 통해 TCP는 데이터의 신뢰성 있는 전송을 보장하며, 네트워크 상의 다양한 문제 상황에 대응한다.

 

 

2. UDP(User Datagram Protocol)

UDP는 다음과 같은 주요 특징을 가진다.
 
1. 비연결형 프로토콜이다.
TCP와 달리 데이터를 전송하기 전에 연결을 설정하는 과정이 없다. 이는 통신 시작 시 발생하는 지연을 줄이고, 더 빠른 데이터 전송을 가능하게 한다.
2. UDP는 효율적이고 속도가 빠르다.
TCP는 신뢰성있고 안정적인 전송에 집중했다면 UDP는 복잡한 메커니즘을 제거하고, 단순한 구조를 채택함으로써 효율적이고 빠른 속도에 집중한다.
 
3. UDP는 1:1(유니캐스트), 1:N(멀티캐스트), M:N(브로드캐스트) 통신을 모두 지원한다.
이는 UDP가 다양한 통신 시나리오에 유연하게 적용될 수 있음을 의미한다. 특히 여러 수신자에게 동시에 데이터를 전송해야 하는 경우에 효과적이다.
 
UDP의 이러한 특성들로 인해 실시간 스트리밍, 온라인 게임, DNS 조회 등 빠른 속도와 효율성이 중요한 애플리케이션에서 널리 사용된다.
 
 

2.1 UDP 헤더구조

UDP 헤더는 효율성과 속도에 초점을 맞추었기 때문에 헤더구조가 단순하다.
 

Source port(16):
  • 데이터를 보내는 애플리케이션의 포트 번호를 나타낸다
Destination port(16):
  • 데이터를 받을 애플리케이션의 포트 번호를 나타낸다

Total length(16):
  • 헤더와 데이터를 포함한 패킷의 전체길이를 나타낸다.

Checksum(16):
  • 데이터가 정확하게 전송되었는지 확인하기 위한 값을 나타낸다.
  • TCP와 다르게, UDP는 성능향상을 위해서 체크섬이 선택적이다.
 

2.2 UDP 통신방식

UDP는 TCP와 달리 연결 설정 과정이 없는 비연결형 프로토콜이므로, 더 간단한 구조를 가진다.

 

 

3. TCP vs UDP

신뢰성과 속도라는 두가지 선택지 중에서 TCP신뢰성을 선택한 프로토콜 이고, UDP속도를 선택한 프로토콜이다.
 
이에따라 TCP는 높은 신뢰성을 확보하기 위해 일부 속도를 희생한다. UDP는 효율적이고 빠른 전송을 우선시하는 프로토콜로, 최대한의 속도를 위해 일부 신뢰성을 포기한다. 물론 이는 절대적인 구분이 아니며, 상대적인 개념이다. TCP도 최적화를 통해 속도를 개선할 수 있고, UDP도 애플리케이션 레벨에서 신뢰성을 보완할 수 있다.
 

 

참고문헌

  1. https://www.javatpoint.com/tcp
  2. https://www.javatpoint.com/udp-protocol
  3. https://www.cloudflare.com/ko-kr/learning/ddos/glossary/user-datagram-protocol-udp/
  4. https://velog.io/@secloud/2.-TCP-와-UDP-의-특징-및-차이점