인터넷에서 가장 큰 안전한 UDP 패킷 크기는 무엇입니까


201

UDP 패킷 크기에 대한 많은 기사를 읽었지만 올바른 내용에 대한 결론을 내릴 수 없었습니다.

많은 서비스가 가장 큰 UDP 패킷을 512 바이트 (예 : dns)로 제한합니다

인터넷 에서 최소 MTU 는 576이고 IPv4 헤더의 크기는 20 바이트이고 UDP 헤더는 8 바이트입니다. 사용자 데이터에 548 바이트를 사용할 수 있습니다.

패킷 조각화없이 최대 548 크기의 패킷을 사용할 수 있습니까? 또는 DNS 제작자가 알고있는 것이 있습니까? 왜 512 바이트로 제한했는지에 대한 이유입니다.

548 바이트 이상으로 안전하게 갈 수 있습니까?



10
엄밀한 다른 질문입니다. 조각화되지 않을 인터넷을 통해 (다른 네트워크에 대한 지식이나 조사없이) 보낼 수있는 가장 큰 패킷이 무엇인지 묻고 있습니다. 본질적으로 최대 안전 크기로, 연결 프로브에 대해 걱정할 필요없이 모든 곳에서 작동합니다.
KM

2
조각화의 가능성을 제거 할 수는 없지만 안전성을 떨어 뜨리지는 않습니다. 프래그먼트가 삭제되면 전체 패킷이 삭제 된 것과 동일하며 UDP와 함께 발생합니다. 패킷이 라우터가 지원하는 데 필요한 최소 크기를 초과하여 배달이 보장되지 않는 경우 (안전하지 않음)는 안전하지 않습니다. 이곳은 512 바이트 수치입니다.
Beejor

답변:


129

• 그래도 그것은 사실이다 일반적인 IPv4 헤더는 20 바이트이며, UDP 헤더가 8 바이트입니다. 그러나 IP 헤더의 크기를 60 바이트까지 늘릴 수있는 IP 옵션을 포함 할 수 있습니다. 또한 패킷을 대상으로 라우팅하기 위해 중간 노드가 IPsec (VPN 등에 사용) 과 같은 다른 프로토콜 내에 데이터 그램을 캡슐화해야하는 경우 가 있습니다. 따라서 특정 네트워크 경로 에서 MTU 를 모르는 경우 예상치 못한 다른 헤더 정보에 대해 합리적인 여유를 두는 것이 가장 좋습니다. 512 바이트 UDP 페이로드는 일반적으로 그렇게하는 것으로 간주되지만 최대 크기의 IP 헤더를위한 충분한 공간을 남겨 두지는 않습니다.


36
명확하게 말하면, 조각화를 피하기 위해 작은 크기를 갖는 것이 패킷을 "안전하게"전달하지는 않지만, 네트워크 케이블을 개로 먹는 것과 같이 배달을 신뢰할 수 없게 만드는 가능성은 여전히 ​​무한합니다. 그것은 말했다; 프래그먼트가 적 으면 둘 이상이 있고 그중 하나가없는 경우 전체 패킷 (데이터 그램)이 UDP에 의해 삭제되므로 전송 "safer"가됩니다.
markmnl

3
의문의 여지가 있기 때문에, 우리는 '안전'이라는 포스터 정의를 사용하는 것으로 추정 할 것입니다.
Astara

실제 라우터가 UDP 패킷을 조각화하는 대신 드롭하는 것으로 알려져 있습니까?
user253751

60

UDP 패킷의 최대 크기에 대한 이론적 한계 (Windows)는 65507 바이트입니다. 이것은 여기 문서화되어 있습니다 :

올바른 최대 UDP 메시지 크기는 다음 공식에 따라 결정되는 65507입니다. 0xffff-(sizeof (IP Header) + sizeof (UDP Header)) = 65535- (20 + 8) = 65507

즉, 대부분의 프로토콜은 훨씬 작은 크기 (일반적으로 512 또는 때때로 8192)로 제한됩니다. 안정적인 네트워크를 사용하는 경우 종종 548 이상으로 안전하게 갈 수 있지만 인터넷을 통해 크게 브로드 캐스트하는 경우 더 큽니다. 패킷 전송 문제와 손실이 발생할 가능성이 높아집니다.


39
Microsoft 링크는 규범적인 참조가 아닙니다. RFC는 표준 기준입니다. 인용 한 내용은 IPv4에만 적용됩니다.
Lorne의 후작

