2016-02-10 4 views
0

Я разрабатываю клиент, который подключается к серверу через TCP. Серверы настроены таким образом, что если один сервер отключен, соединение настраивается на другом сервере.Отключение повторной передачи TCP SYN

Мое требование состоит в том, что если TCP-соединение не установлено с 1-м сервером в течение 2 секунд, клиенту необходимо установить соединение со вторым сервером.

Ниже приведено мое наблюдение на основе тестирования. Сообщение TCP SYN отправляется клиентом на 1-й сервер для установления соединения. Поскольку 1-й сервер отключен, через 1 секунду повторная передача TCP SYN отправляется на 1-й сервер. Через 2 секунды (из-за обработки и задержек сети) сообщение TCP SYN отправляется клиентом на второй сервер. Поэтому его прием 3s (1s + 2s) для отправки SYN-сообщения на второй сервер, чего я не хотел. Я хочу, чтобы сообщение TCP SYN было отправлено на 2-й сервер в течение 2 секунд.

Чтобы отправить сообщение TCP SYN на второй сервер в течение 2 секунд, я хочу избежать повторной передачи TCP SYN.

Я попытался установить net.ipv4.tcp_syn_retries = 0 в /etc/sysctl.conf. Но я получаю 1 повторную передачу TCP SYN.

Итак, есть ли способ отключить повторную передачу TCP SYN из пользовательского пространства без изменения источника ядра?

ответ

1

Мое требование состоит в том, что если TCP-соединение не установлено с 1-м сервером в течение 2 секунд, клиенту необходимо установить соединение со вторым сервером.

В этом случае просто подключитесь с тайм-аутом в течение 2 секунд на клиенте, и если соединение не удастся повторить попытку с другим сервером. После закрытия сокета ядро ​​перестанет пытаться подключиться к первому серверу. Это намного лучше и более независимо от конкретной платформы, чем для того, чтобы возиться со встроенным поведением надежности и временем TCP.

+0

Чтобы реализовать это, вам нужно поместить сокет в неблокирующий режим, выпустить connect() и использовать select() для ожидания записи, с требуемым таймаутом. Или используйте Java :-) – EJP

Смежные вопросы