2010-01-19 3 views
4

Я использую класс Java ServerSocket для серверного приложения. Принимает ли метод accept() в рукопожатии tcp/ip?accept() method и tcp/ip handshake

Как я вижу в дампе tcp/ip и из команды netstat, клиенты устанавливают соединения, прежде чем метод accept вызывается и возвращает объект Socket.

Является ли проблема с java, или я не понимаю accept() семантику?

ответ

6

Как правило, в Unix, если вы отмечаете разъем с помощью функции listen(), операционная система начинает принимать соединения. Когда вы вызываете функцию accept(), операционная система просто передает уже открытое соединение. Listen принимает параметр, который позволяет указать, сколько «непринятых» открытых подключений позволяет ОС (т. Е. Размер очереди).

0

Принять возвращается только после подключения клиента и сервера (рукопожатие и т. Д.).

1

Метод accept не принимает активного участия в рукопожатии, сам по себе. Передача и прием сообщений осуществляется в стек протокола TCP/IP, как правило, в пространстве ядра ОС.

Однако метод accept() связан с тем, что стек TCP/IP отправляет сообщение SYN-ACK, если какой-либо процесс имеет активный вызов accept() для сокета, связанного с соответствующим IP-адресом и портом. Когда трехстороннее квитирование завершено, вызов метода accept() будет завершен.

Если процесс не вызывает accept() вовремя, входящее SYN-сообщение будет сброшено ядром, и удаленный клиент в конечном итоге отключит попытку подключения. (С другой стороны, если IP-адрес/порт не привязан, ядро, скорее всего, ответит RST, а удаленный клиент увидит «соединение отказано».)