Qual è la dimensione massima del pacchetto per una connessione TCP o come posso ottenere la dimensione massima del pacchetto?
Qual è la dimensione massima del pacchetto per una connessione TCP o come posso ottenere la dimensione massima del pacchetto?
Risposte:
La limitazione assoluta sulla dimensione del pacchetto TCP è 64K (65535 byte), ma in pratica è molto più grande della dimensione di qualsiasi pacchetto che vedrai, perché gli strati inferiori (ad es. Ethernet) hanno dimensioni di pacchetto inferiori.
L'MTU (Maximum Transmission Unit) per Ethernet, ad esempio, è di 1500 byte. Alcuni tipi di reti (come Token Ring) hanno MTU più grandi e alcuni tipi hanno MTU più piccoli, ma i valori sono fissi per ogni tecnologia fisica.
Questa è un'eccellente domanda e mi ci imbatto molto al lavoro in realtà. Ci sono molte risposte "tecnicamente corrette" come 65k e 1500. Ho lavorato molto scrivendo interfacce di rete e usando 65k è stupido, e 1500 possono anche farti avere grossi problemi. Il mio lavoro si svolge su molti hardware / piattaforme / router diversi e, a dire il vero, il posto in cui inizio è di 1400 byte. Se hai BISOGNO di più di 1400 puoi iniziare a salire di livello, probabilmente puoi andare a 1450 e talvolta a 1480'ish? Se hai bisogno di più di quello, ovviamente devi dividere in 2 pacchetti, di cui ci sono diversi modi ovvi di fare ..
Il problema è che stai parlando di creare un pacchetto di dati e scriverlo via TCP, ma ovviamente ci sono dati di intestazione attaccati e così via, quindi hai un "bagaglio" che ti porta a 1500 o oltre .. e anche un molto hardware ha limiti inferiori.
Se lo "spingi" puoi ottenere alcune cose davvero strane. Dati troncati, ovviamente, o dati rilasciati che ho visto raramente. Anche i dati danneggiati raramente, ma certamente accadono.
send()
se è conveniente.
1480'ish
dovrebbe essere 1460
. L'intestazione IP e l'intestazione TCP occupano almeno 20 byte ciascuna (a meno che non vengano utilizzati campi di intestazione facoltativi) e quindi il massimo per Ethernet (non Jumbo frame) è 1500 - 20 -20 = 1460
.
A livello di applicazione, l'applicazione utilizza TCP come protocollo orientato al flusso. Il TCP a sua volta ha segmenti e estrae i dettagli dell'utilizzo di pacchetti IP inaffidabili.
TCP si occupa di segmenti anziché di pacchetti. Ogni segmento TCP ha un numero di sequenza contenuto in un'intestazione TCP. I dati effettivi inviati in un segmento TCP sono variabili.
C'è un valore per getockopt che è supportato su alcuni SO che puoi usare chiamato TCP_MAXSEG che recupera la dimensione massima del segmento TCP (MSS). Tuttavia, non è supportato su tutti i sistemi operativi.
Non sono sicuro di cosa stia cercando di fare, ma se si desidera ridurre le dimensioni del buffer utilizzato, è possibile esaminare anche: SO_SNDBUF e SO_RCVBUF.
Secondo http://en.wikipedia.org/wiki/Maximum_segment_size , la dimensione massima predefinita per un pacchetto IPV4 su una rete è 536 ottetti (byte di dimensione 8 bit). Vedi RFC 879
Non ci sono pacchetti nell'API TCP.
Ci sono pacchetti nei protocolli sottostanti spesso, come quando TCP è fatto su IP, a cui non ti interessa, perché non hanno nulla a che fare con l'utente, tranne per le ottimizzazioni delle prestazioni molto delicate che probabilmente non ti interessano (secondo la formulazione della domanda).
Se chiedi qual è il numero massimo di byte che puoi send()
in una chiamata API, questo dipende dall'implementazione e dalle impostazioni. Solitamente chiameresti send () per blocchi di un massimo di diversi kilobyte e sarai sempre pronto affinché il sistema rifiuti di accettarlo totalmente o parzialmente, nel qual caso dovrai gestire manualmente la suddivisione in blocchi più piccoli per inserire i tuoi dati nel API TCP send ().
In generale, questo dipenderà dall'interfaccia utilizzata dalla connessione. Probabilmente puoi usare un ioctl () per ottenere l'MTU, e se è ethernet, di solito puoi ottenere la dimensione massima del pacchetto sottraendo la dimensione dell'intestazione hardware da quella, che è 14 per ethernet senza VLAN.
Questo è solo il caso se l'MTU è almeno così grande in tutta la rete. TCP può utilizzare il rilevamento MTU percorso per ridurre il valore MTU effettivo.
La domanda è: perché te ne importa?
Sembra che la maggior parte dei siti Web su Internet utilizzi 1460 byte per il valore di MTU. A volte è il 1452 e se sei su una VPN scenderà ancora di più per le intestazioni IPSec.
Le dimensioni predefinite della finestra variano fino a un massimo di 65535 byte. Uso http://tcpcheck.com per esaminare i miei valori IP di origine e per verificare quali altri fornitori di Internet stanno utilizzando.
Una soluzione può essere quella di impostare l'opzione socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) su un valore "sicuro" con la rete sottostante (es. Impostato su 1400 per essere sicuro su Ethernet) e quindi utilizzare un buffer di grandi dimensioni nell'invio della chiamata di sistema. In questo modo ci possono essere meno chiamate di sistema che sono costose. Il kernel dividerà i dati in modo che corrispondano a MSS.
In questo modo è possibile evitare dati troncati e l'applicazione non deve preoccuparsi di piccoli buffer.
La dimensione del pacchetto per un'impostazione TCP nel protocollo IP (Ip4). Per questo campo (TL), sono allocati 16 bit, di conseguenza la dimensione massima del pacchetto è 65535 byte: dettagli del protocollo IP