Problema de pacote TCP

Desembalar e agrupar

O protocolo TCP pode dividir os dados a serem transmitidos em vários pacotes de dados e enviá-los ao host remoto com a premissa de garantir a ordem de transmissão dos pacotes de dados e reuni-los de volta ao original.

Exemplos são os seguintes:

 

 Quando o pacote 1.0.0 é muito grande, você verá que a transmissão do pacote de dados 2.0.0 está atrasada.Se a transmissão do pacote de dados 1.0.0 falhar, toda a solicitação será enviada.

Para evitar a situação acima, dividiremos os pacotes 1.0.0 em pacotes menores e os colocaremos na fila de envio, montando e restaurando esses pacotes quando forem recebidos. O efeito é o seguinte.

 

 Como mostrado na figura, dividimos o 1.0.0 original em 1.1.0 + 1.2.0 + 1.3.0 + 1.4.0, para que outros pacotes de dados tenham a oportunidade de serem inseridos nele para transmissão sem aguardar o tempo todo A transferência de dados solicitada está concluída. Essa melhoria é aplicável a cenários em que a transmissão é restrita e a justiça precisa ser considerada. Além disso, se uma solicitação para um determinado pacote de dados falhar durante a transmissão, você poderá continuar transmitindo a partir do pacote de dados com falha, o que é adequado para cenários em que é necessária a retomada da transmissão.

Quebrar e furar

O protocolo TCP dividirá ou mesclará os dados a serem transmitidos de acordo com o tamanho do pacote (algoritmo Nagle). Portanto, o mesmo pacote de dados TCP pode conter o conteúdo de vários pacotes de dados auto-definidos.Pacotes de dados pequenos podem ser enviados ao mesmo tempo e pacotes de dados grandes são divididos e enviados.

 

Conforme mostrado na figura: o buffer é um pacote de dados completo 1 e apenas metade do pacote de dados do aplicativo 2. A conexão TCP está transmitindo os pacotes de dados do aplicativo 2, 3, 4 e 5, que são divididos em 3 pacotes de dados TCP, divididos em 3 Times.

A primeira vez que o aplicativo lê dados do buffer é apenas o pacote 1 e metade do pacote 2. Independentemente da situação de divisão, o pacote 2 está quebrado, o que é chamado de pacote quebrado.

Ao ler a partir do buffer pela segunda vez, a segunda metade do pacote de dados do aplicativo 2, parte dos pacotes de dados do aplicativo 3, 4 e parte do pacote de dados do aplicativo 5 serão lidos. Os pacotes de dados do aplicativo 3 e 4 estão completos, mas parece que o pacote de dados 4 está preso atrás do pacote de dados 3 e é chamado de pacote adesivo.

Quando um aplicativo lê dados de um soquete, na verdade ele lê os dados do buffer do sistema operacional para o buffer do aplicativo. Portanto, mesmo se usarmos o algoritmo TCP NODELAY para proibir que o TCP aplique o algoritmo Nagle para mesclar e enviar pacotes de dados, não há garantia de que o receptor não atenha ao pacote.

A tecnologia de pacotes pode resolver o problema acima: adicione cabeçalho de dados e marca de cauda de dados aos dados para esclarecer o início e o fim de cada pacote de dados.

Estrutura de pacotes

  • Packet ID: ID do pacote ao qual ele pertence.
  • Número de série: o número de série do subcontrato.
  • Tamanho do pacote: o comprimento dos dados deste pacote.
  • Segmento de dados: conteúdo de dados real.

Acho que você gosta

Origin www.cnblogs.com/wangb0402/p/12674563.html
Recomendado
Clasificación