Qual è la dimensione del pacchetto UDP sicuro più grande su Internet


201

Ho letto un numero di articoli sulle dimensioni dei pacchetti UDP ma non sono riuscito a giungere a una conclusione su cosa sia corretto.

Un numero di servizi limita il pacchetto UDP più grande a 512 byte (come dns)

Dato l' MTU minimo su Internet è 576 e la dimensione dell'intestazione IPv4 è 20 byte e l'intestazione UDP 8 byte. Ciò lascia 548 byte disponibili per i dati utente

Sarei in grado di usare pacchetti fino alla dimensione di 548 senza frammentazione dei pacchetti? O c'è qualcosa di cui i creatori di DNS erano a conoscenza, e per questo che lo hanno limitato a 512 byte.

Potrei anche andare oltre i 548 byte in modo sicuro?



10
È una domanda leggermente diversa. Sto chiedendo quale sia il pacchetto più grande che posso inviare su Internet (senza alcuna conoscenza delle altre reti o sondaggi) che non avrà frammentazione. Essenzialmente la massima dimensione di sicurezza, che funzionerà su tutto senza doversi preoccupare di sondare la connessione.
KM

2
Non è possibile eliminare la possibilità di frammentazione, ma ciò non rende le cose meno sicure. Se un frammento viene eliminato, è come se l'intero pacchetto venisse eliminato, il che accade comunque con UDP. Non sarebbe sicuro se un pacchetto superasse le dimensioni minime che i router dovevano supportare e quindi non sarebbe stato garantito che fossero consegnabili (rispetto alla consegna garantita). È qui che entra in gioco la cifra di 512 byte.
Beejor,

Risposte:


129

È vero che un'intestazione IPv4 tipica è di 20 byte e l'intestazione UDP è di 8 byte. Tuttavia, è possibile includere opzioni IP che possono aumentare le dimensioni dell'intestazione IP fino a 60 byte. Inoltre, a volte è necessario che nodi intermedi incapsulino datagrammi all'interno di un altro protocollo come IPsec (usato per VPN e simili) per instradare il pacchetto verso la sua destinazione. Quindi, se non conosci l' MTU sul tuo particolare percorso di rete, è meglio lasciare un margine ragionevole per altre informazioni di intestazione che potresti non aver previsto. Un payload UDP da 512 byte è generalmente considerato per farlo, anche se anche questo non lascia abbastanza spazio per un'intestazione IP di dimensioni massime.


36
Giusto per essere chiari: avere dimensioni ridotte per evitare la frammentazione non rende la consegna del pacchetto "sicura", ci sono ancora infinite possibilità che rendono la consegna inaffidabile come il cane ha mangiato il mio cavo di rete. Detto ciò; avere meno frammenti rende la consegna "più sicura" perché se ce ne fossero più di una e una di quelle non ce la facesse mai - l'intero pacchetto (datagramma) viene eliminato da UDP.
markmnl,

3
Ai fini di una domanda si potrebbe presumere di usare la definizione di poster "sicuro", non una definizione in alcuni libri sugli standard che non hanno mai visto.
Astara,

È noto che i router del mondo reale rilasciano i pacchetti UDP invece di frammentarli?
user253751

60

Il limite teorico (su Windows) per la dimensione massima di un pacchetto UDP è 65507 byte. Questo è documentato qui :

La dimensione massima corretta del messaggio UDP è 65507, come determinato dalla seguente formula: 0xffff - (sizeof (intestazione IP) + sizeof (intestazione UDP)) = 65535- (20 + 8) = 65507

Detto questo, la maggior parte dei protocolli si limita a una dimensione molto più piccola - di solito 512 o occasionalmente 8192. Spesso puoi andare oltre 548 in sicurezza se sei su una rete affidabile - ma se stai trasmettendo su Internet in generale, più grande è vai, più è probabile che ti imbatterai in problemi di trasmissione di pacchetti e perdita.


39
Un collegamento Microsoft non è un riferimento normativo. Le RFC sono il riferimento normativo; e ciò che hai citato si applica solo a IPv4.
Marchese di Lorne,

2
Solo perché MS lo consente non significa che sia sempre una buona idea, dal momento che router intermedi, ecc. Potrebbero essere costretti a frammentare pacchetti di dimensioni maggiori (come hai detto tu).
rogerdpack,