2
MS가 허용한다고해서 중간 라우터 등이 더 큰 패킷 크기를 조각화해야 할 수도 있기 때문에 항상 좋은 생각은 아닙니다.
rogerdpack

1
@EJP Microsoft 링크에서 명확하게 설명하지는 않지만 IPv4의 필수 결과 인 것 같습니다. IPv4 총 길이 필드는 16 비트이며이 값에는 IP 헤더 길이와 UDP 헤더
jtpereyda

@jtpereyda 나는 모든 것을 완전히 알고 있습니다. 내 요점은 내가 이미 언급 한 것입니다.
Lorne의 후작

내 wifi 카드 (IEEE 802.3)가 1500 MTU 만 할 수 있고 점보 프레임이 9k 바이트이기 때문에 최대 UDP 패킷 크기는 65,507 바이트라고 생각하지 않습니다.
기독교 스튜어트

52

안전한 최대 UDP 페이로드는 508 바이트입니다. 이는 최대 60 바이트 IP 헤더와 8 바이트 UDP 헤더를 뺀 576의 패킷 크기입니다. 이 크기 이하의 UDP 페이로드는 IP를 통해 전달 될 수 있습니다 (전달되지는 않지만). 어떤 이유로 든 더 큰 것은 모든 라우터에 의해 완전히 삭제 될 수 있습니다. 최대 페이로드가 1,212 바이트 인 IPv6 전용 경로는 제외합니다. 다른 사람들이 언급했듯이 일부 상황에서는 추가 프로토콜 헤더가 추가 될 수 있습니다. 약 300-400 바이트의보다 보수적 인 값이 선호 될 수 있습니다.

모든 UDP 패킷이 조각화 될 수 있습니다. 그러나 조각을 잃는 것은 조각화되지 않은 패킷을 잃는 것과 같은 효과를 갖기 때문에 너무 중요하지 않습니다. 전체 패킷이 삭제됩니다. UDP를 사용하면 어느 쪽이든 일어날 수 있습니다.

흥미롭게도 이론상 최대 패킷 크기는 약 30MB (1,500 이더넷 MTU-60 IP 헤더 x 65,536 최대 조각 수)이지만, 통과 가능성은 무한합니다.

출처 : RFC 791, RFC 2460


2
기본적으로 모든 UDP 패킷은 "_U_nreliable"로 간주됩니다. 수신 할 것으로 예상되는 유일한 안전한 UDP 패킷 크기는 조각화되지 않은 1 패킷입니다. "안전한"패킷을 원하면 TCP 위에 패킷 프로토콜을 사용하십시오.
Astara

26
@Astara 사실, UDP는 신뢰할 수 없습니다. 그러나 문제는 주어진 크기의 패킷이 전달 될 수 있는지, 전달되지 않을 수 있는지 여부입니다. 특정 크기를 초과하는 패킷은 어떤 이유로 든 라우터에 의해 삭제 될 수 있습니다 ( 반드시) . 산업 표준에 따라 작은 라우터는 모든 라우터에서 처리 해야합니다 . 따라서이 경우 "안전"은 "내 차가 교량에 잘 맞을 것"을 의미하고 "내 차가 교통 체증에 빠지지 않을 것"을 의미합니다.
Beejor

1
UDP는 실제로 신뢰할 수 있기 때문에 임의의 사람이 말한 것을 반복하지 말고 사실을 확인하는 것이 좋습니다. BTW TCP의 불필요한 오버 헤드없이 UDP 위에 안전한 패킷이 있습니다. openmymind.net/How-Unreliable-Is-UDP
Pablo Ariel

5
UDP는 손실 된 패킷 의 으로 인해 "신뢰할 수없는"것이 아니라 패킷이 삭제 될 수 있기 때문 입니다. 특정 패킷 도착, 주문 또는 확인에 "의존"할 수 없습니다. 데이터는 깨지기 쉬우 며 99 %, 올바른 방향으로 89 % 작동하는 자동차 조향 장치는 신뢰할 수 있다고 말하는 것과 같습니다. UDP가 많은 점에서 좋지 않은 것은 아니지만 기본적으로 자체 "TCP"버전을 작성해야합니다. 게임 개발자 세계에서 흥미로운 실제 사례가 있습니다 (약간 구식 임) : gamasutra.com/view/feature/131781
Beejor

