UDP: 두 판 사이의 차이

youngwiki
 
(같은 사용자의 중간 판 7개는 보이지 않습니다)
9번째 줄: 9번째 줄:
와 간단한 오류 검사만을 제공할 뿐, TCP가 제공하는 다양한 서비스들, reliable data transfer를 제공하지 않는다. 이는 UDP가 segment를 전송하기 전, 송수신 transport layer간의 handshaking을 거치지 않는 connectionless 프로토콜이기 때문이다. 사실, 애플리케이션 개발자가 TCP 대신 UDP를 선택한다면, 해당 애플리케이션은 거의 직접 IP와 대화하게 되는 셈이다.
와 간단한 오류 검사만을 제공할 뿐, TCP가 제공하는 다양한 서비스들, reliable data transfer를 제공하지 않는다. 이는 UDP가 segment를 전송하기 전, 송수신 transport layer간의 handshaking을 거치지 않는 connectionless 프로토콜이기 때문이다. 사실, 애플리케이션 개발자가 TCP 대신 UDP를 선택한다면, 해당 애플리케이션은 거의 직접 IP와 대화하게 되는 셈이다.


UDP는 애플리케이션 프로세스로부터 message를 받아, multiplexing/demultiplexing 서비스를 위한 송수신 port 번호 필드와 다른 두 개의 필드를 헤더 파일로 붙이고, 그 segment를 network layer를 넘긴다. Network layer는 이 segment를 IP datagram에 캡슐화하고, 그 segment를 수신 호스트에 '''best-effort'''으로 전달하려 한다. Segment가 수신 호스트에 도착하면, UDP는 목적지 port 번호를 사용해 해당 데이터를 올바른 애플리케이션 프로세스에 전달한다. 하지만 UDP만 써도 신뢰성있는 전송이 가능하며, 이는 애플리케이션에서 구현된다.  
UDP는 애플리케이션 프로세스로부터 message를 받아, multiplexing/demultiplexing 서비스를 위한 송수신 port 번호 필드와 다른 두 개의 필드를 헤더 파일로 붙이고, 그 segment를 network layer를 넘긴다. Network layer는 이 segment를 IP datagram에 캡슐화하고, 그 segment를 수신 호스트에 '''best-effort'''으로 전달하려 한다. Segment가 수신 호스트에 도착하면, UDP는 목적지 port 번호를 사용해 해당 데이터를 올바른 애플리케이션 프로세스에 전달한다. 하지만 UDP를 사용하는데 신뢰성있는 전송이 가능하다면 애플리케이션에서 구현해야 한다.


또한 UDP는 TCP와는 달리 congestion control<ref>traffic congestion이 전송 속도를 줄이는 메커니즘</ref>을 지원하지 않는다. 이는 전체 네트워크에 대해서는 부하를 거는 등의 문제를 일으키는 요소이기도 하지만, UDP에 한정하여보면 TCP의 congestion control로 인한 혜택을 직접적으로 볼 있는 부분이기도 하다.
UDP는 TCP와는 달리 congestion control<ref>traffic congestion이 전송 속도를 줄이는 메커니즘으로, traffic congestion이 높아지면 전송 속도를 낮춘다.</ref>을 수행하지 않으므로, 네트워크 혼잡 시에도 전송 속도를 줄이지 않는다. 이는 실시간 애플리케이션에 유리할 수 있으나, 전체 네트워크의 안정성에는 부정적인 영향을 미칠 있다.


