Question

Je suis en cours d'exécution d'une machine Linux 2.6.9-55.ELsmp, x86_64.

Je suis en train de régler la fenêtre de réception TCP en utilisant la fonction setsockopt () en utilisant C. Je procédez comme suit:

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

Le segment de code ci-dessus est dans un programme client qui reçoit des données à partir d'un serveur. Quand je lancer le programme pour recevoir et observer la sortie de tcpdump, je vois la négociation de la fenêtre comme ceci:

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

On voit que le programme client est en fait la négociation d'une fenêtre différente de ce que j'ai mis dans le programme client. Cependant, de la façon dont je peux interpréter le texte de Steven ( « TCP / IP Illustrated, Volume 1 ») L'article 20.4, je crois que vous effet ce qu'il fait référence au deuxième bloc de citation dans la section 20.4 en utilisant la setsockopt () appelle-je utiliser (voir ci-dessus ).

Je voudrais comprendre où je suis allé mal.

Peut-être que mon interprétation de ce que Stevens dit est incorrect. Dans ce cas, je pourrais vous indiquer la bonne façon de régler la taille du tampon de réception? Comme preuve de ma confusion, je renvoie le sockets TCP Linux page man http: //linux.die .net / homme / 7 / tcp (voir commentaire sur SO_RCFBUF).

Qu'est-ce que je suis absent dans cette histoire? Comment puis-je contrôler la taille de réception de la mémoire tampon (et l'ont montre dans la sortie de tcpdump)? S'il vous plaît noter que je fais allusion ici un réglage de l'option prise SO_RCFBUF - Je comprends que ce qui apparaît dans la négociation de la fenêtre dans le SYN

.

Toute entrée est appréciée.

Était-ce utile?

La solution

Vous devez aussi utiliser 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));

Notez que le rcvbuf est deux fois la pince, il pourrait être plus. Vous pouvez laisser autotune, la pince de fenêtre fonctionne toujours. Ce n'est pas portable.

Autres conseils

La réception taille du tampon peut être réduite avant la connexion de la prise - vous pouvez augmenter à tout moment. Quel ordre appelez-vous sockopt () en rapport connect ()?

Pour TCP, la valeur RWND doit être adoptée au cours de recv.

recv (chaussette, buf, rwnd, 0);

1024 octets doit recevoir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top