7
votes

Pourquoi un serveur TCP doit-il envoyer une aileron immédiatement après avoir accepté une connexion?

de la capture de paquets éthreal, je vois le comportement suivant qui apparaît assez étrange pour moi:

Client --> Server  [SYN]
Server --> Client  [SYN, ACK]
Client --> Server  [ACK]
Server --> Client  [FIN, ACK]
Client --> Server  [ACK]
Client --> Server  [TCP Segment of a reassembled PDU] (I don't know what this means)
Server --> Client  [RST]

tcp

3 commentaires

Est la télécommande du serveur ou local? Est-il possible d'un ISP abusif insérant des body paquets?


Le serveur est à distance. Comment puis-je savoir si des paquets faux sont insérés?


@Jay environ 1. S'il vous plaît voir publiib.boulder.ibm.com/infocenter/tpfhelp/Current/...


6 Réponses :


0
votes

semble être que les appels de serveur arrêt très peu après avoir accepté la connexion.


0 commentaires

5
votes

Fin signifie généralement l'autre côté appelé arrêt (..) sur la prise.


5 commentaires

Voulez-vous dire que l'appel à «accepter» aurait sûrement revenu avec succès dans ce cas?


Oui. Sans accepter () Vous verriez simplement le silence et éventuellement les délais d'attente.


Ok, mais il n'y a pas moyen d'accepter une ailette droite? Je veux dire en cas de conditions d'erreur, est-ce possible?


Pas que je sache, certainement.


Hmm? Non, la connexion est configurée avant accepter () est appelée - le paramètre Backlog sur écoute () Spécifie le nombre de connexions dans cet état (connecté, mais accepter () pas encore appelé).



2
votes

Je suppose que la connexion est acceptée par inetd ou un démon similaire, qui tente ensuite de Fork et exec un autre programme à Manipulez la connexion et que le Fork est en échec (en raison de l'épuisement des ressources) ou du EXEC échoue (en raison du fichier inexistant, une erreur d'autorisations, etc.). < / p>


0 commentaires

1
votes

pourrait être wrappers TCP . Si le processus de serveur a été construit avec la prise en charge de libewrap, il acceptera la connexion, vérifie /etc/hosts.allow et /etc/hosts.deny , puis ferme immédiatement le connexion si elle est refusée par la politique.

Il est facile de voir si le serveur utilise libulège: xxx


0 commentaires

17
votes

En cas d'analyse approfondie, il a été jugé ci-après la raison du problème:

Lorsqu'un client essaie TCP Connect, même si le serveur n'appelle pas actuellement accepter, la connexion passera. Cela se produira si le serveur a appelé la fonction «Écouter» et il continuera d'accepter les connexions jusqu'à ce que la limite d'arriéré soit atteinte.

Mais, si le processus d'application dépasse la limite des descripteurs de fichier MAX, il peut utiliser, alors lorsque les appels de serveur acceptent, il se rend compte qu'il n'y a pas de descripteurs de fichier disponibles à être attribué pour la prise et échoue à l'appel d'acceptation et au TCP. Connexion Envoi d'une ailette de l'autre côté.

Je viens de poster cette découverte ici. Je quitte toujours la réponse acceptée comme celle de Habbie.

Merci à tous ceux qui ont répondu à cette question.


0 commentaires

0
votes

Je pense que la fin a été envoyée en appelant près () au lieu d'arrêter ().

La connexion est en file d'attente d'arriéré; Après accepté (), le serveur décide de le terminer pour une raison quelconque (par exemple, des descripteurs CLACE TCP Wrapper ou des descripteurs de fichiers). Dans ce cas, une limite de clôture () diminue le nombre de descripteur de fichier (FD) de 1 à 0, la FD pour cette connexion est entièrement détruite. Ensuite, le client envoie des données à une prise non existante du point de vue du serveur, le serveur doit répondre à une TVD.

Si c'était un arrêt (), le serveur peut toujours relancer les données envoyées par le client et attendre l'aileron du client pour fermer la connexion gracieusement. Aucun RST n'est renvoyé.

P.s. Fermer () vs Shutdown ()


0 commentaires