Rejet d'une connexion TCP avant d'être accepté?
Il y a 3 différents accept
versions dans winsock. En dehors de la base accept
qui est là pour conformité à la norme, il y a aussi AcceptEx
qui semble la version la plus avancée (à cause du superposées io capacités), et WSAAccept
. Le dernier prend en charge une condition de rappel, qui, autant que je comprends, permet le rejet des demandes de connexion avant qu'ils ne soient acceptés (lorsque le SO_CONDITIONAL_ACCEPT
option est activée). Aucune des autres versions prend en charge cette fonctionnalité.
Car je préfère utiliser AcceptEx
avec superposées io, je me demande comment se fait cette fonctionnalité n'est disponible que dans la version plus simple?
Je ne sais pas assez sur le fonctionnement interne de TCP dire wehter il y a en fait aucune différence entre le rejet d'une connexion avant qu'il a été accepté, et la déconnexion d'une prise juste après une connexion a été établie? Et si il y est, est-il possible d'imiter le WSAAccept
fonctionnalité avec AcceptEx
?
Quelqu'un peut jeter quelque lumière sur cette question?
OriginalL'auteur sold | 2009-11-17
Vous devez vous connecter pour publier un commentaire.
Lorsqu'une connexion est établie, l'extrémité distante envoie un paquet avec le SYN drapeau. Le serveur répond avec un SYN,ACK paquet, et après que l'extrémité distante envoie un ACK paquet, ce qui peut déjà contenir des données.
Il y a deux façons de briser une connexion TCP de se former. La première est la réinitialisation de la connexion - c'est la même que la commune "connexion refusée" message vu lors de la connexion à un port personne n'écoute. Dans ce cas, l'original SYN paquet est répondu avec un TVD paquet, ce qui met fin à la connexion immédiatement et est apatride. Si le SYN est renvoyé, TVD sera généré à partir de tous les reçus SYN paquet.
La deuxième est la fermeture de la connexion dès qu'il a été formé. Sur le niveau TCP, il n'y a aucun moyen de fermer la connexion à la fois des moyens immédiatement - la seule chose que vous pouvez dire, c'est que "je ne vais pas envoyer plus de données". Ce qui se passe, de sorte que, lors de la première SYN, SYN,ACK, ACK échange est terminé, le serveur envoie un FIN paquet à l'extrémité distante. Dans la plupart des cas, en disant à l'autre extrémité avec FIN que "je ne vais pas envoyer plus de données" met à l'autre bout de fermer la connexion en tant que bien, et d'envoyer ses propres FIN paquet. Une connexion résilié de cette manière n'est pas différent d'un autre relation où aucune donnée n'a été envoyé pour une raison quelconque. Cela signifie que l'état normal de suivi pour les connexions TCP et de la persistance de fermer les états persistent, tout comme pour les connexions normales.
Maintenant, sur l'API C de côté, c'est un peu différent. Lors de l'appel de
listen()
sur un port, l'OS commence à accepter les connexions sur ce port. Cela signifie que démarre la réponse SYN,ACK paquets de connexions, peu importe si le code C a appeléaccept()
encore. Donc, sur le TCP côté, il ne fait aucune différence si la connexion est en quelque sorte fermé avant ou après l'accepter. La seule préoccupation supplémentaire est qu'un socket d'écoute a un carnet de commandes, ce qui signifie que le nombre de non-accepté connexions qu'il peut avoir d'attente, avant qu'il commence en disant TVD à l'extrémité distante.Toutefois, sur windows, le
SO_CONDITIONAL_ACCEPT
appel permet à l'application de prendre le contrôle de l'arriéré de la file d'attente. Cela signifie que le serveur ne va pas répondre à rien à un SYN paquet jusqu'à ce que l'application fait quelque chose avec la connexion. Cela signifie que le fait de rejeter les connexions à ce niveau peut effectivement envoyer TVD paquets sur le réseau, sans la création de l'état.Donc, si vous ne pouvez pas obtenir le
SO_CONDITIONAL_ACCEPT
fonctionnalités activées en quelque sorte sur le support que vous utilisezAcceptEx
sur, elle va s'afficher différemment pour le réseau. Cependant, pas beaucoup d'endroits en fait utiliser l'immédiat TVD fonctionnalité, donc, je pense que l'exigence que doit dire un système très spécialisé en effet. Pour la plupart des cas d'utilisation courante, en acceptant une prise puis la fermeture c'est la façon normale de se comporter.OriginalL'auteur Nakedible
Je ne peux pas commenter sur les Fenêtres côté des choses, mais aussi loin que le protocole TCP est concerné, rejetant une connexion est un peu différent de déconnexion.
Pour l'un, déconnexion à partir d'un moyen de connexion, il y avait plus de ressources déjà "consommé" (par exemple les ports de l'etat maintenue dans le pare-feu &, la capacité de transfert utilisé dans des commutateurs/routeurs, etc.) à la fois le réseau et les hôtes. Rejetant une connexion est moins gourmande en ressources.
OriginalL'auteur jldupont