Поведение connect () с TCP - PullRequest
       30

Поведение connect () с TCP

1 голос
/ 06 апреля 2009

Я вызываю connect () на клиенте. Клиент входит в состояние SYN_SENT и отправляет SYN. Теперь он получает SYN без ACK, поэтому клиент переходит в состояние SYN_RCVD.

Функция connect () возвращается в этот момент? Технически у вас достаточно информации для вызова send () и recv () в сокете. Сам RFC говорит, что если вы вызываете SEND для сокета в состоянии SYN_RCVD, то:

SYN-RECEIVED STATE

  Queue the data for transmission after entering ESTABLISHED state.

И, если вы звоните RECEIVE:

LISTEN STATE
SYN-SENT STATE
SYN-RECEIVED STATE

  Queue for processing after entering ESTABLISHED state.  If there
  is no room to queue this request, respond with "error:
  insufficient resources".

Итак, мой вопрос: возвращается ли connect () после получения SYN, а затем блокируется ли вызов recv (), или сам блокирует connect (), пока соединение не будет установлено полностью?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2009

В качестве ориентира, реализация connect() в TCP / IP Illustrated, том 2 Райта и Стивенса будет блокироваться до тех пор, пока соединение не будет полностью установлено (если установлен вызов connect() заблокировать).

0 голосов
/ 06 апреля 2009

Клиент получит SYN без ACK только в случае одновременного подключения. Гораздо более распространенная последовательность событий с обычным блокирующим сокетом:

  • Клиентское приложение вызывает connect(), клиент отправляет SYN и переходит в состояние SYN-SENT
  • Клиент получает SYN+ACK с сервера; клиент отправляет ACK и переходит в состояние ESTABLISHED; возврат приложения к connect().
...