UDP에서 패킷사이즈

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
비회원

UDP에서 패킷사이즈

Post by 비회원 »

Maximum 값을 어떻게 잡아야 하나요?

만약 UDP 패킷을 인터넷장비들의 MTU 이상으로 하게 되었을때, UDP 통신이 정상적으로 되나요?

A 가 보낸 "ABCDEF" 라는 패킷이 장비를 거치면서 "AB" "CD" "EF" 로 나눠졌을때 정상적인 "ABCDEF"로 될

거 같지 않아서요 .. 이런 상황을 없애기 위해 패킷사이즈를 알아야 할것 같은데, 보통 어느 값으로 하나요..
myevan
Posts: 1314
Joined: 2003-03-04 10:21
Contact:

Post by myevan »

udp는 안가면 안갔지; 나뉘지는 않습니다.
그래서 최대길이가 더욱 불안합니다만; (실제로 너무 크면 안 갔던 경험이 Orz; )
대개 MTU 사이즈를 봤을때 프로그래머가 좋아하는 숫자중 하나인 1024정도를 최대치로
잡았었습니다만; (실제 보낸건 그보다 더 적었고요.. )
빗자루네 http://www.myevan.net >_<b
ducklmg
Posts: 155
Joined: 2004-11-08 16:46

Post by ducklmg »

TCP 데이터 조각이 되었든 UDP 데이터 조각이 되었든
데이터가 network layer(IP)로 내려왔는데 다음번 라우터와의 MTU보다 크다면
fragmentation(조각화)되어서 다음번 라우터에서 다시 assemble됩니다.
다음번 라우터는 다시 그 다음번 라우터에 똑같은 일을 하게 됩니다. 도착할때까지...

UDP는 transport layer의 프로토콜이므로 MTU크기와 전혀 상관이 없습니다.
다만 fragmentation 안 할 수 있을 정도의 크기라면 빨리 가겠죠.
하지만 패킷이 보낸곳에서 목적지까지 가는 동안 여러개의 라우터를 거칠것이므로
그 라우터들의 최소 MTU를 찾는게 애매하죠...

@ getsockopt(SO_MAX_MSG_SIZE) 하면 UDP의 최대패킷 크기를 알 수 있다고 합니다.

@@ Ethernet의 MTU는 최대 1500 바이트 입니다.
난 너를 만나기 위해 이 세상에 태어났어
그러니 내 생활비는 네가 대 주어야만 해
조순현
Posts: 115
Joined: 2004-07-02 22:14
Location: 네오위즈 게임즈
Contact:

Post by 조순현 »

의문이 생겨서 자료를 찾아 보았습니다. UNIX Network Programming Volume 1 Second Edition 한국어판 2.9절 47쪽에 다음과 같은 내용이 있습니다. 참고로 아래 글에서 떠돌이는 datagram을 말합니다;
IPv4와 IPv6에서 최소 재결합용 버퍼 크기를 정의한다. 이 크기는 모든 구현에서 통용되는 최소 떠돌이 크기이다. IPv4에서 이는 576바이트이고 IPv6에서는 이를 1500바이트로 늘렸다. 예를 들면, IPv4에서 577바이트의 떠돌이를 목적지에서 받을 수 있는지는 알 수가 없다. 그러므로 UDP를 사용하는 많은 IPv4 응용(DNS, RIP, TFTP, BOOTP, SNMP)은 이 크기보다 큰 IP 떠돌이를 만들 수 없도록 되어 있다.
다음은 위의 내용을 뒷받침하는, RFC 791에서 IPv4 header의 total length 부분을 설명하는 부분입니다. 3.1절의 13쪽인데 그 부분만 link가 안 돼서 인용합니다.
Total Length is the length of the datagram, measured in octets,
including internet header and data. This field allows the length of
a datagram to be up to 65,535 octets. Such long datagrams are
impractical for most hosts and networks. All hosts must be prepared
to accept datagrams of up to 576 octets (whether they arrive whole
or in fragments). It is recommended that hosts only send datagrams
larger than 576 octets if they have assurance that the destination
is prepared to accept the larger datagrams.

The number 576 is selected to allow a reasonable sized data block to
be transmitted in addition to the required header information. For
example, this size allows a data block of 512 octets plus 64 header
octets to fit in a datagram. The maximal internet header is 60
octets, and a typical internet header is 20 octets, allowing a
margin for headers of higher level protocols.
위의 내용을 고려해 볼 때 IPv4에서 사용자가 보내면 좋은, 순수 UDP data의 최대 크기는 다음과 같이 계산할 수 있습니다. 576(모든 host에서 지원되는 datagram의 최대 크기) - 60(IPv4 header의 최대 크기) - 8(UDP header의 크기) = 508 byte. 단, IPv4 header의 일반적인 크기는 20 byte이므로 순수 data의 크기가 좀 더 커도 될 듯합니다.

Packet의 크기가 MTU보다 커지면 속도뿐만 아니라 전송 성공률에도 영향을 주게 됩니다. Packet의 크기가 MTU보다 커지면 커질수록 조각화가 많이 발생합니다. 그리고 조각화된 것 중 하나라도 전송에 실패하면 전체 UDP packet의 전송이 실패합니다. 따라서 packet이 MTU보다 커지면 커질수록 전송 실패 확률도 높아집니다.
쉬운 것은 올바르다.
Locked