1
@EJP Non lo spiegano chiaramente sul collegamento Microsoft, ma sembra essere una conseguenza necessaria di IPv4: il campo di lunghezza totale IPv4 è di 16 bit e tale valore deve includere la lunghezza dell'intestazione IP e la lunghezza del Intestazione UDP.
jtpereyda,

@jtpereyda Sono pienamente consapevole di tutto ciò. Il mio punto è esattamente quello che ho già affermato: dovresti citare riferimenti normativi laddove esistono.
Marchese di Lorne,

Non credo che la dimensione massima del pacchetto UDP sia mai di 65.507 byte, dato che la mia scheda wifi (IEEE 802.3) può fare solo 1500 MTU e frame jumbo sono solo 9k byte.
Christian Stewart,

52

Il carico utile UDP massimo sicuro è 508 byte. Questa è una dimensione del pacchetto di 576, meno l'intestazione IP massima a 60 byte e l'intestazione UDP a 8 byte. Qualsiasi payload UDP di queste dimensioni o inferiore è garantito per essere consegnato su IP (anche se non è garantito che sia consegnato). Qualunque cosa più grande può essere lasciata cadere da qualsiasi router per qualsiasi motivo. Tranne che su una route solo IPv6, in cui il carico utile massimo è 1.212 byte. Come altri hanno già detto, in alcune circostanze potrebbero essere aggiunte intestazioni di protocollo aggiuntive. È preferibile invece un valore più conservativo di circa 300-400 byte.

Qualsiasi pacchetto UDP può essere frammentato.Ma questo non è troppo importante, perché la perdita di un frammento ha lo stesso effetto della perdita di un pacchetto non frammentato: l'intero pacchetto viene eliminato. Con UDP, questo accadrà in entrambi i modi.

È interessante notare che la dimensione massima teorica del pacchetto è di circa 30 MB (1.500 Ethernet MTU - 60 intestazione IP x 65.536 numero massimo di frammenti), sebbene la probabilità che passi attraverso sarebbe infinitesimale.

Fonti: RFC 791, RFC 2460


2
Qualsiasi pacchetto UDP, per impostazione predefinita, è considerato "_U_nreliable". L'unica dimensione sicura del pacchetto UDP che potresti aspettarti di ricevere sarebbe 1, pacchetto non frammentato. Se si desidera pacchetti "sicuri", utilizzare un protocollo di pacchetto su TCP.
Astara,

26
@Astara Vero, per sua natura UDP non è affidabile. Ma la domanda è se un pacchetto di una determinata dimensione è garantito per essere consegnabile, non garantito per essere consegnato. I pacchetti di una determinata dimensione possono essere (e vengono) rilasciati da qualsiasi router per qualsiasi motivo, mentre quelli più piccoli devono essere gestiti al meglio da tutti i router, secondo gli standard del settore. Quindi "sicuro" in questo caso significa "la mia auto si incastrerà sotto il ponte" e non "la mia auto rimarrà bloccata nel traffico".
Beejor,

1
Consiglio di smettere di ripetere ciò che ha detto un ragazzo a caso e di controllare i fatti, perché UDP è in realtà abbastanza affidabile. A proposito ho pacchetti sicuri sopra UDP senza il sovraccarico inutile di TCP. openmymind.net/How-Unreliable-Is-UDP
Pablo Ariel

