2010-01-19 5 views
4

J'utilise la classe java ServerSocket pour l'application serveur. La méthode accept() participe-t-elle à la négociation TCP/IP?Méthode accept() et handshake tcp/ip

Comme je le vois dans tcp/ip dump et de la commande netstat, les clients établissent des connexions avec la méthode before accept et retournent l'objet Socket.

Est-ce un problème java, ou je ne comprends pas la sémantique accept()?

Répondre

6

Généralement sous Unix, si vous marquez le socket avec listen(), le système d'exploitation commence à accepter les connexions. Lorsque vous appelez la fonction accept(), le système d'exploitation transmet simplement la connexion déjà ouverte. Listen prend un paramètre qui vous permet de spécifier le nombre de connexions ouvertes «non acceptées» autorisées par le système d'exploitation (c'est-à-dire la taille de la file d'attente).

0

Accepter les retours seulement après que le client et le serveur sont connectés (handshake, etc.).

1

La méthode accept ne participe pas activement à la prise de contact, en soi. L'envoi et la réception des messages sont implémentés dans la pile de protocole TCP/IP, généralement dans l'espace noyau du système d'exploitation. Cependant, la méthode accept() est impliquée dans le sens que la pile TCP/IP enverra le message SYN-ACK uniquement si un processus a un appel accept() actif pour un socket lié avec l'adresse IP et le port correspondants. Lorsque la prise de contact à trois voies est terminée, l'appel de méthode accept() se termine.

Si aucun processus n'appelle accept() dans le temps, le message SYN entrant sera supprimé par le noyau et le client distant finira par expirer la tentative de connexion. (D'un autre côté, si l'adresse IP/le port n'est pas lié, le noyau est susceptible de répondre avec un RST, et le client distant verra une "connexion refusée".)

Questions connexes