Definir janela de recepção TCP em C e trabalhar com tcpdump em Linux
-
19-09-2019 - |
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.
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.