==UCP가 사용되는 곳==
==UDP가 사용되는 곳==
TCP는 신뢰성 있는 데이터 전송(reliable data transfer)을 제공하는데, UDP는 그렇지 않다. 그럼에도 여전히 UDP가 사용되는 이유는 다음과 같다:
TCP는 신뢰성 있는 데이터 전송(reliable data transfer)을 제공하는데, UDP는 그렇지 않다. 그럼에도 여전히 UDP가 사용되는 이유는 다음과 같다:
* TCP는 혼잡 제어와 신뢰성 보장을 위해 데이터를 전송하기 전 handshaking을 하고, 이외에도 전송을 늦추거나 재전송을 한다.
* TCP는 혼잡 제어와 신뢰성 보장을 위해 데이터를 전송하기 전 handshaking을 하고, 이외에도 전송을 늦추거나 재전송을 한다.
49번째 줄: 49번째 줄:
|오류 검사용 필드 (데이터 손상 여부 확인)
|오류 검사용 필드 (데이터 손상 여부 확인)
|}
|}
==UDP checksum==
'''Checksum'''은 전송되는 segment에서 flip bit와 같은 error를 찾아내는 메커니즘이다.<br>
송신자 측은 segment 전체(헤더 + 데이터)를 16bit 정수들의 seguence로 간주하고, 그 정수들을 1의 보수 덧셈('''one'complement sum''')으로 더한다. 그리고 그 결과를 checksum 필드에 기록한다.<br>
수신자 측은 수신한 segment에 대해 다시 checksum을 계산하고, 계산한 checksum 값이 segment 안의 checksum feild와 일치하는지 확인한다. 이때 일치하면 오류가 존재하지 않는 것이고,<ref>간혹 감지 못하는 오류도 있다.</ref> 일치하지 않으면 오류가 존재하는 것이다.
===UDP checksum 예시===
예를 들어 segment 파일의 16bit 정수로 1110011001100110, 1101010101010101이 존재한다면, sender의 check sum은 다음과 같이 구해진다.
              1110011001100110
            +  1101010101010101
            ___________________
wraparound = 11011101110111011
            =  1011101110111100
            ___________________
  checksum =  0100010001000011
wraparound란, 최상위 bit가 넘치면 이를 맨 아래 bit에 더하는 것을 의미한다. 그렇게 만들어진 최종 덧셈 결과인 sum에 1의 보수<ref>bit 반전</ref>를 취하면, checksum이 완성된다. 이때 sum과 checksum을 더할 경우에는 bit의 자릿수는 모두 1로 채워진다. 이를 통해서도 error bit 여부를 확인할 수 있다.


==각주==
==각주==
[[분류:컴퓨터 네트워크]]
[[분류:컴퓨터 네트워크]]

2025년 4월 19일 (토) 07:42 기준 최신판

상위 문서: Transport Layer

개요

UDP(User Datagram Protocol)는 transport layer에서 작동하는 프로토콜로, application layer와 network layer간의 데이터를 전달을 담당한다. 동일 계층에서 사용하는 또 다른 프로토콜로는 TCP가 있다.

UDP의 특징

UDP는 Transport Layer가 수행해야 하는 기능 중 가장 최소한만을 수행한다. 즉, UDP는 multiplexing/demultiplexing 와 간단한 오류 검사만을 제공할 뿐, TCP가 제공하는 다양한 서비스들, reliable data transfer를 제공하지 않는다. 이는 UDP가 segment를 전송하기 전, 송수신 transport layer간의 handshaking을 거치지 않는 connectionless 프로토콜이기 때문이다. 사실, 애플리케이션 개발자가 TCP 대신 UDP를 선택한다면, 해당 애플리케이션은 거의 직접 IP와 대화하게 되는 셈이다.

UDP는 애플리케이션 프로세스로부터 message를 받아, multiplexing/demultiplexing 서비스를 위한 송수신 port 번호 필드와 다른 두 개의 필드를 헤더 파일로 붙이고, 그 segment를 network layer를 넘긴다. Network layer는 이 segment를 IP datagram에 캡슐화하고, 그 segment를 수신 호스트에 best-effort으로 전달하려 한다. Segment가 수신 호스트에 도착하면, UDP는 목적지 port 번호를 사용해 해당 데이터를 올바른 애플리케이션 프로세스에 전달한다. 하지만 UDP를 사용하는데 신뢰성있는 전송이 가능하다면 애플리케이션에서 구현해야 한다.

