Pergunta

Estou executando uma caixa de Linux rodando 2.6.9-55.ELsmp, x86_64.

Eu estou tentando configurar o TCP receber janela usando a função setsockopt () usando C. eu tente o seguinte:

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));

O segmento de código acima está em um programa cliente que recebe dados de um servidor. Quando eu lançar o programa para receber e observar tcpdump saída, observo negociação janela assim:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>

Vemos que o programa cliente é, de facto negociar um diferente janela do que tenho definido no programa cliente. No entanto, de como eu pode interpretar o texto de Steven ( "/ IP Illustrated TCP, Volume 1") Seção 20.4, eu acredito que você efetuar que ele se refere no segundo bloco de citação na Seção 20.4 usando o setsockopt () chamar que eu uso (veja acima ).

Eu gostaria de entender de onde eu tenho errado ido.

Talvez a minha interpretação do que Stevens está dizendo é incorreta. Nesse caso, você poderia me aponte para a maneira correta de definir o buffer de recepção de tamanho? Como prova da minha confusão, eu me refiro a página do Linux TCP soquetes em http: //linux.die .net / homem / 7 / tcp (ver comentário sobre SO_RCFBUF).

O que estou ausente nesta história? Como faço para controlar o Tamanho do buffer (e tê-lo mostrar na saída tcpdump)? Por favor note que aludo para aqui um ajuste do SO_RCFBUF opção socket - Eu entendo que é o que aparece na negociação janela no SYN

.

Qualquer entrada é apreciada.

Foi útil?

Solução

Você precisa usar também TCP_WINDOW_CLAMP

rcvbuf = 2048;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
clamp = 1024;
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));

Observe o rcvbuf é o dobro da braçadeira, que poderia ser mais. Você pode deixá-lo autoajuste, o grampo janela será ainda trabalho. Isto não é portátil.

Outras dicas

A receber tamanho do buffer pode ser reduzida antes de ligar o socket - você pode aumentá-lo a qualquer momento. Que ordem você está chamando sockopt () em relação ao conectar ()?

Para TCP, o valor rwnd deve ser aprovada durante recv.

RECV (peúga, buf, rwnd, 0);

Este receberá 1024 bytes.

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