네트워크/개념

[NW] #10. UDP ( User Datagram Protocol )

코딩하는상후니 2022. 10. 17. 09:05

 

 


 

* UDP ( User Datagram Protocol )

 
 
 
 
 
TCP/IP 를 알아보기 앞서 UDP 를 먼저 살펴보겠다.
 
트랜스포트 계층에서 쓰이는 대표적인 프로토콜 중 하나이다.
 
흔히들 '비연결형' , '비신뢰성' 이란 말들을 많이 사용하는데
 
일방적으로 데이터를 보내는 방식이 주이기 때문에
TCP 반대의 개념으로 비교된다.
 
즉,
수신 측이 어떤 상황이던 상관없이 일단 보낸다는 의미 이다.
그로 인해,
TCP 가 포함하고 있는
수신자가 받을 준비가 되었는지 ( 3-handway-shake ),
네트워크는 혼잡하지 않는지 ( 혼잡 제어 ),
수신자가 데이터를 읽는 속도보다 데이터를 보내는 속도가 더 빠르진 않은지 ( 흐름 제어 )
등의 추가적인 기능들을 사용하지 않음으로써 어떠한 부하도 없이 송신한다.
 
하지만,
데이터가 일부분 손실될 가능성도 있고 데이터의 순서가 바뀌어서 수신자에게 도달할 수 있다.
 
또한 네트워크가 폭주 상태에 빠질 수 있다.
특히 UDP 의 혼잡 제어의 결여UDP 송신자, 수신자 간의 높은 손실률과 TCP 세션을 줄이기도 한다.
 
 
 
 
한 가지 중요한 것은
UDP 가 꼭 신뢰성이 없다라고 말할 수는 없다.
즉, 해당 계층에서 꼭 신뢰성을 판단할 필요가 없다는 말이다.
 
필요에 의해서 해당 프로세스의 신뢰성을 애플리케이션 자체에서 제공할 수 있다.
하지만, 자체적으로 Protocol 로써 신뢰성을 제공하는 TCP/IP 보다 개발자의 노력이 더욱이 필요할 것이다.
 
 
 
일단 UDP 의 과정을 알아보기 전에 다중화에 대해 알아보도록 하자.
 
 
 
 
 
 
 
 
 

* 다중화 ( Multiplexing )  /  역다중화 ( Demultiplexing )

 

네트워크 통신의 관점에서 보자면,
특정 계층에서 세그먼트를 '분해' 시키거나( Demultiplexing )
필요한 데이터를 '결합' 하는 과정 ( Multiplexing ) 을 말한다.
 
 
 
트랜스포트 계층은 세그먼트를 역다중화 과정을 거쳐서 적절한 소켓에 전달해주고
소켓으로부터 나오는 데이터를 모아 세그먼트로 만드는 다중화 과정을 거친다.
 
 
Segmentation 과는 조금 다른 개념이다.
'Segmentation ( 세그먼트화 )'Stream 단위의 데이터를 '절단' 시킬 때 사용되는 말이고
'Multiplexing ( 다중화 )'분해된 데이터를 한 곳에 모으는 과정 ('결합') 을 의미한다.
 
 
그리고 또 하나,
Encapsulation ( 캡슐화) 하고도 조금 혼동될 수 있는데,
'Encapsulation ( 캡슐화 )' 헤더 정보와 같이 데이터를 감싼다는 의미 ( Wrap )이다.
즉,
포장지를 씌운다는 의미와 비슷하기 때문에
데이터를 모으는 개념인 Multiplexing ( 다중화 ) 와는 다르다.
 
'Decapsulation ( 역캡슐화 )' 캡슐화의 반댓말로 감싸져있는 데이터를 푼다는 의미 ( UnWrap ) 가 되겠다.
 
 
 
 
다중화와 역다중화는 단지
트랜스포트 계층에서만 국한되는 것이 아니고 다른 계층에서도 쓰일 수 있다.
 
즉,
다중화 (Multiplexing) 는 어느 계층에서든 데이터를 하나로 묶는 과정 ( '결합' ) 을 말할 때 사용한다.
 
예시로, IP 계층에서의 데이터를 다중화해 캡슐화한 데이터가 Packet ( 패킷 ) 이다.

 

 
 
 
 
 
 
 
 
 
 

