2010-02-15 11 views
5

J'ai posé cette question précédente ici:quand est le drapeau de pression fixé dans le segment tcp

tcp two sides trying to connect simultaneously

i essayé la méthode donnée dans la solution et en envoyant tout en utilisant netcat et renifler les paquets avec i observé éthérée quand j'ai envoyé une chaîne "hello" d'un côté à l'autre, elle a été envoyée dans un segment avec l'ensemble des indicateurs push.

Qui décide de définir le drapeau de poussée? Quelles sont les règles pour définir le drapeau push ou urgent dans un segment tcp? est-il possible de le faire en utilisant les prises api?

Répondre

6

Le drapeau PUSH est utilisé par la pile tcp pour dire en gros "j'ai fini pour le moment". Cela indique simplement que le segment de données est entièrement transmis par la source.

Il n'y a aucun moyen de l'indiquer ou de le contrôler dans userland (votre socket api), car c'est juste la pile tcp/l'implémentation pour le faire. Comme le drapeau URGENT.

(Source: Richard Stevens - Tcp/ip illustrated vol 1, chapitre 20)

+7

Le commentaire ci-dessus est erroné car il n'existe aucun moyen de contrôler le drapeau de poussée envoyé depuis l'espace utilisateur. Voir les options de socket TCP_NODELAY et TCP_CORK (man 7 tcp) et MSG_MORE (man 2 send). – MaZe

5

Vous pouvez définir le drapeau URGENT en utilisant send() avec le drapeau MSG_OOB. Comme cela implique, les données envoyées seront Out-Of-Band, ce qui signifie qu'il ne sera normalement pas reçu par le côté appelant en appelant simplement read(). Le côté récepteur obtiendra une indication des données OOB comme le signal SIGURG, ou le socket deviendra exceptionnel et peut être vérifié en tant que tel en utilisant select().

La plupart du temps, vous ne voulez pas définir le drapeau URGENT.