[네트워크] TCP와 UDP의 특징

전윤혁·2024년 5월 11일

Networks

목록 보기
2/6

TCP와 UDP란?

TCP와 UDP 모두 OSI 7계층의 전송 계층 (Transport Layer) 에서 사용되는 프로토콜로, 데이터 전송을 위해 사용되는 프로토콜이다. TCP와 UDP 각각은 서로 다른 특징과 용도를 가지고 있으며, 데이터 전송의 신뢰성과 속도 측면에서 차이를 보인다.

전송 계층의 구조적 위치가 혼동되는 경우, 아래의 게시물을 먼저 읽은 후 해당 프로토콜들의 특징들을 살펴보는 것을 추천한다.

https://velog.io/@airoca/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5-OSI-7-Layer-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC


1. TCP (Transmission Control Protocol)

TCP는 연결 지향적인 프로토콜로, 데이터 전송 전에 통신을 위한 연결을 설정한다. TCP는 3-way handshaking 과정을 통해 연결을 설정하고, 4-way handshaking 과정을 통해 연결을 해제한다. 3-way handshaking과 4-way handshaking의 과정은 아래의 그림들과 같다.

3-way handshaking

  • SYN (Synchronize) : 클라이언트는 서버에 연결 요청을 보내기 위해 SYN 패킷을 전송한다. 이 패킷에는 클라이언트가 생성한 초기 시퀀스 번호(ISN: Initial Sequence Number)가 포함되어 있다. 이 단계에서 클라이언트는 연결의 활성화와 동기화를 위해 자신의 시퀀스 번호를 서버에 알린다.

  • SYN+ACK (Synchronize+Acknowledgment): 서버는 클라이언트의 SYN 요청을 받고, 클라이언트의 시퀀스 번호를 확인한 후 그 번호에 1을 더한 값을 ACK 번호로 설정하여 ACK 패킷을 클라이언트에게 전송한다. 또한, 서버는 자신의 초기 시퀀스 번호를 설정하여 SYN 패킷 또한 클라이언트에게 전송한다. 이 단계에서 서버는 클라이언트의 연결 요청을 수락했으며, 자신의 시퀀스 번호도 동기화를 시작한다는 것을 알린다.

  • ACK (Acknowledgment): 클라이언트는 서버의 SYN+ACK 패킷을 받고, 이를 확인한 후 서버의 시퀀스 번호에 1을 더한 값을 ACK 번호로 설정하여 ACK 패킷을 서버에게 전송한다. 이 패킷을 통해 클라이언트는 서버의 시퀀스 번호를 인정하고, 양방향 통신이 가능한 상태가 되었음을 서버에 알린다.

4-way handshaking

  • FIN: 클라이언트가 연결을 종료하려 할 때, 클라이언트는 서버에게 FIN 패킷을 보내 연결 종료 의사를 표시한다. 이 때 클라이언트는 여전히 서버로부터 데이터를 받을 수 있는 상태이다. (FIN_WAIT_1 상태)

  • ACK: 서버는 클라이언트의 FIN 패킷을 받고, 해당 FIN 패킷에 대한 ACK 패킷을 클라이언트에게 보낸다. 서버는 이 단계에서 클라이언트에게 자신이 아직 보낼 데이터가 남아있을 수 있음을 알리고, 모든 데이터 전송을 완료할 때까지 기다린다. (CLOSE_WAIT 상태)

  • FIN (서버): 서버가 모든 데이터를 클라이언트에게 전송하고 난 후, 서버는 클라이언트에게 또 다른 FIN 패킷을 보내 연결 종료를 재차 요청합니다. 이 때 서버는 자신이 더 이상 보낼 데이터가 없다는 것을 클라이언트에 알린다. (LAST_ACK 상태)

  • ACK (최종): 클라이언트는 서버의 FIN 패킷을 받고, 이에 대한 최종 ACK 응답을 서버에 보낸다. 이 ACK 패킷을 서버가 수신하면, 서버는 연결을 완전히 종료하고 리소스를 해제한다. (TIME_WAIT 상태) 클라이언트도 이 ACK 패킷이 전송된 후 일정 시간이 지나면 연결을 완전히 종료하고 리소스를 해제한다.

왜 연결을 종료할 때는 4-way handshake를 사용하는가?
위와 같은 의문이 생길 수 있다. 연결 설정을 위한 3-way handshaking 과정에서는 SYN+ACK 과정을 통합하였는데, 그렇다면 연결을 종료할 때도 서버의 ACK와 FIN 단계를 통합하면 되지 않을까? 연결을 해제할 때 4-way handshake를 사용하는 이유는 클라이언트 측에서 연결을 해제하고자 하더라도, 서버 측에서 아직 보낼 데이터가 남아있을 수 있기 때문이다. 따라서 한 쪽이 연결 종료를 시작하더라도, 다른 쪽은 연결을 유지한 채 추가 데이터를 보낼 수 있어야 한다.

