[F-Lab 멘토링 학습]

TCP와 UDP의 차이점

everydeveloper 2023. 11. 4. 15:36

TCP와 UDP의 차이점

TCP (Transmission Control Protocol)와 UDP (User Datagram Protocol)는 두 가지 주요한 통신 프로토콜입니다. 각각의 특성은 다음과 같습니다:

TCP

  1. 연결 지향적: 통신을 시작하기 전에 연결을 설정하고, 통신이 완료된 후 연결을 종료합니다.
  2. 신뢰성: 데이터의 전달을 확인하고, 잘못된 데이터는 다시 전송합니다.
  3. 순서 보장: 전송된 데이터의 순서가 그대로 유지됩니다.
  4. 데이터 무결성: 중간에 데이터가 손상되거나 누락되는 것을 방지합니다.
  5. 속도: UDP보다 일반적으로 느립니다. 신뢰성을 제공하는 과정에서 오버헤드가 발생하기 때문입니다.
  6. 흐름 제어와 혼잡 제어: 네트워크 상황에 따라 데이터 전송 속도를 조절합니다.

UDP

  1. 연결 없음: 미리 연결을 설정하지 않고, 데이터를 바로 전송합니다.
  2. 신뢰성 없음: 데이터의 도착을 확인하지 않습니다. 데이터가 누락되거나 순서가 바뀔 수 있습니다.
  3. 순서 보장 안 함: 데이터가 전송된 순서대로 도착한다는 보장이 없습니다.
  4. 데이터 무결성 없음: 중간에 데이터가 손상되거나 누락될 수 있습니다.
  5. 속도: TCP보다 빠르며, 오버헤드가 적습니다.
  6. 스트리밍, 라이브 방송, 게임 등에 적합: 신뢰성보다는 실시간성이 중요한 경우에 사용됩니다.

사용 예:

  • TCP: 웹 브라우징, 이메일, 파일 전송 등
  • UDP: 스트리밍 미디어, VoIP, 실시간 멀티플레이어 게임 등

두 프로토콜은 각기 다른 용도와 특성을 가지고 있으므로, 어떤 네트워크 애플리케이션을 개발할 때는 이러한 차이점을 고려하여 적절한 프로토콜을 선택해야 합니다.

3-way handshaking과정

3-way 핸드셰이킹은 TCP 연결을 초기화하기 위한 과정입니다. 이 절차를 통해 클라이언트와 서버는 서로에 대한 정보를 확인하고, 안정적인 데이터 전송을 위한 준비를 합니다. 3-way 핸드셰이킹의 주요 단계는 다음과 같습니다.

단계 1: SYN (Synchronize)

  1. 클라이언트 → 서버: 클라이언트가 서버에 SYN(Synchronize) 패킷을 보냅니다. 이 패킷은 클라이언트가 연결을 시작하려고 함을 알립니다. 클라이언트는 이 패킷을 보낸 후 SYN_SENT 상태로 전환됩니다.

단계 2: SYN-ACK (Synchronize-Acknowledge)

  1. 서버 → 클라이언트: 서버는 SYN 패킷을 받고, 이를 확인한 후에 SYN-ACK(Synchronize-Acknowledge) 패킷을 클라이언트에게 전송합니다. 이 패킷은 "네, 연결을 시작합시다"라는 응답입니다. 서버는 이 패킷을 보낸 후 SYN_RECEIVED 상태로 전환됩니다.

단계 3: ACK (Acknowledge)

  1. 클라이언트 → 서버: 클라이언트는 SYN-ACK 패킷을 받고 확인합니다. 그 후, 마지막으로 ACK(Acknowledge) 패킷을 서버에게 보내 연결을 확립합니다. 이 패킷을 보낸 후 클라이언트와 서버 모두 ESTABLISHED 상태로 전환됩니다.

이렇게 3-way 핸드셰이킹을 통해 TCP 연결이 확립되며, 이후에는 안정적인 데이터 전송이 가능해집니다. 이 과정을 통해 양쪽 시스템은 초기 시퀀스 번호를 동기화하고, 데이터 전송을 위한 준비를 완료합니다.

한 데이터 전송에 syn와 ack은 한번씩만 있어나나 패킷마다 일어나나

