* 웹서핑중 우연히 구했습니다만... 저작권을 요청하라는데 회사도 망한듯하고 이멜도 존재하지 않는거라 약간 고쳐 올려놓습니다. 원저자의 저작권을 생각하여 저작권 원문을 올려놓습니다.
- 그림이 모두 분실된 상태여서 그냥 비워놓습니다.
본 문서에 대한 저작권은 (주)아이즈랩에 있습니다. 무단 전제 또는 복제를 금하며, 비상업적인 목적으로 번역물을 이용할 시에는 webmaster@iznet.org 에 사용에 대한 허가를 받아야 합니다.
User Datagram Protocol(UDP) #
UDP는 datagram 기반의 transport layer protocol이다. TCP와 같은 stream 기반의 protocol은 application에 의해 쓰여지는 data의 양이 하나의 IP datagram에 의해 보내지는 양과 거의 관계가 없다. UDP는 reliable하지 않다. 다시말하면, Packet이 목적 호스트에 꼭 도달한다는 보장은 없다.
(그림)
위의 그림은 UDP encapsulation의 형태이다.
UDP header #
다음 그림은 UDP header의 형태이다.
(그림)
port number는 보내는 그리고 받는 process를 나타내며, UDP length는 UDP header와 data의 크기를 byte의 값으로 나타낸다. UDP checksum은 다음 섹션에서 설명한다.
UDP checksum #
IP header에서의 checksum은 IP header만을 이용해서 구하지만 UDP checksum은 UDP header 뿐만 아니라 UDP data까지를 이용하여 구한다. IP checksum을 구하는 방식과 비슷하다. 그러나 UDP datagram의 길이가 홀수의 바이트가 될 수 있으므로 다음의 방식으로 구한다. 만약 홀수의 바이트 길이라면 바이트 수가 짝수여야 하기 때문에 1바이트 0 pad byte를 추가하여 맞추어 준 후에 계산한다. 그리고 UDP와 TCP는 12-byte의 pseudo-header를 포함하는데 정확한 목적지에 도달했는지 중복 체크를 위해서 pseudo header를 추가해서 구한다. 다음 그림은 pseudo-header를 포함한 UDP datagram이다.
(그림)
checksum이 0이면 전송한 곳에서 checksum을 계산하지 않음을 의미하며, checksum error가 발생하면 에러 메시지 없이 datagram을 버린다.
IP Fragmentation #
IP Fragmentation이란 IP layer로 전달된 datagram을 전송하기 위해 MTU에 맞게 분할하는 작업을 의미한다. MTU는 정해진 값이 아니기 때문에 datagram이 목적 호스트에 도달하기 위해서는 미리 중간 router 등의 MTU값을 알아서 분할해야 한다. Fragmentation은 송신 호스트나 전송 중의 router 등에서 행해지고, 재결합은 도달한 목적 호스트에서만 가능하다. 전송 중 다시 분할되어야 하는 경우도 생긴다. IP header에서의 identification field는 각 IP datagram을 유일하게 특정화 한다. 따라서 fragmentation이 일어나면 각 부분에 이 값을 복사한다. Flags field는 한 bit는 “more fragment”, 한 bit는 “don’t fragment”로 사용된다. Fragment offset field는 원래 datagram의 초기부터 지금의 fragmentation까지의 offset을 포함한다. Total length field는 개개의 fragment들의 크기를 나타낸다.
나뉘어진 datagram은 각자 독립된 datagram으로 여겨진다. Datagram이 목적지에 무질서하게 전송되어도 IP header에 충분한 정보가 들어있기 때문에 receiver는 각 부분을 정확히 재결합할 수 있다.
전송 중에 일부분의 datagram이 손상되었다면 전체 datagram을 다시 전송해야 한다.
ICMP Unreachable Error(Fragmentation Required) #
Fragmentation이 필요한데도 불구하고 “don’t fragment” flag가 set되어 있을 때 발생한다. 이 Error는 목적지까지의 경로의 가장 작은 MTU를 결정하기 위해 사용된다. 이를 path MTU discovery라고 한다. 다음은 ICMP Unreachable Error 메시지의 형태이나 사용되지 않던 영역에 next-hop network의 MTU가 추가된 메시지이다.
(그림)
Traceroute를 이용한 path MTU 결정 #
나가는 interface의 크기로 don’t fragment를 설정해서 패킷을 보내고 ICMP error가 발생하면 크기를 줄여서 다시 보내어서, 찾아낸다.
최대 UDP datagram 크기 #
이론적인 IP datagram의 최대 크기는 65535byte이다. 여기서 IP header 20byte, UDP header 8byte를 제외하면, UDP datagram의 최대 크기는 65507byte가 된다. 하지만 Socket API의 버퍼 크기 제한을 통해서 변화될 수 있다. 일반적으로 UDP socket은 8192 byte 이상이다. 또한 Kernel의 구현에 의해 크기가 변화될 수 있다. 일반적으로 UDP 프로그램들은 512 byte이다.
UDP Server Design #
- Client IP Address & Port Number : Application이 datagram을 받으면 OS가 어디서로 부터 메시지가 전송되었는지 알려 주어야 한다.
- Destination IP Address : 목적지를 알아야 한다. 대부분의 OS가 지원해 준다.
- UDP Input Queue : Input queue가 overflow 되면 datagram은 그냥 버려진다. UDP input queue는 FIFO (arp는 LIFO)이다.
- Restricting Local IP Address : 대부분의 서버는 wildcard로 Local IP Address를 지정한다. Local Interface로 들어온 서버의 port로 향하는 모든 datagram을 받아들인다는 것이다. 같은 포트로 다른 local address를 사용하는 다른 서버를 돌릴 수 있어 IP에 따라 다른 서버를 할당할 수 있다.
- Restricting Foreign IP Address : 일반적으로 *.*을 사용하여 모든 호스트로부터 오는 정보를 처리하도록 한다. Local과 foreign을 적절히 사용하여 제한한다.
- Multiple Recipients per Port : 대부분의 시스템에서는 한 port에 하나의 application end point를 지원하도록 되어있다. 그러나 Multicasting을 지원하는 호스트의 경우 port에 여러 개의 application end point가 존재할 수 있다. 그러므로 multicast, broadcast address로 전해진 데이터는 각각의 end point에 전달하고, unicast address로 오는 것들은 end point중의 하나로 보낸다.








![[http]](/wiki/imgs/http.png)