* UDP Header

 

 

 
흔히 찾을 수 있는 UDP Header 그림이다.
 
굉장히 단순한 구조이다. 하나씩 설명하자면
 
 
 
* Source Port  :  출발지 포트
 
* Destination Port  :  도착지 포트
 
* Length  :  헤더와 데이터를 합한 UDP 의 전체 길이 정의
 
* Checksum  :  오류 검사를 위한 비트
 
( 모두 16 bit )
 
 
 
=> 여기서 중요하게 상기해야할 것은
위 그림의 UDP Header 는 트랜스포트 계층에서 생성되는 Header 라는 점이다.
 
 
트랜스포트 계층을 지나 IP 계층에서는 IP Header 가 붙겠고
L2 계층에서는 유선을 쓴다면 Ethernet Header 가 붙으면서
실제적으로 UDP + IP + Ethernet Header 로 합쳐져 나가게 된다.
 
 
=> UDP + IP 를 합한 Header 부분'IP 데이터 그램' 이라고 말하기도 한다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

* UDP Checksum 를 통한 오류 검사

 
Checksum 항목은 16bit 로 구성되어있는데,
어떻게 UDP 에서 오류 검사를 하는지 과정을 알아보자.
 
 
=> 체크섬은 세그먼트가 출발지로부터 목적지로 이동했을 때,
UDP 세그먼트 안의 비트에 대한 변경사항이 있는지 검사하는 것이다.

 

 

 

 

 

참고한 책에 따르면 'RFC 1071' 에서 계산 구현에 관한 세부사항을 찾을 수 있다고 한다.
( 위 그림에서는 구분하기 쉽도록 . 기호를 이용했다. )
 
 
예를 들어 3개의 임의의 16 bit 워드가 있다고 가정할 때,
각각 차례로 더하는 2번의 계산을 거치고
마지막 1의 보수를 취한 값을 '체크섬(Checksum)' 으로 들고 있다고 생각하면 된다.
 
 
참고한 책에서는 기존의 3개의 16 bit 워드와 더불어 1의 보수를 더했을 때
모든 비트가 '1' 이 나왔을 때만 오류 검사를 통과 한다고 나와있다.
 
 
=> 만약 오류 검사를 통과하지 못하면 해당 데이터 그램은 폐기한다.
 
 
 
추가적으로,
이건 개인적으로 나의 생각이지만
위 계산처럼 3개의 16bit 들을 저장하고 그것을 확인하기에는
현실적으로 너무 낭비라는 생각이 당연하게 든다.
 
 
그렇지만 우리는 이미 3개의 16bit 를 알고 있지 않나 ??
출발지, 도착지 포트, 길이 정보를 이용해서 체크섬을 구하고
수신자 측에서 계산할 때, 위 4개를 모두 더함으로써 오류 검사를 할 것 같다는 생각이 든다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

* UDP 동작 과정

 

 

 

 

=> 위 그림을 참고해서 대략적인 과정을 설명하자면,
 
 
프로세스가 소켓을 통해 데이터로 보내면 데이터를 일정 크기만큼 자른다.
'Segmantation ( 세그먼트화 )'라고 한다.
 
 
 
일정 크기만큼 잘라진 세그먼트는 목적지, 출발지 등의 정보
즉, UDP Header 를 붙이는 과정을 거친다.
이를 'Multiplexing ( 다중화 )' 라고 한다.
 
반대의 개념으로 'Demultiplexing ( 역다중화 )'
수신자의 입장에서 목적지 포트를 참고하여,
해당 포트에 해당하는 소켓으로 데이터를 밀어넣는다.
 
 
 
네트워크 계층에서는
최종적으로 만들어진 세그먼트에 IP 도착지, 목적지...등의 정보
즉, IP Header 를 붙이는 과정을 거친다.
이를 'IP 데이터 그램으로 캡슐화' 한다고 한다.
 
 
 
만약 유선을 사용한다면
마지막 실질적인 물리적 계층인 데이터 링크에서
이더넷 헤더를 붙이고 NIC 를 통해 게이트 웨이를 거쳐 네트워크 세상으로 나간다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

* UDP 에 대한 고찰 ( 나의 생각 )

 
 