SYN(Synchronize)와 ACK(Acknowledge) 플래그는 TCP 연결의 다양한 단계에서 사용됩니다. 그러나 모든 데이터 패킷에 이 플래그들이 사용되는 것은 아닙니다.

  1. SYN: 3-way 핸드셰이킹에서 연결을 초기화할 때만 사용됩니다. 즉, 한 번의 TCP 연결 설정에 대해서는 각각 한 번씩만 SYN과 SYN-ACK 패킷이 교환됩니다.
  2. ACK: 데이터가 정상적으로 도착했다는 것을 확인하기 위해 사용됩니다. 따라서 데이터 패킷이 전송될 때마다 ACK 패킷이 교환될 수 있습니다. 그러나 이는 상황에 따라 다르며, 때로는 여러 개의 데이터 패킷에 대한 하나의 ACK 응답이 전송될 수도 있습니다.

그렇기 때문에, 한 번의 데이터 전송에 SYN과 ACK이 한 번씩만 있는 것은 아닙니다. SYN은 연결 초기에 한 번 사용되고, ACK는 데이터 전송 과정에서 여러 번 사용될 수 있습니다. 이러한 메커니즘을 통해 TCP는 신뢰성 있는 데이터 전송을 보장합니다.

그렇다면 syn-ack도 여러번 가능?

일반적으로 SYN-ACK는 TCP 연결 설정 과정에서 한 번만 발생합니다. 클라이언트가 SYN 패킷을 보내면, 서버는 그에 대한 응답으로 SYN-ACK 패킷을 보냅니다. 이후 클라이언트가 마지막 ACK 패킷을 보내면 연결이 확립되며, 이렇게 3-way 핸드셰이킹이 완료됩니다.

그러나 예외적인 상황에서는 SYN-ACK 패킷이 여러 번 교환될 수 있습니다. 예를 들어, 네트워크 지연이나 패킷 손실 등의 이유로 클라이언트가 처음에 보낸 SYN 패킷을 서버가 못 받았을 경우, 클라이언트는 다시 SYN 패킷을 보낼 수 있습니다. 이 경우 서버는 다시 SYN-ACK 패킷을 보낼 것입니다.

또는, 서버가 SYN-ACK 패킷을 보냈지만 클라이언트가 그것을 받지 못한 경우에도, 클라이언트는 다시 SYN 패킷을 보낼 수 있고, 서버도 다시 SYN-ACK를 보낼 것입니다.

이러한 상황은 보통 예외적이며, 정상적인 상황에서는 SYN-ACK는 한 번만 교환됩니다.

패킷이란? 패킷의 구조

패킷은 네트워크 통신에서 데이터를 작은 단위로 나누어 전송하는 방식입니다. 이렇게 나누어진 작은 단위의 데이터를 '패킷'이라고 합니다. 패킷은 헤더(header)와 페이로드(payload)로 구성되며, 각각은 다음과 같은 정보를 담고 있습니다.

패킷의 구조

  1. 헤더(Header): 패킷의 메타데이터를 담고 있습니다. 헤더에는 목적지 주소, 출발지 주소, 패킷의 길이, 프로토콜 타입 등이 포함될 수 있습니다. 헤더는 네트워크 장비나 소프트웨어가 패킷을 어떻게 처리할지 결정하는 데 필요한 정보를 제공합니다.
  2. 페이로드(Payload): 실제 전송하려는 데이터를 담고 있습니다. 이 부분은 응용 프로그램에 의해 생성되며, 데이터의 실제 내용이 됩니다.
  3. 트레일러(Tailer): (선택적) 패킷의 끝을 표시하거나 에러 검출을 위한 정보를 담을 수 있습니다.

패킷의 종류에 따른 헤더 정보

  • IP 패킷: IP 주소, Time to Live(TTL), 프로토콜 타입 등
  • TCP 패킷: 포트 번호, 시퀀스 번호, ACK 번호, 플래그 정보(SYN, ACK 등) 등
  • UDP 패킷: 포트 번호, 길이, 체크섬 등

패킷은 데이터를 효율적으로 전송하기 위해 사용됩니다. 데이터를 패킷으로 나누면 네트워크 상의 여러 경로를 통해 동시에 전송할 수 있어, 대역폭을 효율적으로 활용할 수 있습니다. 또한 패킷의 헤더 정보를 통해 라우터나 스위치는 데이터를 빠르고 정확하게 목적지까지 전달할 수 있습니다.

