метод accept () и рукопожатие tcp / ip - PullRequest
5 голосов
/ 20 января 2010

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

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

Это проблема Java или я не понимаю семантику accept ()?

Ответы [ 3 ]

6 голосов
/ 20 января 2010

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

1 голос
/ 20 января 2010

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

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

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

0 голосов
/ 20 января 2010

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

...