Posso confiar em um segmento TCP com uma carga útil de 255 bytes será entregue em um único quadro Ethernet?

2

Estou escrevendo algum software de servidor que atualiza o firmware em um dispositivo eletrônico. É uma tarefa complicada, porque atualmente esses dispositivos não têm memória suficiente para manter um firmware completo antes de instalá-lo. Como resultado, meu servidor irá alternar o dispositivo para o modo carregador de inicialização e instruirá o carregador de inicialização sobre o que fazer, enviando instruções e dados de firmware pela rede. Como você pode imaginar, existem algumas desvantagens potencialmente grandes para isso.

O que me preocupa no momento é se um único segmento TCP que eu envio será ou não dividido em vários quadros Ethernet?

Devido à natureza do carregador de boot, a carga útil máxima que posso enviar em um segmento TCP é de 255 bytes.

De pegar pacotes no Wireshark, parece que o tamanho do frame para um frame contendo um dos meus segmentos TCP é de 309 bytes (2,472 bits), bem dentro do intervalo permitido de acordo com a página da Wikipedia em Ethernet Frames :

Atualmente,estoutentandolidarcomoqueaconteceseaconexãocomodispositivoforinterrompida.Comoascoisasestãoagora,nãotenhoproblemaspararestabelecerumaconexãocomumdispositivo,masoquequerotercertezaéoqueacontecedepoisqueumaconexãoérestabelecida.

SeeupudertercertezadequecadainstruçãoestarásemprecontidaemumúnicoquadroEthernete,comotal,seráentregueounãoseráentregueemdiasfelizes!Eupossoolharparaaúltimainstruçãoenviadaedescobriroquefazerentão.

Noentanto,sehouverapossibilidadedeainstruçãoserdivididaemdoisquadrosEthernet,tenhoumproblemamuitomaior.Eunãoachoqueissodeveriaacontecer,masàsvezesparecequeacontecequandoestoutestando.

Digamosqueeutenhaemitidoumcomandodegravação,eocarregadordebootestejaesperandoqueosdadossejamgravados,enviomeusegmentoTCPcom255byteseeleédivididoemdoisquadrosEthernet.Oprimeiroquadroéentregue,masosegundonão.Agora,quandoreconectar,precisodescobrirexatamentequantosbytesocarregadordeinicializaçãojárecebeu,oquesignificaqueprecisoenviardadosfictícioseouvirumaresposta.Eurealmentegostariadeevitarisso,sepossível.

Lendooscomentáriosem este tópico , parece que os pacotes IP menores que 576 bytes (4.608 bits) não serão divididos. Estou seguro em assumir que esse é sempre o caso?

Na verdade, se estiver dividido, o módulo WiFi não deve entregar o segmento TCP até que ele seja montado novamente, não está correto? E será descartado se a conexão for perdida.

    
por bot_bot 03.03.2016 / 15:22

1 resposta

1

Em geral, é muito difícil controlar se um pacote é dividido ou não. Você precisaria se aprofundar na pilha, na verdade - coisas como descarregar TCP em hardware também podem atrapalhar e criar pacotes otimizados para transporte.

Mas você está falando de uma conexão TCP - portanto, não haverá nenhum problema se a sua conexão tiver uma pequena interrupção. Se um único pacote TCP for dividido em vários pacotes Ethernet e sua conexão cair (por um breve momento) entre a transmissão de um único quadro, o TCP tentará transmitir o pacote (que é parte do protocolo).

Tendo uma desconexão mais longa / detectada, um problema muito maior será o fato de que você não pode continuar enviando sem restabelecer uma nova conexão (o que precisaria do seu dispositivo para suportar isso) - configurando um novo soquete e enviando para o mesmo host remoto sem TCP syn / ack é propably não suportado por qualquer pilha padrão.

Em relação ao seu objetivo desejado (se possível), eu recomendaria ter uma maneira apropriada de lidar com as interrupções durante a atualização do firmware (como dual boot).

Se isso não for possível e você não estiver implementando sua própria pilha TCP / IP, apenas recomendo desabilitar qualquer aceleção de hardware em seu servidor (para evitar que o hardware remonte seus pacotes) e desabilite alogoritmo do nagle na sua conexão de soquete.

    
por 03.03.2016 / 23:05

Tags