SYN-ACK 패킷은 서버가 수신한 syn 헤더를 다시 ack 헤더와 함께 다시 그 위치로 리턴하는 건가

네, 맞습니다. SYN-ACK 패킷은 서버가 클라이언트로부터 받은 SYN 패킷에 대한 응답으로 전송되는 패킷입니다. 이 패킷은 다음 두 가지 주요 헤더 플래그를 가집니다.

  1. SYN: 서버가 클라이언트와 동기화를 위한 시퀀스 번호를 설정합니다.
  2. ACK: 서버가 클라이언트로부터 받은 SYN 패킷의 시퀀스 번호에 1을 더한 값을 ACK 필드에 설정하여, 클라이언트에게 SYN 패킷을 제대로 받았음을 알립니다.

SYN-ACK 패킷을 통해 서버는 클라이언트에게 "내 SYN 요청을 받았고, 여기 내 시퀀스 번호도 있으니 이제 연결을 확립하자"라고 알리는 것입니다. 클라이언트가 이 패킷을 받고 나면, 마지막으로 ACK 패킷을 보내어 3-way 핸드셰이킹을 완료하고, TCP 연결이 확립됩니다.

psh ack

PSH(Push)와 ACK(Acknowledgment)는 TCP 헤더의 플래그 중 하나입니다. 이 두 플래그는 다음과 같은 역할을 합니다.

  1. PSH (Push): 이 플래그가 설정되면, 데이터는 버퍼에서 즉시 전송됩니다. 즉, 버퍼에 있는 데이터를 모두 소비해야 함을 나타냅니다. 이 플래그가 설정되면 수신측은 받은 데이터를 즉시 응용 프로그램 계층으로 전달해야 합니다.
  2. ACK (Acknowledgment): 이 플래그가 설정되면, ACK 필드에 담긴 값이 유효하다는 것을 의미합니다. ACK 필드에는 다음으로 받고자 하는 데이터의 시퀀스 번호가 들어 있으며, 이는 상대방에게 내가 제대로 데이터를 받았다고 알리는 역할을 합니다.

PSH-ACK: 이 두 플래그가 함께 설정되어 있는 TCP 패킷은, "데이터를 즉시 처리하고, 그 처리가 완료되었다는 것을 상대방에게 알려야 한다"는 의미를 가집니다. 이런 패킷은 대개 버퍼링 없이 즉시 처리해야 하는 중요한 데이터를 전송할 때 사용됩니다.

PSH-ACK을 사용하는 것은 데이터를 즉시 전달하고 그 결과를 확인하는 상황에서 유용합니다. 예를 들어, 실시간 통신이나 중요한 제어 명령을 내리는 경우에 사용될 수 있습니다.

UDP의 데이터그램이 뭐야?

UDP(User Datagram Protocol)의 데이터그램은 UDP 프로토콜을 사용하여 네트워크를 통해 전송되는 데이터의 기본 단위입니다. 데이터그램은 헤더와 페이로드(Payload, 실제 전송될 데이터)로 구성됩니다.

UDP 데이터그램 헤더

UDP 데이터그램의 헤더는 8바이트로 되어 있으며, 다음과 같은 필드를 포함합니다.

  1. Source Port (2바이트): 송신자의 포트 번호
  2. Destination Port (2바이트): 수신자의 포트 번호
  3. Length (2바이트): 헤더와 데이터의 전체 길이
  4. Checksum (2바이트): 오류 검출을 위한 체크섬

특징

  • 비연결성: UDP는 연결을 설정하거나 해제하지 않습니다. 따라서 데이터그램은 독립적으로 각각 전송됩니다.
  • 비신뢰성: 데이터그램은 순서가 보장되지 않고, 중복되거나 누락될 수 있습니다.
  • 속도가 빠름: 위의 비연결성과 비신뢰성 때문에 오버헤드가 적어 속도가 빠릅니다.

UDP 데이터그램은 실시간 스트리밍, 게임, VoIP 등에서 자주 사용됩니다. 이러한 애플리케이션에서는 데이터의 신속한 전송이 중요하고, 몇몇 누락된 패킷은 크게 문제가 되지 않기 때문입니다.