2009-04-24 8 views
2

Nous testons actuellement une application Telecom sur IP. Nous ouvrons un Raw Socket et recevons les messages du côté distant (msgrate @ 750 + msgs/seconde taille approximative de 180 octets sans IP).Raw Socket Receive Buffer

Sur le socket Raw se trouve une couche appelée SCTP (tout comme TCP) qui indique de temps en temps qu'il manque des paquets. Maintenant, nous exécutons Wireshark sur le nœud de réception et nous pouvons voir ce paquet dans Wireshark.

Il me semble que le tampon de réception de la socket est petit causant IP (?) Pour laisser tomber les messages. Cependant, les points d'accès IP (netstat -sv) n'indiquent AUCUN abandon de paquets. Nous avons essayé de mettre la file d'attente de réception de socket à 40000 sans aucun succès. J'apprécierais tous les pointeurs quant à l'option, le cas échéant, de la couche IP que nous devrions configurer ou est-il une option de socket spécifique que nous devons définir.

Répondre

2

Merci pour vos entrées. Cependant, nous avons été en mesure de «résoudre» ce problème. Plus tôt, j'ai décrit comment nous lisions les messages. Une fois select sélectionné, nous exécutons une boucle (au nombre de messages bruts à lire qui était> 1 dans notre cas). 1) nous appelons ioctl (FIONREAD) pour trouver le nombre d'octets à lire; 2) lire que le nombre d'octets en appelant recvfrom 3) envoyer les octets jusqu'à l'utilisateur 4) aller en boucle à nouveau et appeler ioctl (FIONREAD), puis répétez les étapes

Cependant, au point 4, ioctl (FIONREAD) utiliser pour retourner 0. Notre code avait un contrôle défensif. Il attendait, un 0 octets de ioctl (FIONREAD) signifie que l'expéditeur a envoyé un en-tête IP avec 0 charge utile. Par conséquent, il faut appeler recvfrom (octets à lire = 0) pour vider l'en-tête IP de peur que le select ne se redéfinisse à ce sujet. Ioctl (FIONREAD) renvoie 0 comme nombre d'octets à lire À l'instant t1, recvfrom (octets à lire = 0) est appelé. Parfois, entre t0 et t1, les données réelles sont mises en file d'attente dans la file d'attente de réception de socket et utilisées pour être supprimées lorsque nous appelons recvFrom (bytes = 0).

Paramètre, le nombre de rawMsgsToRead = 1 a "résolu" ce problème. Cependant, je suppose que cela aura un impact sur notre performance.Est-ce que leur appel ioctl peut différencier les octets de la file d'attente de 0 et l'en-tête IP avec la charge utile 0

+0

Content que vous ayez résolu votre problème. Vous devez créer une nouvelle question concernant la différence entre les octets de la file d'attente 0 et l'en-tête IP avec la charge 0. Cordialement –

+0

En fait, après avoir analysé plus loin, je suis arrivé à la conclusion qu'appeler ioctl (FIONREAD) pour trouver le nombre d'octets en attente est un appel système trop. J'ai changé le code pour juste faire un recv (dans le cas de paquets UDP/Raw) avec la taille de la mémoire tampon au maximum possible que nous attendons. Cela fait, je n'ai plus à me soucier du scénario d'en-tête IP avec charge utile 0. Merci quand même pour vôtre aide. Cela m'a fait penser dans la bonne direction. –

1

J'ai quelques questions et quelques points à considérer. 1) Quelle implémentation de SCTP utilisez-vous et sur quel système d'exploitation. Certaines implémentations SCTP sont plus robustes que d'autres. 2) SCTP reconnaît-il négativement les paquets abandonnés? Rechercher un acks d'écart dans wireshark. 3) Et où vous voyez les paquets abandonnés dans wireshark êtes-vous sûr que ce ne sont pas des retransmissions? 4) Où dans le système est la surveillance de wirehark? Si ce n'est pas sur le même fil que votre application, il se peut que des messages n'apparaissent pas dans votre application. 5) Quelle est exactement l'indication de SCTP?

Si vous pensez que le tampon rx du socket IP est en train de déborder, vous pouvez envisager de réduire la taille de la fenêtre SCTP RX; ceci est souvent configurable dans les piles sctp. La fenêtre Rx limite la quantité de données pouvant être en attente d'accusé de réception et limite par conséquent la quantité de données qui pourrait se trouver dans le tampon IP. Vous pouvez également essayer d'augmenter la priorité de votre tâche SCTP afin qu'elle lise plus rapidement les messages hors des tampons IP (cela peut être la chose la plus facile à essayer et, selon moi, une bonne chose à faire).

Cordialement

+0

Nous sommes essentiellement des fournisseurs de piles, donc l'implémentation de SCTP est la nôtre. OS est Linux. Oui, wireshark mentionne les paquets dans le bloc Gap Ack. Wireshark s'exécutant sur le nœud de réception montre les paquets mais ils n'atteignent jamais SCTP. Nous avons un wrapper Socket sous la couche SCTP. Sur SCTP, nous imprimons le TSN reçu et sur le Wrapper nous avons imprimé le champ Identification de l'en-tête IP. Je peux clairement voir le paquet IP ne pas frapper le Wrapper (et donc pas à SCTP). –

+0

J'ai augmenté le txqueuelen et receviequeue len à IP à 10000 chacun. J'ai essayé d'augmenter le tampon de réception socket en appelant setsockopt à 40000 en vain. Les piquets d'IP ne montrent aucun message laissé tomber. Toute idée serait appréciée. –

+0

Pour quelle entreprise travaillez-vous? Avez-vous essayé d'augmenter la priorité de votre tâche SCTP et de réduire la taille de la fenêtre SCTP rx? Les fragments perdus sont-ils transmis dans des messages sctp séparés ou sont-ils regroupés? Le problème se produit-il uniquement à charge élevée? Comment savez-vous que les messages perdus ne touchent pas le wrapper IP? Cordialement –