5
UDP non è "inaffidabile" a causa della quantità di pacchetti eliminati, ma perché i pacchetti possono essere (e sono) eliminati. Non puoi "fare affidamento" su nessun pacchetto specifico di arrivo, ordine o conferma. I dati sono fragili, ed è come dire che l'autosterzo che funziona il 99% delle volte e l'89% nella giusta direzione è affidabile. Non che UDP non sia eccezionale per molte cose, solo che richiede fondamentalmente di scrivere la propria versione di "TCP" sopra di essa. Ecco un affascinante caso reale nel mondo degli sviluppatori di giochi (anche se un po 'obsoleto): gamasutra.com/view/feature/131781
Beejor

@Beejor Eri sulla strada giusta, ma "richiede fondamentalmente di scrivere la tua versione di" TCP "sopra di essa" è palesemente sbagliato. UDP è ottimo per la trasmissione e ottimo per l'invio rapido di dati "non critici". (Per quanto riguarda i giochi) puoi scoprire server / servizi (LAN) usando UDP e usare UDP per inviare rapidamente le posizioni dei giocatori. Se un pacchetto viene eliminato; non ti interessa perché il pacchetto successivo avrà una posizione più aggiornata degli altri giocatori. TCP può avere pacchetti "fuori servizio", ha un overhead e non fa connessioni da uno a molti. In alcuni casi l'UDP potrebbe essere più applicabile.
Paul,

46

576 è la dimensione massima minima del buffer di riassemblaggio , ovvero ogni implementazione deve essere in grado di riassemblare pacchetti di almeno quella dimensione. Vedere IETF RFC 1122 per i dettagli.


2
Se e solo se si dispone di una rete che non supporta IPv6. Se supporta IPv6, utilizzare la dimensione massima del pacchetto di intestazioni IPv6, quindi sottrarre le intestazioni di incapsulamento per eseguire IPv4 su IPv6. ;-)
Astara,

@Astara In IPv6, la frammentazione viene eseguita dal mittente, quindi non ci sono problemi con i router intermedi non conformi non sicuri. E se il destinatario non ha una dimensione integrata limitata dalla memoria, probabilmente può riassemblare pacchetti fino a 64 KB almeno.
user253751

@ user253751 Non sono solo i router non conformi che possono frammentarsi. C'è Path MTU Discovery, ma anche questo non è abbastanza per eliminare completamente la frammentazione.
dstromberg,

@dstromberg In quali situazioni i router IPv6 possono frammentare i datagrammi?
user253751

@ user253751 Non ho ancora molto IPv6, ma ecco un esempio: immagina una rete IPv6 che invia jumbogrammi (> 65536 byte) a un'altra rete IPv6 che supporta anche jumbogrammi. Supponiamo inoltre che Path MTU Discovery affermi che tali jumbogrammi dovrebbero essere supportati senza frammentazione. Ma poi un router viene spento e riacceso e parte del percorso di rete viene sostituita con apparecchiature non configurate per i jumbogrammi.
dstromberg

14

Questo articolo descrive la massima unità di trasmissione (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . Indica che gli host IP devono essere in grado di elaborare 576 byte per un pacchetto IP. Tuttavia, rileva che il minimo è 68. RFC 791: "Ogni modulo Internet deve essere in grado di inoltrare un datagramma di 68 ottetti senza ulteriore frammentazione. Questo perché un'intestazione Internet può contenere fino a 60 ottetti e il frammento minimo è 8 ottetti ".

Pertanto, la dimensione del pacchetto sicuro di 508 = 576 - 60 (intestazione IP) - 8 (intestazione udp) è ragionevole.

Come indicato dall'utente 607811, la frammentazione da parte di altri livelli di rete deve essere riassemblata. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Riassemblaggio Il livello IP DEVE implementare il riassemblaggio di datagrammi IP. Indichiamo la dimensione del datagramma più grande che può essere riassemblata da EMTU_R ("MTU efficace da ricevere"); questo è talvolta chiamato "dimensione del buffer di rimontaggio". EMTU_R DEVE essere maggiore o uguale a 576


11

La dimensione minima del buffer di riassemblaggio di IPv4 è 576, IPv6 lo ha a 1500. Sottrai le dimensioni dell'intestazione da qui. Vedi la programmazione di rete UNIX di W. Richard Stevens :)


1
Minimo, ovviamente. Grazie per averlo individuato. Non ho idea di come nessuno abbia notato l'errore nel corso degli anni.
Nikolai Fetissov,

1
Sebbene IPv6 possa avere un buffer di riassemblaggio minimo di 1500, i pacchetti IPv6 non possono essere frammentati e la MTU IPv6 minima è 1280. Un dispositivo terminale non dovrebbe mai aver bisogno di riassemblare un pacchetto IPv6 frammentato.
Ron Maupin,

1
I pacchetti @RonMaupin IPv6 possono essere frammentati dagli endpoint. Solo non dai router in mezzo.
Navin,

3
@Navin, no, i pacchetti IPv6 non saranno frammentati, i dati devono essere frammentati prima di essere impacchettati in pacchetti IPv6, ma i pacchetti stessi non sono frammentati. C'è una differenza. A differenza delle intestazioni dei pacchetti IPv4 che hanno campi per gestire la frammentazione, le intestazioni dei pacchetti IPv6 non hanno nulla a che fare con la frammentazione. L'intestazione del pacchetto IPv6 è molto più semplice dell'intestazione del pacchetto IPv4.
Ron Maupin,

6

512 è la soluzione migliore. È usato altrove ed è un bel numero pari (metà del 1024).


6

Dato che IPV6 ha una dimensione di 1500, direi che i gestori non fornirebbero percorsi separati per IPV4 e IPV6 (sono entrambi IP con tipi diversi), costringendoli ad apparecchiature per ipv4 che sarebbero vecchie, ridondanti, più costose da mantenere e meno affidabile. Non avrebbe alcun senso. Inoltre, farlo potrebbe essere facilmente considerato come fornire un trattamento preferenziale per un po 'di traffico - un no no secondo le regole di cui probabilmente non gliene frega molto (a meno che non vengano catturati).

Quindi 1472 dovrebbe essere sicuro per l'uso esterno (anche se ciò non significa che un'app come DNS che non conosce EDNS lo accetterà), e se stai parlando di reti interne, è più probabile che tu conosca il layout della tua rete nel qual caso le dimensioni dei pacchetti jumbo valgono per i pacchetti non frammentati, quindi per 4096 - 4068 byte e per le schede di Intel con buffer di 9014 byte, una dimensione del pacchetto di ... aspetta ... 8086 byte, sarebbe la massima ... coincidenza? risatina

