Pergunta

Eu uso a classe Java ServerSocket para aplicativo do servidor. O método aceita () participa do handshake de TCP/IP?

Como vejo no TCP/IP Dump e no Command NetStat, os clientes estabelecem conexões com o método antes da aceitação é chamado e o objeto de retorno do soquete.

É um problema de java, ou eu não entendo a semântica aceita ()?

Foi útil?

Solução

Geralmente no UNIX, se você marcar o soquete com Listen (), o sistema operacional começa a aceitar as conexões. Quando você chama a função aceit (), o sistema operacional simplesmente entrega a conexão já aberta. Ouvir, leva um parâmetro que permite especificar quantas conexões abertas 'não aceitas' o sistema operacional permite (ou seja, o tamanho da fila).

Outras dicas

o accept O método não participa ativamente do aperto de mão, por si só. O envio e o recebimento das mensagens são implementados na pilha de protocolos TCP/IP, normalmente no espaço do kernel do sistema operacional.

No entanto, o accept() o método está envolvido no sentido de que a pilha TCP/IP enviará apenas a mensagem Syn-ACK se algum processo tiver um accept() Ligue para ativo para obter um soquete limitado com o endereço IP e a porta relevantes. Quando o aperto de mão de três vias é concluído, o accept() A chamada do método será concluída.

Se nenhuma chamada de processo accept() Com o tempo, a mensagem SYN recebida será descartada pelo kernel e o cliente remoto acabará por diminuir a tentativa de conexão. (Por outro lado, se o endereço / porta IP não estiver vinculado, é provável que o kernel responda com uma primeira e o cliente remoto verá uma "conexão recusada".)

Aceite as devoluções somente depois que o cliente e o servidor estiverem conectados (handshake, etc.).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top