Tamanho mínimo de TCP / IP

0

Estou usando um idioma de alto nível em um PC para enviar uma mensagem via TCP / IP para um dispositivo remoto que é um dispositivo incorporado.
Estou enviando mensagens relativamente pequenas (<255 bytes).
Devo assumir que haverá vários firewalls, proxies e gateway entre o meu PC e o dispositivo de destino.
Também devo assumir que a mensagem pode ser transmitida por rádio (GPRS, UMTS) antes de chegar ao dispositivo de destino.

Supondo que os buffers de hardware e software do dispositivo de destino sejam grandes o suficiente (1000 bytes), qual deve ser a mensagem pequena para que eu tenha certeza de que sempre será recebida em uma única peça no nível de aplicativo do dispositivo de destino?

Em outras palavras, devo incluir o tamanho da mensagem no meu protocolo de aplicativo ou é inútil, pois a mensagem é pequena?

FKDev
fonte

Respostas:

1

Conforme indicado na resposta da akira, o tamanho mínimo de mensagem que um host deve aceitar para IPv4 é 576 bytes; portanto, pacotes de 255 bytes não devem ser fragmentados.

No entanto, a maioria dos hosts atualmente implementa o algoritmo Nagle , que espera 200ms antes de enviar pacotes para tentar agrupar mensagens. Isso significa que, se você enviar mensagens rapidamente, elas poderão ser agrupadas e fragmentadas. O TCP não se destina a datagramas, mas a fluxos. Caixas na rede também podem estar fazendo algumas coisas estranhas (você nunca sabe).

Sugiro que você inclua o tamanho da mensagem no seu protocolo de aplicação. Isso garante que você não terá problemas com o TCP fragmentando suas mensagens de uma maneira que você não esperava, e, como afirmado na resposta da akira, permite que um dia você transfira por outra mídia.

user2313067
fonte
Sim. mas mesmo com o nagle (que está apenas "cuidando do transporte"), um pacote TCP / IP chega como um pacote TCP / IP na outra extremidade (ou não), não importa o que aconteça no caminho. esse é o ponto. (apenas para enfatizar, nenhuma crítica à sua / minha resposta :))
akira
1

Você está tentando ajustar o tamanho do pacote TCP / IP para a chamada MTU (unidade máxima de transmissão). Você pode fazer isso. Ou você pode ignorá-lo e, como você está usando o TCP / IP, basta enviar o pacote: ele viajará pela rede, cortado em pedaços e colado automaticamente mais tarde e, em seguida, o pacote chegará.

Se sua mensagem for muito pequena e estiver abaixo do "tamanho mínimo do datagrama", esta citação o deixará feliz:

A MTU não deve ser confundida com o tamanho mínimo de datagrama que todos os hosts devem estar preparados para aceitar, que possui um valor de 576 bytes para IPv4 [2] e de 1280 bytes para IPv6

Portanto, se sua mensagem for menor que 556 bytes (576 bytes - cabeçalho ipv4 de 20 bytes), ela deverá chegar como um pacote.

Mas mesmo com a fragmentação: o receptor obtém um pacote completo somente se todos os fragmentos (possíveis) chegaram. O que torna um pouco inútil "se importar" com o tamanho da mensagem para evitar a fragmentação.

Além do tamanho da transferência, pode ser uma boa ideia incluir o tamanho da mensagem ao longo da mensagem (talvez você queira transferir a mensagem por diferentes mídias também um dia)

akira
fonte