Pergunta

Vamos dizer que meu programa envia um 1000 bytes através da rede (UDP). Isso garantiu que o receptor receberá os 1000 bytes em um "lote"? Ou talvez ele vai precisar para realizar sevral "lê" até que ele receberá a mensagem inteira? se o mais tarde é verdade, como posso garantir que a ordem dos pacotes para a mesma mensagem não obter "mista" (em ordem), ou talvez as garantias Protocolo,
Editar : ou seja, não é possível que a minha mensagem será dividida para pacotes sevral? (E se eu tentar enviar uma mensagem 10000mb, o que acontece então?)

Foi útil?

Solução

Você vai ter tudo ou nada.

Mas não há nenhuma garantia especial que você vai receber pacotes exatamente uma vez na ordem em que foram transmitidos; perda de pacotes, reordenação e (menos frequentemente) a duplicação, tudo é possível.

Existe um tamanho máximo de quadro (de 65.507 bytes), send () ing pacotes de maiores dimensões vai devolver um erro.

Você deve fornecer tampão suficiente para receber todo o quadro em uma chamada.

pacotes UDP pode ser fragmentado em múltiplos fragmentos de IP, mas o sistema vai cair um pacote incompleto. Este é, portanto, transparente para o aplicativo.

Outras dicas

O receptor terá todo o pacote em uma chamada. O tamanho do pacote é limitado, mesmo em teoria :

Comprimento Um campo de 16 bits que especifica o comprimento em bytes da totalidade datagrama: cabeçalho e dados. O mínimo comprimento é de 8 bytes desde que é a comprimento do cabeçalho. O tamanho do campo define um limite teórico de 65.535 bytes (8 bytes de cabeçalho + 65527 bytes de dados) para um datagrama UDP. o limite prático para o comprimento de dados que é imposta pela subjacente protocolo IPv4 é 65.507 bytes.

No entanto, o limite real é muito, muito menor, geralmente é seguro assumir que 512 bytes. Consulte Qual é o maior Tamanho Seguro UDP Packet em Internet.

Os dados enviados usando UDP é agrupado em pacotes , por isso, se você envia x quantidade de bytes, em seguida, se o receptor recebe o pacote, ele receberá x quantidade de bytes.

No entanto, seus pacotes pode até não chegar, ou eles podem chegar fora de ordem.

UDP, ao contrário do TCP, não é um protocolo confiável. Ele não fornece construído em um mecanismo para garantir que os pacotes chegam na ordem correta, ou mesmo chegar a todos. Dito isto, você pode escrever suas rotinas de envio / recv de forma passo de bloqueio, onde cada vez que um pacote é enviado, o remetente deve esperar para receber um ACK antes de enviar novamente. Se um ACK não é recebido depois de algum tempo de espera especificado, o pacote deve ser reenviado. Desta forma, você garantir que os pacotes sejam recebidos na ordem correta. (Para mais informações, consulte a RFC para o protocolo TFTP , que usa esta estratégia .)

Finalmente, se possível, você pode querer considerar o uso de TCP em vez.

Com UDP Lite você pode pedir para receber pacotes parcialmente corrompidos. Isto pode ser útil para serviços de vídeo e de VoIP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top