블로그 이전했습니다. https://jeongzero.oopy.io/
비연결형 전송계층 프로토콜 : UDP
본문 바로가기
컴퓨터 관련 과목/Network

비연결형 전송계층 프로토콜 : UDP

728x90

UDP는 세그먼트를 송신하기 전에 송신 트랜스포트 계층 개체들과 수신 트랜스포트 계층 개체들 사이에 핸드쉐이크를 사용하지 않는다는 것을 다 알고 있을 것이다. TCP는 연결지향형으로 신뢰성을 보장한다는 특징이 있다. 데이터를 송수신 하기 전에 먼저 연결설정 과정을 거쳐야 하고 송신한 패킷에 오류가 있거나 손실이 있을 경우 재전송을 하기 때문에 신뢰성을 보장한다는 장점이 있지만 그로 인해 속도가 저하된다는 단점이 있다.


UDP는 TCP와는 달리 다음과 같은 특징을 가지고 있다.


1. 연결 설정이 없다.

TCP는 데이터 전송을 시작하기 전에 3-way 핸드세이킹을 사용한다. 반면에 UDP는 그러한 예비동작없이 바로 동작하므로 연결 설정에 관한 어떤 지연도 존재하지 않는다.


2. 연결 상태가 없다.

TCP는 종단 시스템에서 연결 상태를 유지한다. 이 연결 상태는 수신 버퍼 및 송신 버퍼, 혼잡제어 파라미터, 순서번호와 확인응답 번호 파라미터를 포함한다. 상태 정보는 TCP의 신뢰적인 데이터 전송 서비스를 구현하고 혼잡제어를 제공하기 위해서 필요하다. 반면에 UDP는 연결 상태를 유지하지 않고 파라미터 중의 어떤 것도 기록하지 않는다. 따라서 일반적으로 특정 애플리케이션에 할당된 서버는 애플리케이션이 TCP보다 UDP에서 동작할 때 좀 더 많은 클라이언트를 수용할 수 있다.


3. 작은 패킷 헤더 오버헤드

TCP의 헤더에 비해 UDP의 헤더는 확연이 그 사이즈가 작다.


TCP가 좋다 UDP가 좋다는 구분할 수 없다. 각 용도에 맞춰서 사용해야 한다. 신뢰성이 굉장히 중요한 HTTP 프로토콜에는 TCP를 사용해야 할 것이며 그다지 신뢰성보다는 속도가 우선적으로 중요시되는 경우에는 UDP를 사용해야 한다.




위 그림은 UDP 세그먼트 구조를 나타낸다. 딱 봐도 간단해 보인다. UDP 헤더는 발신지 포트번호, 수신지 포트번호만을 필요로 하며 또한 패킷 전체의 길이와 체크섬을 가지고 그 밑에는 애플리케이션 메시지 부분이다.


근데 여기서 말하는 체크섬이란 무엇일까? 


체크섬이란 오류 검출을 제공해주는 기능이다. 위에서 UDP는 신뢰성을 보장하지 않는다고 했는데 아예 1도 안하는 거는 아니고 최소한 어느정도는 보장해 주는데 이는 체크섬으로 보장해준다. 체크섬은 세그먼트가 출발지로부터 목적지로 이동 했을 때 UDP 세그먼트안의 비트에 대한 변경사항이 있는지 검사하는 것이다. 송신 측에서 UDP는 세그먼트 안에 있는 모든 16비트 워드 단위로 더하고 이에 대하여 다시 1의 보수를 수행하며, 덧셈 과정에서 발생하는 오버플로는 윤회식 자리올림한다. 그리고 이 결과값이 체크섬 필드에 들어가게 된다. 이해하기 쉽게 예를 들어서 설명하겠다.


세그먼트가 10110101010101010101010101010101101110111011101011101110111110110110101..... 만약 이렇게 되있다면 이거를 16비트씩 쪼개서 더한다. 만약 쪼개어 다음과 같이 3개가 나온다 가정해보자.



1. 0110011001100000

2. 0101010101010101

3. 1000111100001100



그러면 위에서 부터 더하자.  1 과 2를 더하면 



0110011001100000

0101010101010101

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1011101110110101



이제 이거를 3번과 더하면



  1000111100001100

  1011101110110101

  ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1 0100101011000001



이렇게 나오는데 앞에 1이 오버플로로 나온다. 이를 다시 맨 처음에 더한다(이를 윤회식 자리올림이라 함) 따라서 최종적으로



0100101011000001

                       1

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

0100101011000010


이렇게 나오고 이 값을 1의 보수화 시켜서 체크섬 필드에 넣어준다.


그렇다면 오류 검출을 어케 할까? 송신자가 위 와 같이 체크섬을 계산하여 체크섬필드에 값을 넣어서 전송하고 수신자는 해당 세그먼트를 받았을 때 세그먼트에 대한 값을 더하고 해당 세그먼트 값을 더한다. 위 예로 설명하자면 수신다는 3개의 16비트 워드를 더하고 그 값에 체크섬 필드에 들어있는 체크섬 값을 더한다. 만약 비트에 오류가 없다면  비트의 합이 1111111111111111 이 나와야 한다. (체크섬 값이 3개의 16비트 워드의 값의 1의 보수이므로 당연한 소리 ㅇㅋ?)


이렇게 UDP는 오류검사를 제공한다. 하지만 오류를 회복하기 위한 어떤 일도 하지 않는다. 단순히 오류가 있나 없나만 검출하는 수준에서 멈춘다. 오류가 있다면 단순히 버리거나 아니면 애플리케이션 계층에 여기 오류가 있어요 ~~ 하고 알려주고 넘겨준다.



728x90

'컴퓨터 관련 과목 > Network' 카테고리의 다른 글

TCP 혼잡제어  (0) 2019.01.05
연결지향형 전송계층 프로토콜 : TCP  (0) 2019.01.05
DNS란?  (1) 2019.01.05
쿠키란?(먹는거 아님)  (0) 2019.01.03
HTTP 메시지 포맷  (0) 2019.01.03