@Beejor 당신은 옳은 길을 가고 있었지만 "기본적으로"TCP "를 자신의 버전으로 작성해야한다는 것은 명백히 잘못된 것입니다. UDP는 브로드 캐스트에 적합하고 '중요하지 않은'데이터의 빠른 전송에 좋습니다. (게임과 관련하여) UDP를 사용하여 (LAN) 서버 / 서비스를 검색하고 UDP를 사용하여 플레이어 위치를 빠르게 보낼 수 있습니다. 하나의 패킷이 삭제되는 경우; 다음 패킷에 다른 플레이어의 최신 위치가 있으므로 걱정하지 않아도됩니다. TCP는 "순서가없는 (out-of-order)"패킷을 가질 수 있고, 오버 헤드를 가지며 일대 다 연결을 수행하지 않습니다. 경우에 따라 UDP가 더 적용될 수 있습니다.
Paul

46

576은 최소 최대 재 조립 버퍼 크기입니다 . 즉, 각 구현은 최소한 해당 크기의 패킷을 재 조립할 수 있어야합니다 . 자세한 내용은 IETF RFC 1122 를 참조하십시오.


2
IPv6을 지원하지 않는 네트워크가있는 경우에만 가능합니다. IPv6을 사용하는 경우 IPv6 헤더의 최대 패킷 크기를 사용한 다음 IPv6에서 IPv4를 수행하기위한 캡슐화 헤더를 뺍니다. ;-)
Astara

@Astara IPv6에서 보낸 사람이 조각화를 수행하므로 복잡한 비준수 중간 라우터에는 문제가 없습니다. 그리고 수신자가 메모리 제약이있는 임베디드 크기가 아니라면 적어도 64kB까지 패킷을 다시 어셈블 할 수 있습니다.
user253751

@ user253751 조각화 할 수있는 비 호환 라우터 만이 아닙니다. Path MTU Discovery가 있지만 조각화를 완전히 제거하기에는 충분하지 않습니다.
dstromberg

@dstromberg IPv6 라우터는 어떤 상황에서 데이터 그램을 조각화 할 수 있습니까?
user253751

@ user253751 아직 IPv6가 많지 않지만 여기에 한 가지 예가 있습니다. 점보 그램을 지원하는 다른 IPv6 네트워크로 점보 그램 (> 65536 바이트)을 보내는 IPv6 네트워크를 상상해보십시오. 또한 Path MTU Discovery는 이러한 점보 그램이 조각화없이 지원되어야한다고 말합니다. 그러나 라우터의 전원이 순환되고 네트워크 경로의 일부가 점보 그램 용으로 구성되지 않은 장비로 대체됩니다.
dstromberg

14

이 문서에서는 최대 전송 단위 (MTU)에 대해 설명합니다. http://en.wikipedia.org/wiki/Maximum_transmission_unit 합니다. IP 호스트가 IP 패킷에 대해 576 바이트를 처리 할 수 ​​있어야합니다. RFC 791 : "모든 인터넷 모듈은 추가 조각화없이 68 옥텟의 데이터 그램을 전달할 수 있어야합니다. 이는 인터넷 헤더가 최대 60 옥텟이며 최소 조각은 8 옥텟이기 때문입니다. "

따라서 508 = 576-60 (IP 헤더)-8 (udp 헤더)의 안전한 패킷 크기가 합리적입니다.

user607811에서 언급했듯이 다른 네트워크 계층에 의한 조각화는 재 조립되어야합니다. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 리 어셈블리 IP 계층은 반드시 IP 데이터 그램의 리 어셈블리를 구현해야합니다. EMTU_R ( "Effective MTU to receive")로 재 조립할 수있는 가장 큰 데이터 그램 크기를 지정합니다. 이것을 "재 조립 버퍼 크기"라고도합니다. EMTU_R은 576 이상이어야합니다.


11

IPv4 최소 재 조립 버퍼 크기 는 576이고 IPv6의 크기 는 1500입니다. 여기에서 헤더 크기를 뺍니다. W. Richard Stevens의 UNIX 네트워크 프로그래밍 참조 :)


1
물론 최소입니다. 그것을 찾아 주셔서 감사합니다. 몇 년 동안 아무도 그 실수를 눈치 채지 못했을 것입니다.
Nikolai Fetissov 1

1
IPv6에는 1500의 최소 재 조립 버퍼가있을 수 있지만 IPv6 패킷은 조각화 될 수 없으며 최소 IPv6 MTU는 1280입니다. 최종 장치는 조각난 IPv6 패킷을 다시 어셈블 할 필요가 없습니다.
Ron Maupin