TCP 에 대해서 아직 살펴보진 않았지만,
대략적으로 TCP 는 UDP 와 다르게 혼잡 제어, 흐름제어, 두 터미널 간의 연결 상태 등을 관리하면서
통신하는 방법임을 간접적으로 알았고
그와는 조금 상반되는 UDP 는 수신자에게 데이터를 계속해서 보내는 방식이었다.
 
 
효율적으로 보았을 때,
나는 확실하게 데이터가 옮겨져야하는
파일 전송,  메일, 터미널 접속 등 몇몇 일부만 제외하면 전부 UDP 가 좋은 것이 아닐까 생각이 들었다.
보통의 경우엔 거의 UDP 를 선호할 것이란 예상도 된다.
특히 요즘 같은 실시간으로 무언갈 보여주고 나타내줘야하는 시대에서는 더더욱이 그렇다고 본다.
 
 
하지만,
UDP 방식으로만 네트워크 데이터가 통신되게 되면 라우터끼리 데이터를 보내는데에만 혈안이 되고
네트워크 폭주가 일어날 것이다.
 
또한, 게이트 웨이 ( 라우터 ) 내부 상황도 비슷할 것이다.
 
 
 
아마 정확하지는 않지만,
TCP 가 나오고 난 후 UDP 가 등장했을 가능성이 커보인다.
기존의 TCP 만 존재했을 땐 혼잡제어를 통해서 일정한 데이터 전송 속도를 달성했겠지만,
다양한 프로토콜의 등장과 UDP 등장으로 무분별하게 UDP 와 비슷한 성질의 프로토콜들을 사용함으로써
기존의 TCP 방식은 오히려 자신의 성능을 낮추고 UDP 또한 제 성능을 못내는 것으로 보인다.
한마디로 새로운 개념의 교통 정리 ( 통제 ) 가 안되는 것이다.
 
 
당연히 명쾌한 해답은
UDP 에 TCP 의 기능들을 추가하는 것이 가능하면 해결될 일이다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

* UDP 혼잡 제어 기능

 
UDP 혼잡 제어 방식을 구현한 몇 가지 방법들을 찾아봤다.
 
 
 
 

1. DCCP ( Datagram Congestion Control Protocol )

 
[ RFC 4340 참고 ]
 
=> 전송 계층 Protocol 이며 인터넷 계층까지 확장해서 사용할 수 있다고 나와있다.
 
=> DCCP 는 UDP 를 사용하는 스트리밍 미디어 등에게
혼잡 제어의 설계, ECN 지원, TCP 와 관계된 지연을 피할 수 있는 기능들을 제공한다.
 
 
=> ECN ( Explicit Congestion Notification ) 이란 ??
 
 
=> 네트워크 혼잡을 알리는 인터넷 프로토콜의 확장 이라고 한다.
 
즉,
송신 프로세스에 명시적으로 혼잡을 알려줘서 스스로 트래픽을 완화하는 기술이다.
 
 
 
 
 
 
 
 

2. ProudNet 의 UDP 혼잡 제어 기능

 
 
 
=> 위 참고 링크 내용으로 간략하게 설명하자면,
 
결국,
어떤 두 터미널 간의 통신에서 TCP / UDP 방식이 둘 다 공존하는 상황이 오는데
UDP 방식을 사용하는 프로세스가 많아짐에 따라서
기존의 TCP 방식, 예를 들어 파일 전송, 다운 등과 같은 작업에서
UDP 트래픽이 많아짐으로 TCP 혼잡 제어 기능으로 TCP 연결이 끊겨버린다는 이야기이다.
이것을 '인터넷 블랙아웃 현상' 이라 한다고 나와있다.
 
 
이를 해결하기 위해서,
수신자에서 패킷 유실율과 데이터 수신 속도를 측정한 데이터를
송신자 측에서 받아서 송신 속도를 조절하는 방식을 채택했다.

 

 

즉,
위에서 설명한 ECN 기술을 자체적으로 도입했다고 볼 수 있다.

 

 

 

 

 

 

 

 

 

 


 

참고 자료

 

 

COMPUTER NETWORKING A TOP-DOWN APPROACH 컴퓨터 네트워킹 하향식접근 - 제 6판
( James F. Kurose * Keith W. Ross 지음, 최종원, 강현국, 신용태, 안상현, 유영환, 황호영 옮김 )