****AGGIORNARE****

Varie risposte forniscono i valori massimi consentiti da 1 fornitore SW o varie risposte ipotizzando l'incapsulamento. L'utente non ha richiesto il valore più basso possibile (come "0" per una dimensione UDP sicura), ma la dimensione più grande del pacchetto sicuro.

I valori di incapsulamento per vari livelli possono essere inclusi più volte. Da quando una volta hai incapsulato un flusso, non c'è nulla di proibitivo, per esempio, un livello VPN al di sotto di quello e una duplicazione completa dei livelli di incapsulamento al di sopra di quello.

Poiché la domanda riguardava i valori di sicurezza massimi, suppongo che stiano parlando del valore di sicurezza massimo per un pacchetto UDP che può essere ricevuto. Poiché non è garantito alcun pacchetto UDP, se si riceve un pacchetto UDP, la dimensione di sicurezza più grande sarebbe 1 pacchetto su IPv4 o 1472 byte.

Nota: se si utilizza IPv6, la dimensione massima sarebbe di 1452 byte, poiché la dimensione dell'intestazione di IPv6 è di 40 byte rispetto alla dimensione di 20 byte di IPv4 (e in entrambi i casi, è comunque necessario consentire 8 byte per l'intestazione UDP).


1
come stai calcolando 1472? Ethernet ha un MTU di 1500, è questo a cui ti riferisci?
rogerdpack,

4
@rogerdpack Penso che significhi che poiché IPv4 e IPv6 condividono probabilmente molta infrastruttura e che IPv6 sta diventando relativamente popolare, dovrebbe essere sicuro assumere limiti IPv6 (quindi il 1500). Quanto sia valido questo ragionamento, tuttavia, non posso dirlo.
Thomas,

2
1500 deve essere supportato da componenti compatibili con IPv6 nella "catena" di rete - se si utilizza IPv4, che può viaggiare su una catena che supporta IPv6 (anche se non è vero il contrario), quindi poiché la dimensione dell'intestazione di IPv4 è di 20 byte, e La dimensione dell'intestazione di UDP è di 8 byte, che lascerebbe un 1500-20-8 = 1472 come dimensione massima di sicurezza (poiché IPv6 non consente la frammentazione). Nota: se le persone aggiungono abbastanza strati di incapsulamento, si potrebbe presumibilmente non avere spazio per i DATI. Poiché hai chiesto il MAX, si supporrà che NON vengano utilizzati più livelli di sovraccarico di incapsulamento.
Astara,

