Qual é o tamanho máximo de pacote para uma conexão TCP ou como posso obter o tamanho máximo de pacote?
Qual é o tamanho máximo de pacote para uma conexão TCP ou como posso obter o tamanho máximo de pacote?
Respostas:
A limitação absoluta no tamanho do pacote TCP é de 64K (65535 bytes), mas, na praticidade, é muito maior que o tamanho de qualquer pacote que você verá, porque as camadas inferiores (por exemplo, ethernet) têm tamanhos de pacote mais baixos.
A MTU (unidade máxima de transmissão) para Ethernet, por exemplo, é de 1500 bytes. Alguns tipos de redes (como o Token Ring) têm MTUs maiores e alguns tipos têm MTUs menores, mas os valores são fixos para cada tecnologia física.
Essa é uma excelente pergunta e eu me deparo com isso muito no trabalho, na verdade. Existem muitas respostas "tecnicamente corretas", como 65k e 1500. Eu trabalhei muito escrevendo interfaces de rede e o uso de 65k é bobo, e 1500 também pode causar grandes problemas. Meu trabalho é desenvolvido em diferentes hardwares / plataformas / roteadores e, para ser sincero, o local onde começo é de 1400 bytes. Se você PRECISA de mais de 1400, pode começar a subir rapidamente, provavelmente poderá ir para 1450 e, às vezes, para 1480'ish? Se você precisar de mais do que isso, é claro que precisará dividir em 2 pacotes, dos quais existem várias maneiras óbvias de fazer.
O problema é que você está falando sobre criar um pacote de dados e gravá-lo via TCP, mas é claro que existem dados de cabeçalho anexados e assim por diante, para que você tenha uma "bagagem" que o leva a 1500 ou mais além. muito hardware tem limites mais baixos.
Se você insistir, poderá obter coisas realmente estranhas. Dados truncados, obviamente, ou dados que eu raramente vi. Dados corrompidos também raramente, mas certamente acontecem.
send()
se for conveniente.
1480'ish
deveria ser 1460
. O cabeçalho IP e o TCP ocupam pelo menos 20 bytes cada (a menos que campos de cabeçalho opcionais sejam usados) e, portanto, o máximo para Ethernet (sem quadro Jumbo) é 1500 - 20 -20 = 1460
.
No nível do aplicativo, o aplicativo usa o TCP como um protocolo orientado a fluxo. O TCP, por sua vez, possui segmentos e abstrai os detalhes do trabalho com pacotes IP não confiáveis.
O TCP lida com segmentos em vez de pacotes. Cada segmento TCP possui um número de sequência que está contido dentro de um cabeçalho TCP. Os dados reais enviados em um segmento TCP são variáveis.
Há um valor para getsockopt suportado em alguns sistemas operacionais que você pode usar chamado TCP_MAXSEG, que recupera o tamanho máximo do segmento TCP (MSS). Não é suportado em todos os sistemas operacionais.
Não sei exatamente o que você está tentando fazer, mas se você deseja reduzir o tamanho do buffer usado, também pode procurar: SO_SNDBUF e SO_RCVBUF.
De acordo com http://en.wikipedia.org/wiki/Maximum_segment_size , o tamanho maior padrão para um pacote IPV4 em uma rede é de 536 octetos (bytes de tamanho 8 bits). Veja RFC 879
Não há pacotes na API TCP.
Geralmente, existem pacotes nos protocolos subjacentes, como quando o TCP é feito sobre IP, no qual você não tem interesse, porque eles não têm nada a ver com o usuário, exceto pelas otimizações de desempenho muito delicadas nas quais você provavelmente não está interessado (de acordo com o formulação da questão).
Se você perguntar qual é o número máximo de bytes que você pode send()
em uma chamada de API, isso depende da implementação e das configurações. Você normalmente chama send () para pedaços de até vários kilobytes e está sempre pronto para o sistema se recusar a aceitá-lo total ou parcialmente. Nesse caso, você precisará gerenciar manualmente a divisão em pedaços menores para alimentar seus dados no API send () TCP.
Geralmente, isso depende da interface que a conexão está usando. Provavelmente, você pode usar um ioctl () para obter a MTU e, se for Ethernet, geralmente poderá obter o tamanho máximo de pacote subtraindo o tamanho do cabeçalho do hardware, que é 14 para Ethernet sem VLAN.
Este é apenas o caso se a MTU for pelo menos tão grande na rede. O TCP pode usar o caminho MTU discovery para reduzir seu MTU efetivo.
A questão é: por que você se importa?
Parece que a maioria dos sites na Internet usa 1460 bytes para o valor de MTU. Às vezes, é 1452 e, se você estiver em uma VPN, ele diminuirá ainda mais os cabeçalhos IPSec.
O tamanho da janela padrão varia um pouco até um máximo de 65535 bytes. Eu uso http://tcpcheck.com para verificar meus próprios valores de IP de origem e verificar o que outros fornecedores de Internet estão usando.
Uma solução pode ser definir a opção de soquete TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) para um valor "seguro" com a rede subjacente (por exemplo, definir 1400 para ser seguro na ethernet) e depois use um buffer grande na chamada do sistema de envio. Dessa forma, pode haver menos chamadas do sistema que são caras. O kernel dividirá os dados para corresponder ao MSS.
Dessa forma, você pode evitar dados truncados e seu aplicativo não precisa se preocupar com buffers pequenos.
O tamanho do pacote para uma configuração TCP no protocolo IP (Ip4). Para este campo (TL), 16 bits são alocados, portanto o tamanho máximo do pacote é 65535 bytes: detalhes do protocolo IP