TCP의 특징

  • 연결 지향적 프로토콜: 3-way handshaking 과정을 통해 연결을 설정하고, 4-way handshaking 과정을 통해 연결을 해제한다.

  • 신뢰성: TCP는 패킷 손실이 발생했을 경우 재전송을 요청함으로써 데이터가 정확하게 도착하도록 보장한다.

  • 순서 보장: 송신된 데이터의 순서대로 데이터가 도착하도록 보장한다. 만약 패킷이 순서대로 도착하지 않는 경우, TCP는 받은 패킷을 재정렬하여 올바른 순서로 만든다.

  • 흐름 제어: 네트워크의 혼잡 상태를 고려하여 데이터 전송 속도를 조절한다. 수신측의 데이터 처리 속도가 송신 측보다 느릴 경우, 송신 측의 데이터 전송량을 수신측에 따라 조절한다.

  • 혼잡 제어: 네트워크 내의 혼잡을 감지하고, 네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지한다. 흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송 문제를 다룬다.


2. UDP

UDP는 비연결형 프로토콜로, 데이터를 전송하기 전 사전에 연결을 설정하지 않는다. UDP는 데이터를 데이터그램 단위로 처리한다. 연결을 위해 할당되는 논리적인 경로가 없고, 각각의 패킷은 다른 경로로 전송되며, 독립적인 관계를 지닌다.

위의 그림에서 볼 수 있듯이, UDP는 연결을 설정하고 해제하는 과정이 존재하지 않고, 패킷에 순서를 부여하여 재조립을 하는 작업도 처리하지 않는다.

UDP의 특징

  • 비연결성: 연결을 설정하지 않으며, 각 패킷은 독립적으로, 다른 패킷과 관계 없이 전송된다.

  • 속도: 연결 설정이 필요 없고, 패킷 순서 재조립, 흐름/혼잡 제어 등의 기능도 존재하지 않기에, 오버헤드가 적어 TCP보다 데이터 전송 속도가 빠르다.

  • 비신뢰성: UDP는 패킷 손실에 대해 재전송을 요청하지 않는다. 따라서 패킷이 유실되거나 순서가 뒤바뀌어 도착할 수 있다.

  • 간결함: 최소한의 프로토콜 메커니즘만을 제공하여, 구현이 간단하다.


TCP와 UDP의 비교

TCP 사용 분야

  • 웹 브라우징
    TCP는 웹 페이지를 안전하고 정확하게 로드하기 위해 사용된다. HTTP/HTTPS 통신은 웹 서버와 브라우저 간의 신뢰성 있는 데이터 교환을 요구하기 때문에 TCP를 사용한다.

  • 이메일 전송
    이메일 서비스는 메시지가 손실 없이 정확히 전송되어야 하기 때문에 TCP를 사용한다. SMTP(메일 전송), POP, IMAP(메일 수신) 프로토콜은 모두 TCP 기반이다.

  • 파일 전송
    파일을 전송하는 경우, 데이터의 정확성이 중요하기 때문에 TCP를 사용한다. FTP(File Transfer Protocol)는 파일을 안전하게 전송하기 위해 TCP를 사용한다.

  • 데이터베이스 관리
    데이터베이스 서버와 클라이언트 간 데이터 교환의 경우, 신뢰성을 보장하기 위해 TCP를 사용한다.

UDP 사용 분야

  • 스트리밍 서비스
    비디오 또는 오디오 스트리밍 같은 실시간 서비스는 일부 패킷 손실을 감수하면서도 지연 시간을 최소화하기 위해 UDP를 사용한다.

  • 온라인 게임
    온라인 게임에서는 빠른 응답 시간이 중요하다. UDP는 연결 설정과 재전송에 소요되는 시간을 줄여주므로, 온라인 게임과 같은 실시간 인터랙션에 적합하다.

  • VoIP (Voice over IP)
    VoIP는 전통적인 전화망 대신 인터넷 연결을 사용해 전화 통화를 하게 해주는 기술이다. 전화 통화와 같은 음성 서비스는 연속성이 중요하며, 일부 데이터 손실이 발생하더라도 통화의 자연스러움을 유지할 수 있다.

profile
전공/개발 지식 정리

0개의 댓글