" 1500 devono essere supportati da componenti compatibili con IPv6 nella catena di rete. " No, l'MTU IPv6 minimo è 1280. L'MTU Ethernet è 1500.
Ron Maupin

@RonMaupin - Q originale era la dimensione del pacchetto UDP più grande, non l'MTU. Vedi RFC2460. Oltre a menzionare un MTU di 1280 ottetti, afferma: I nodi devono essere in grado di accettare un pacchetto frammentato, che quando riassemblato arriva fino a 1500 ottetti. La gestione di pacchetti di dimensioni superiori a 1500 è facoltativa.
Astara,

6

Ho letto alcune buone risposte qui; tuttavia, ci sono alcuni errori minori. Alcuni hanno risposto che il campo Lunghezza messaggio nell'intestazione UDP è un massimo di 65535 (0xFFFF); questo è tecnicamente vero. Alcuni hanno risposto che il massimo effettivo è (65535 - IPHL - UDPHL = 65507). L'errore è che il campo Lunghezza messaggio nell'intestazione UDP include tutto il payload (livelli 5-7), più la lunghezza dell'intestazione UDP (8 byte). Ciò significa che se il campo della lunghezza del messaggio è 200 byte (0x00C8), il payload è in realtà 192 byte (0x00C0).

Ciò che è difficile e veloce è che la dimensione massima di un datagramma IP è 65535 byte. Questo numero è arrivato alla somma totale delle intestazioni L3 e L4, più il payload Layer 5-7. Intestazione IP + Intestazione UDP + Livelli 5-7 = 65535 (max).

La risposta più corretta per qual è la dimensione massima di un datagam UDP è 65515 byte (0xFFEB), poiché un datagramma UDP include l'intestazione UDP. La risposta più corretta per qual è la dimensione massima di un payload UDP è 65507 byte, poiché un payload UDP non include l'intestazione UDP.


1
Non hai risposto alla domanda. L'interrogante voleva sapere qual era la dimensione più grande che potevano usare per evitare la frammentazione dei pacchetti.
Astara,

0

Temo di incorrere in reazioni turbate ma, tuttavia, di chiarirmi se sbaglio o se vedo questa domanda e sono interessato a una risposta:

la mia comprensione di https://tools.ietf.org/html/rfc1122 il cui stato è "una specifica ufficiale" e come tale è il riferimento per la terminologia utilizzata in questa domanda e che non è sostituita da un'altra RFC né ha errata contraddizione con a seguire:

teoricamente, cioè. sulla base delle specifiche scritte, UDP come indicato da https://tools.ietf.org/html/rfc1122#section-4 non ha "dimensioni del pacchetto". Quindi la risposta potrebbe essere "indefinita"

In pratica, che cosa è probabile che queste domande abbiano cercato (e che potrebbero essere aggiornate per l'attuale tecnologia in azione), questo potrebbe essere diverso e non lo so.

Mi scuso se ho causato turbamento. https://tools.ietf.org/html/rfc1122#page-8 "Internet Protocol Suite" e "Architectural Presupptions" non mi chiariscono il "presupposto" su cui mi trovavo, in base a ciò che ho sentito, che gli strati sono separati . Vale a dire. il livello UDP in non deve occuparsi del livello IP in (e il livello IP ha cose come Riassemblaggio, EMTU_R, Fragmentazione e MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 ))


1
L'intestazione UDP ha un campo lunghezza datagramma di 16 bit, il che significa che il datagramma UDP teorico più grande è 65.535, ma che non può mai essere raggiunto perché UDP è incapsulato all'interno di un pacchetto IP, che ha una lunghezza massima teorica complessiva di 65.535 stesso) ma è necessario sottrarre le intestazioni IP e UDP da quella dimensione per calcolare la dimensione massima teorica dei dati.
Ron Maupin,

L'ho chiesto molto tempo fa, ma era alla ricerca di una risposta pragmatica (ciò che funziona nella vita reale) piuttosto che ciò che dice nelle specifiche / o in teoria. Volevo ottenere i pacchetti dalla a alla b senza frammentazione, era per un problema di rete dei giochi in tempo reale - penso che ora ci siano molte soluzioni sviluppate da persone più intelligenti :)
KM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.