Há alguma garantia de que, se você enviar 20 bytes no início de um fluxo TCP, ele não chegará como duas partes de 10 bytes. Isso ocorre porque a pilha TCP não envia segmentos tão pequenos: existe um tamanho mínimo de MTU. No entanto, se o envio estiver em qualquer lugar no meio de um fluxo, todas as apostas serão desativadas. Pode ser que sua pilha de protocolos use 10 bytes dos dados para preencher um segmento e enviá-lo e, em seguida, os próximos dez bytes vão para outro segmento.
Sua pilha de protocolos divide os dados em pedaços e os coloca em uma fila. Os tamanhos dos pedaços são baseados no caminho MTU. Se você executar uma operação de envio e ainda houver dados na fila pendentes, a pilha de protocolos normalmente examinará o segmento que está no final da fila e verificará se há espaço nesse segmento para adicionar mais dados. A sala pode ter o tamanho de um byte, portanto, mesmo um envio de dois bytes pode ser dividido em dois.
Por outro lado, a segmentação de dados significa que pode haver leituras parciais. Uma operação de recebimento pode potencialmente ativar e obter dados quando chega apenas um segmento. Na API de soquetes amplamente implementada, uma chamada de recebimento pode solicitar 20 bytes, mas pode retornar com 10. Obviamente, uma camada de buffer pode ser construída nela, bloqueando até que 20 bytes sejam recebidos ou a conexão quebre. No mundo POSIX, essa API pode ser o fluxo de E / S padrão: você pode usar fdopen
um descritor de soquete para obter um FILE *
fluxo e usá fread
-lo para preencher um buffer, de modo que a solicitação completa seja satisfeita com o número de read
chamadas necessárias. .
Os datagramas UDP enquadram os dados. Cada chamada de envio gera um datagrama (mas veja abaixo sobre rolhas). O outro lado recebe um datagrama completo (e, na API do soquete, ele deve especificar um buffer grande o suficiente para retê-lo, caso contrário, o datagrama será truncado). Os datagramas grandes são fragmentados pela fragmentação de IP e são remontados de forma transparente aos aplicativos. Se algum fragmento estiver ausente, o datagrama inteiro será perdido; não há como ler dados parciais nessa situação.
Existem extensões para a interface, permitindo que várias operações especifiquem um único datagrama. No Linux, um soquete pode ser "arrolhado" (impedido de enviar). Enquanto estiver arrolhado, os dados gravados são reunidos em uma única unidade. Então, quando o soquete é "desarrolhado", um único datagrama pode ser enviado.