UDP는 TCP와는 달리 congestion control[1]을 수행하지 않으므로, 네트워크 혼잡 시에도 전송 속도를 줄이지 않는다. 이는 실시간 애플리케이션에 유리할 수 있으나, 전체 네트워크의 안정성에는 부정적인 영향을 미칠 수 있다.

UDP가 사용되는 곳

TCP는 신뢰성 있는 데이터 전송(reliable data transfer)을 제공하는데, UDP는 그렇지 않다. 그럼에도 여전히 UDP가 사용되는 이유는 다음과 같다:

  • TCP는 혼잡 제어와 신뢰성 보장을 위해 데이터를 전송하기 전 handshaking을 하고, 이외에도 전송을 늦추거나 재전송을 한다.
    • 이는 실시간 오디오/비디오 스트리밍, 온라인 게임, VoIP등 전송 속도 보장, 낮은 지연이 더욱 중요하다.
      즉 이러한 앱들은 약간의 손실 허용은 허용되므로 재전송이나 지연이 최소화되는 UDP가 사용된다.
    • DNS는 빠른 질의-응답이 중요하기 때문에 UDP를 사용한다.
  • TCP는 수신/송신 버퍼, congestion control parameter, 데이터의 순서 등의 state들을 저장하지만, UDP는 이를 저장하지 않는다.
    이를 통해 서버가더 많은 클라이언트를 처리할 수 있다.
  • 또한 UDP는 TCP에 비해 segment의 헤더 파일이 더 작고 빠르다.

UDP segment structure

UDP 세그먼트는 크게 두 부분으로 나뉘어 있다:

  • 헤더 (Header): 8바이트
  • 데이터 (Payload): 애플리케이션이 전달하는 실제 데이터

또한 UDP의 헤더는 아래 표와 같이 구성된다.

필드 이름 크기(byte) 설명
Source Port # 2바이트 (16비트) 송신 측 포트 번호 – 응답 받을 때 사용됨
Destination Port # 2바이트 (16비트) 수신 측 포트 번호 – 목적 애플리케이션 식별용
Length 2바이트 (16비트) 헤더 + 데이터 전체 길이(byte)
Checksum 2바이트 (16비트) 오류 검사용 필드 (데이터 손상 여부 확인)

UDP checksum

Checksum은 전송되는 segment에서 flip bit와 같은 error를 찾아내는 메커니즘이다.
송신자 측은 segment 전체(헤더 + 데이터)를 16bit 정수들의 seguence로 간주하고, 그 정수들을 1의 보수 덧셈(one'complement sum)으로 더한다. 그리고 그 결과를 checksum 필드에 기록한다.
수신자 측은 수신한 segment에 대해 다시 checksum을 계산하고, 계산한 checksum 값이 segment 안의 checksum feild와 일치하는지 확인한다. 이때 일치하면 오류가 존재하지 않는 것이고,[2] 일치하지 않으면 오류가 존재하는 것이다.

UDP checksum 예시

예를 들어 segment 파일의 16bit 정수로 1110011001100110, 1101010101010101이 존재한다면, sender의 check sum은 다음과 같이 구해진다.

              1110011001100110
           +  1101010101010101
           ___________________
wraparound = 11011101110111011
           =  1011101110111100
           ___________________
  checksum =  0100010001000011

wraparound란, 최상위 bit가 넘치면 이를 맨 아래 bit에 더하는 것을 의미한다. 그렇게 만들어진 최종 덧셈 결과인 sum에 1의 보수[3]를 취하면, checksum이 완성된다. 이때 sum과 checksum을 더할 경우에는 bit의 자릿수는 모두 1로 채워진다. 이를 통해서도 error bit 여부를 확인할 수 있다.

각주

  1. traffic congestion이 전송 속도를 줄이는 메커니즘으로, traffic congestion이 높아지면 전송 속도를 낮춘다.
  2. 간혹 감지 못하는 오류도 있다.
  3. bit 반전