2010-09-14 12 views
12

Sto cercando di capire un comportamento che sto vedendo nel contesto dell'invio di pacchetti UDP.Frammentazione IP UDP e MTU

Ho due piccoli programmi Java: uno che trasmette pacchetti UDP e l'altro che li riceve. Li sto eseguendo localmente sulla mia rete tra due computer collegati tramite un singolo switch.

L'impostazione MTU (riportata da/sbin/ifconfig) è 1500 su entrambi gli adattatori di rete.

  • Se invio pacchetti con una dimensione < 1500, li ricevo. Previsto.
  • Se invio pacchetti con 1500 < dimensioni < 24258 li ricevo. Previsto. Ho confermato via wireshark che il livello IP li sta frammentando.
  • Se invio pacchetti con dimensione> 24258, vengono persi. Non previsto. Quando eseguo wireshark sul lato ricevente, non vedo nessuno di questi pacchetti.

Sono stato in grado di vedere un comportamento simile con ping -s.

ping -s 24258 hostA opere, ma

ping -s 24259 hostA fallisce.

Qualcuno capisce cosa può accadere o ha idee su cosa dovrei cercare?

Entrambi i computer eseguono CentOS 5 a 64 bit. Sto usando un JDK 1.6, ma non penso che sia un problema di programmazione, è un problema di rete o forse del sistema operativo.

+0

Potrebbe essere meglio chiedere questo su serverfault.com. –

+3

Cosa mostra wireshark sul lato di invio della connessione per i pacchetti con 'size> 24258'? –

+1

@Kaleb Non sono un esperto di wirehark, ma l'acquisizione sul lato di invio sembra la stessa sia che la dimensione del pacchetto sia> o <24258. Vedo pacchetti IP frammentati, ma vedo solo i pacchetti UDP per piccoli pacchetti (ho un mix di pacchetti molto piccoli e molto grandi). I dati che sto inviando sono binari, quindi è difficile capire quale pacchetto IP appartiene al pacchetto UDP. Potrei provare a fare un test più semplice con dati più prevedibili e vedere cosa mostra wireshark. Potrei non arrivare a quello fino a domani però. @ire_and_curses, grazie non ero sicuro di quale serverfault racchiudesse esattamente. Potrei provare lì. – wolfcastle

risposta

10

Non è necessario che le implementazioni del protocollo IP siano in grado di gestire pacchetti di dimensioni arbitrarie. In teoria, la dimensione massima possibile del pacchetto IP è 65.535 ottetti, ma lo standard richiede solo che le implementazioni supportino almeno 576 ottetti.

Sembrerebbe che l'implementazione del tuo host supporti una dimensione massima molto maggiore di 576, ma ancora significativamente più piccola della dimensione massima teorica di 65.535. (Non penso che l'interruttore debba essere un problema, perché non dovrebbe essere necessario eseguire alcuna deframmentazione - non funziona nemmeno a livello IP).

Lo standard IP consiglia inoltre che gli host non inviino pacchetti superiori a 576 byte, a meno che non siano certi che l'host ricevente possa gestire le dimensioni del pacchetto più grandi. Dovresti forse considerare se sarebbe meglio che il tuo programma invii una dimensione di pacchetto più piccola. 24.529 mi sembrano terribilmente grandi. Penso che ci possa essere una possibilità che molti host non gestiscano pacchetti così grandi.

Si noti che questi limiti di dimensione del pacchetto sono completamente separati da MTU (la dimensione massima del frame supportata dal protocollo del livello di collegamento dati).

+1

Non ero a conoscenza del fatto che le implementazioni potessero avere una dimensione di pacchetto massima inferiore. Sai come determinare cos'è questo valore? Sono d'accordo 24k è una dimensione molto grande, e probabilmente non invierò quel gran numero di pacchetti nel sistema distribuito, l'ho appena incontrato durante i test. Ho il pieno controllo della rete nel sistema distribuito (tutti i computer/switch/router). Stiamo usando Gigabit Ethernet, quindi se utilizziamo anche jumbo frame, I * dovrebbe * essere in grado di utilizzare una dimensione del pacchetto di 9000 (intestazioni UDP + payload) senza frammentazione del livello IP. – wolfcastle

5

ho trovato il seguente, che ti potrebbero interessare:

  • Determine the maximum size of a UDP datagram packet on Linux
  • Impostare il bit DF nell'intestazione IP e inviare pacchetti continuamente più grandi per determinare a che punto un pacchetto è frammentato come da Path MTU Discovery. La frammentazione dei pacchetti dovrebbe quindi generare un pacchetto di tipo ICMP 3 con code 4 che indica che il pacchetto era troppo grande per essere inviato senza essere frammentato.

La risposta di Dan è utile ma si noti che dopo le intestazioni si è veramente limitati a 65507 byte.

Problemi correlati