1
@RonMaupin IPv6 패킷은 엔드 포인트에 의해 조각화 될 수 있습니다. 라우터들 사이가 아니라
Navin

3
@Navin, 아니오, IPv6 패킷은 조각화되지 않으며, 데이터는 IPv6 패킷으로 패키지되기 전에 조각화되어야하지만 패킷 자체는 조각화되지 않습니다. 차이가 있습니다. 조각화를 처리 할 필드가있는 IPv4 패킷 헤더와 달리 IPv6 패킷 헤더는 조각화를 처리 할 항목이 없습니다. IPv6 패킷 헤더는 IPv4 패킷 헤더보다 훨씬 간단합니다.
Ron Maupin


6

IPV6의 크기가 1500이라는 점을 감안할 때, 통신 사업자는 IPV4와 IPV6에 대해 별도의 경로를 제공하지 않으며 (두 유형이 모두 IP 임) 이전, 중복, 유지 관리 비용이 많이 드는 ipv4 용 장비로 강제 전송합니다. 신뢰성이 떨어집니다. 말이되지 않습니다. 게다가, 그렇게하는 것은 일부 트래픽에 대해 우대적인 처리를 제공하는 것으로 쉽게 고려 될 수 있습니다.

따라서 1472는 외부 사용에 안전해야합니다 (EDNS에 대해 알지 못하는 DNS와 같은 앱이 허용하지는 않지만) 내부 네트워크와 대화하는 경우 네트워크 레이아웃을 알 수 있습니다. 점보 패킷 크기는 조각화되지 않은 패킷에 4096-4068 바이트에 적용되며 패키지 크기가 ... wait ... 8086 바이트 인 9014 바이트 버퍼가있는 인텔 카드의 경우 최대 ... 우연일까요? 낄낄 웃다

****최신 정보****

다양한 답변은 하나의 SW 공급 업체가 허용하는 최대 값 또는 캡슐화를 가정 한 다양한 답변을 제공합니다. 사용자는 가능한 가장 안전한 값 (예 : 안전한 UDP 크기의 경우 "0")은 아니지만 가장 큰 안전한 패킷 크기를 요구했습니다.

다양한 레이어에 대한 캡슐화 값이 여러 번 포함될 수 있습니다. 스트림을 캡슐화 한 이후에는 그 아래의 VPN 계층과 그 위의 캡슐화 계층의 완전한 복제를 금지하는 것은 없습니다.

질문은 최대 안전 값에 관한 것이기 때문에 수신 할 수있는 UDP 패킷의 최대 안전 값에 대해 이야기하고 있다고 가정합니다. UDP 패킷이 보장되지 않으므로 UDP 패킷을 수신하는 경우 가장 안전한 크기는 IPv4 또는 1472 바이트를 기준으로 1 패킷입니다.

참고-IPv6을 사용하는 경우 IPv6의 헤더 크기는 IPv4의 20 바이트 크기에 비해 40 바이트이므로 UDP 헤더의 경우 8 바이트를 허용해야합니다. 최대 크기는 1452 바이트입니다.


1
1472는 어떻게 계산합니까? 이더넷의 MTU는 1500입니다. 무슨 말입니까?
rogerdpack

4
@rogerdpack 저는 IPv4와 IPv6이 많은 인프라를 공유 할 가능성이 높고 IPv6이 상대적으로 인기를 얻고 있기 때문에 IPv6 제한 (1500)을 가정하는 것이 안전해야한다고 생각합니다. 그러나이 추론이 얼마나 유효한지는 알 수 없습니다.
Thomas

2
1500은 "체인"네트워크의 IPv6 호환 구성 요소에 의해 지원되어야합니다. IPv6을 사용하는 체인을 통해 이동할 수있는 IPv4를 사용하는 경우 (역순은 아니지만) IPv4의 헤더 크기는 20 바이트이므로 UDP의 헤더 크기는 8 바이트이며, 최대 안전 크기는 1500-20-8 = 1472입니다 (IPv6은 조각화를 허용하지 않기 때문에). 참고-사람들이 충분한 캡슐화 계층을 추가하면 DATA를위한 공간이 없을 수 있습니다. MAX를 요청했기 때문에 여러 계층의 캡슐화 오버 헤드가 사용되지 않는 것으로 가정합니다.
Astara

" 1500은 네트워크 체인의 IPv6 호환 구성 요소에 의해 지원되어야합니다. "아니오, 최소 IPv6 MTU는 1280입니다. 이더넷 MTU는 1500입니다.
Ron Maupin

@RonMaupin-원래 Q는 MTU가 아닌 가장 안전한 UDP 패킷 크기입니다. RFC2460을 참조하십시오. 1280 옥텟의 MTU를 언급 할뿐만 아니라 노드 다음과 같이 명시하고있다. 노드 재 조립시 최대 1500 옥텟의 조각난 패킷을 수용 할 수 있어야 한다. 1500보다 큰 패킷을 처리하는 것은 선택 사항입니다.
Astara

6

나는 여기에 좋은 답변을 읽었습니다. 그러나 약간의 실수가 있습니다. 일부는 UDP 헤더의 메시지 길이 필드가 최대 65535 (0xFFFF)라고 대답했습니다. 이것은 기술적으로 사실입니다. 일부는 실제 최대 값이 (65535-IPHL-UDPHL = 65507)이라고 대답했습니다. 실수는 UDP 헤더의 메시지 길이 필드에 모든 페이로드 (계층 5-7)와 UDP 헤더 길이 (8 바이트)가 포함된다는 것입니다. 이는 메시지 길이 필드가 200 바이트 (0x00C8) 인 경우 페이로드는 실제로 192 바이트 (0x00C0)입니다.

어렵고 빠른 것은 IP 데이터 그램의 최대 크기가 65535 바이트라는 것입니다. 이 숫자는 L3 및 L4 헤더와 레이어 5-7 페이로드의 합계에 도달합니다. IP 헤더 + UDP 헤더 + 레이어 5-7 = 65535 (최대).

UDP 데이터 그램에 UDP 헤더가 포함되어 있으므로 UDP 데이터 게임의 최대 크기에 대한 가장 정확한 답은 65515 바이트 (0xFFEB)입니다. UDP 페이로드에는 UDP 헤더가 포함되어 있지 않으므로 UDP 페이로드의 최대 크기에 대한 가장 정확한 대답은 65507 바이트입니다.


1
당신은 질문에 대답하지 않았습니다. 질문자는 패킷 조각화를 피하기 위해 사용할 수있는 가장 큰 크기를 알고 싶어했습니다.
Astara

0

나는 내가 화가 나거나이 질문을보고 답변에 관심이있는 사람들을 분명히하기 위해 화나게 반응을 일으킬 것을 두려워합니다.

https://tools.ietf.org/html/rfc1122에 대한 나의 이해 대한 의 상태는 "공식 사양"이며이 질문에 사용 된 용어에 대한 참조이며 다른 RFC로 대체되거나 정오표에 위배되지 않습니다. 수행원:

이론적으로, 즉. 작성된 사양에 따라 https://tools.ietf.org/html/rfc1122#section-4에서 제공 한 UDP 에는 "패킷 크기"가 없습니다. 따라서 대답은 "무한"

실제로,이 질문이 추구 할 가능성이 있고 (현재 작동중인 기술에 대해 업데이트 될 수있는), 이것은 다를 수 있으며 알 수 없습니다.

화나게해서 죄송합니다. https://tools.ietf.org/html/rfc1122#page-8 "Internet Protocol Suite"와 "Architectural Assumptions"는 내가 들었던 것을 바탕으로 내가했던 "가정"을 명확하게 밝히지 않습니다. 층 별도 . 즉. 레이어 UDP가있는 레이어 IP가있는 레이어 자체에 신경 쓸 필요는 없습니다. 그리고 IP 레이어에는 Reassembly, EMTU_R, Fragmentation 및 MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 ))


1
UDP 헤더의 데이터 그램 길이 필드는 16 비트이며 이론적으로 가장 큰 이론적 UDP 데이터 그램은 65,535이지만 UDP는 IP 패킷 내부에 캡슐화되어 있기 때문에 도달 할 수 없습니다. 이론적으로 전체 최대 길이는 65,535입니다. 이론상 최대 데이터 크기를 계산하려면 해당 크기에서 IP 및 UDP 헤더를 빼야합니다.
Ron Maupin

나는 오래 전에 이것을 물었지만 사양 / 이론에서 말하는 것이 아니라 실제적인 답변 (실제로 작동하는 것)을 찾고있었습니다. 나는 조각화없이 a에서 b까지 패킷을 얻고 싶었습니다. 실시간 게임 네트워킹 문제였습니다. 지금 똑똑한 사람들이 개발 한 많은 솔루션이 있다고 생각합니다. :)
KM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.