Keep alive в роутере что это

Keep alive в роутере что это

Как работает http keep-alive?

Keep-alives были добавлены к HTTP, чтобы в основном уменьшить значительные накладные расходы на быстрое создание и закрытие сокетных соединений для каждого новый запрос. Ниже приводится краткое описание того, как это работает в HTTP 1.0 и 1.1:

HTTP 1.0 спецификация HTTP 1.0 на самом деле не вникает в то, как Сохранить-живым должно сработать. В основном, браузеры, которые поддерживают Keep-Alive добавляет дополнительный заголовок к запросу как:

Соединение: Keep-Alive, когда сервер обрабатывает запрос и генерирует ответ, он также добавляет заголовок к ответу: Соединение: Keep-Alive когда это сделано, соединение сокета является не закрыто, как раньше, но остается открытым после отправки ответа. Когда клиент отправляет другой запрос, он повторно использует то же самое соединение. То соединение будет продолжать использоваться повторно до тех пор, пока клиент или сервер решает, что разговор окончен, и один из них сбрасывает соединение.

Вышеприведенное объяснение исходит отсюда . Но я не понимаю одной вещи

Когда это будет сделано, соединение сокета не будет закрыто, как раньше, но оставалась открытой после отправки ответа.

Как я понимаю, мы просто посылаем tcp пакетов, чтобы сделать запросы и ответы, как это socket connection помогает и как это работает? Мы все еще должны отправлять пакеты, но как он может каким-то образом установить постоянное соединение? Это кажется таким нереальным.

Есть накладные расходы при установлении нового соединения TCP (DNS поиск, TCP рукопожатие, SSL / TLS рукопожатие и т.д.). Без keep-alive каждый запрос HTTP должен установить новое соединение TCP, а затем закрыть соединение, как только ответ был sent/received. a keep-alive позволяет существующему соединению TCP повторно использоваться для нескольких requests/responses,, таким образом избегая всех этих накладных расходов. Именно это и составляет связь «persistent».

В HTTP 0.9 и 1.0 по умолчанию сервер закрывает свой конец соединения TCP после отправки ответа клиенту. Клиент должен закрыть свой конец соединения TCP после получения ответа. В HTTP 1.0 (но не в 0.9) клиент может явно попросить сервер не закрывать свой конец соединения, включив в запрос заголовок Connection: keep-alive . Если сервер согласен, он включает заголовок Connection: keep-alive в ответ и не закрывает свой конец соединения. Затем клиент может повторно использовать то же самое соединение TCP для отправки следующего запроса.

В HTTP 1.1 keep-alive является поведением по умолчанию, если только клиент явно не попросит сервер закрыть соединение, включив заголовок Connection: close в свой запрос, или сервер не решит включить заголовок Connection: close в свой ответ.

Давайте проведем аналогию. HTTP состоит в отправке запроса и получении ответа. Это похоже на то, как если бы вы задали кому-то вопрос и получили ответ.

Проблема в том, что вопрос и ответ нужно пройти через сеть. Для связи через сеть используется TCP (сокеты). Это похоже на использование телефона, чтобы задать вопрос кому-то и получить ответ от этого человека.

HTTP 1.0 состоит, когда вы загружаете страницу, содержащую 2 изображения, например, в

  • сделайте телефонный звонок
  • попросите страницу
  • получить страницу
  • завершение телефонного разговора
  • сделайте телефонный звонок
  • попросите первое изображение
  • получить первое изображение
  • завершение телефонного разговора
  • сделайте телефонный звонок
  • попросите второе изображение
  • получить второе изображение
  • завершение телефонного разговора

Чтобы сделать телефонный звонок и закончить его, требуется время и ресурсы. Контрольные данные (например, номер телефона) должны передаваться по сети. Было бы более эффективно сделать один телефонный звонок, чтобы получить страницу и два изображения. Вот что позволяет делать keep-alive. С keep-alive вышесказанное становится

  • сделайте телефонный звонок
  • попросите страницу
  • получить страницу
  • попросите первое изображение
  • получить первое изображение
  • попросите второе изображение
  • получить второе изображение
  • завершение телефонного разговора

Это действительно сетевой вопрос, но он может быть уместен здесь в конце концов.

Путаница возникает из-за различия между пакетно-ориентированными и потоко-ориентированными соединениями.

Интернет часто называют сетью «TCP/IP». На низком уровне (IP, Internet Protocol) интернет ориентирован на пакетирование. Хосты отправляют пакеты другим хостам.

Однако поверх IP мы имеем TCP (протокол управления передачей). Вся цель этого уровня интернета состоит в том, чтобы скрыть пакетно-ориентированную природу базового носителя и представить соединение между двумя хостами (хостами и портами, если быть более точным) как поток данных, подобный файлу или каналу. Затем мы можем открыть сокет в OS API, чтобы представить это соединение, и мы можем рассматривать этот сокет как файловый дескриптор (буквально FD в Unix, очень похожий на файл HANDLE в Windows).

Большинство rest протоколов клиент-сервер Интернета (HTTP, Telnet, SSH, SMTP) расположены поверх TCP. Таким образом, клиент открывает соединение (сокет), записывает свой запрос (который передается как один или несколько карманов в базовом IP) в сокет, считывает ответ из сокета (и ответ может содержать данные из нескольких пакетов IP), а затем. Тогда выбор заключается в том, чтобы сохранить соединение открытым для следующего запроса или закрыть его. Pre-KeepAlive HTTP всегда закрывал соединение. Новые клиенты и серверы могут держать его открытым.

Преимущество KeepAlive заключается в том, что установление соединения является дорогостоящим. Для коротких запросов и ответов может потребоваться больше пакетов, чем для реального обмена данными.

Небольшой недостаток может заключаться в том, что теперь сервер должен сообщить клиенту, где заканчивается ответ. Сервер не может просто отправить ответ и закрыть соединение. Он должен сказать клиенту: «read 20KB and that will be the end of my response». Таким образом, размер ответа должен быть заранее известен сервером и сообщен клиенту как часть протокола более высокого уровня (например, Content-Length: в HTTP). В качестве альтернативы сервер может отправить разделитель для указания конца ответа — все зависит от протокола выше TCP.

Вы можете понять это таким образом:

HTTP использует TCP в качестве транспорта. Перед отправкой и получением пакетов через TCP,

  1. Клиент должен отправить запрос на подключение
  2. Сервер отвечает
  3. Передача данных передача данных осуществляется
  4. Соединение закрыто.

Однако, если мы используем функцию keep-alive, соединение не закрывается после получения данных. Соединение остается активным.

Это помогает повысить производительность, так как для следующих вызовов установление соединения не будет происходить, так как соединение с сервером уже есть. Это означает, что требуется меньше времени. Хотя время, затрачиваемое на подключение, невелико, но оно действительно имеет большое значение в системах, где каждая МС имеет значение.

Похожие вопросы:

Могу ли я указать тайм- аут HTTP или сервер вводит значение? Например, если я это сделаю: telnet my.server.net 80 Trying X.X.X.X. Connected to my.server.net. Escape character is ‘^]’. GET.

Я использовал инструмент http://www.webpagetest.org для проверки веб-страницы, это указывает на то, что keep-alive не активирован. Я исследовал это и был приведен к тому, как я могу включить.

Имеет ли сервер Go значение таймаута по умолчанию http keep-alive? Как вы устанавливаете пользовательский тайм-аут keep-alive? Связано ли ReadTimeout сервера с таймаутом keep-alive вообще? или вам.

Правильно ли я рассуждаю о HTTP Keep-Alive? Вот мои предположения: В современных браузерах постоянные соединения используются по умолчанию, поэтому заголовок ответа Connection: Keep-Alive вряд ли.

Я пытаюсь написать клиент HTTP, который использует HTTP keep-alive соединения. Когда я подключаюсь от ClientBoostrap, я получаю канал. Могу ли я использовать это для отправки нескольких запросов.

Я пишу браузер, который отправляет запросы http get, построенные так же, как и браузеры. Я хочу проверить заголовок keep-alive, поэтому я отправляю и получаю следующий пакет дважды: POST /test.php.

Я знаю, что HTTP keep-alive включен по умолчанию в HTTP 1.1, но я хочу найти способ подтвердить, что он действительно работает. Кто-нибудь знает простой способ тестирования из веб-браузера (EG как.

У меня есть два сервера Tomcat, которые должны поддерживать постоянное соединение, чтобы сократить количество рукопожатий SSL. Один сервер (Прокси) сидит в DMZ, в то время как другой находится в.

Мы запускаем HAProxy V1.5, как описано выше. Я пытаюсь включить Keep-Alive и заметил, что заголовки ответов не содержат заголовка Connection: Keep-Alive . Наш haproxy.cfg содержит следующие значения.

На http persistent есть таймер keep alive. Когда время жизни закончится, что произойдет? соединение tcp закроется? я так не думаю, потому что есть keep alive on tcp connection, который exsist. Итак.

Настройка D-Link DIR-300 NRU B5

Wi-Fi-точка роутер, стандарт Wi-Fi: 802.11b/g/n. Макс. скорость беспроводного соединения: 150 Мбит/с.

Для роутера D-Link DIR-300 у нас есть четыре варианта инструкций:

Инструкция по настройке роутера D-Link DIR-300 NRU B5

Авторизация

Для того, что бы попасть в веб-интерфейс роутера, необходимо открыть ваш Интернет браузер и в строке адреса набрать 192. 168.0.1, Имя пользователяadmin , Парольadmin (при условии, что роутер имеет заводские настройки, и его IP не менялся).

Смена заводского пароля

В целях безопасности рекомендуется сменить заводской пароль.

По умолчанию: Логин admin, пароль admin.

В интерфейсе роутера необходимо зайти во вкладку Система (System), меню Пароль администратора (Administrator password).

В поле Пароль (New Password) введите новый пароль.

В поле Подтверждение (Confirm Password) повторите новый пароль.

Затем нажмите кнопку Сохранить (Save Settings).

После этого, роутер предложит повторно зайти в его настройки.

Настройка подключения к Интернет

В интерфейсе роутера необходимо зайти во вкладку Сеть, меню Соединение (Здесь Вы можете добавлять, редактировать и удалять соединения). Нажмите на кнопку Добавить.

Настройка PPPoE подключения

  1. В поле Тип соединения (Connection Type): выберите PPPoE
  2. В поле MAC вводите номер вашей сетевой карты (узнать его можно в состоянии подключения по локальной сети или через командную строку «ipconfig /all»)
  3. PPP имя пользователя(PPP Username): Ваш логин из договора
  4. Пароль (Password): Ваш пароль из договора
  5. Подтверждение пароля (Confirm Password): повтор пароля
  6. Алгоритм аутентификации: Auto
  7. Keep alive — ставим галочку для постоянного подключения
  8. Остальные поля оставьте по умолчанию
  9. Сохраняем настройки кнопкой Save и кнопкой Перезагрузка перезагружаем роутер.
Читать еще:  Western digital чем отличаются цвета

Настройка L2TP подключения

Главные настройки

Укажите тип соединения L2TP.

Имя — Имя не меняйте

Разрешить — Оставьте галочку

Физический уровень

Физический интерфейс — Port5

MTU — оставьте без изменений

МАС — Если у провайдера используется привязка по МАС-адресу, пропишите МАС-адрес вашего сетевого адаптера. Если привязки нет, поле МАС; оставьте без изменений.

Остальные Главные настройки и Физический уровень оставьте без изменений.

В поле Настройки PPTP/L2TP:

Соединяться автоматически — поставьте галочку

Как задать имя сервиса — укажите URL или IP

Имя сервиса — пропишите адрес VPN-сервера провайдера

Без авторизации — галочку не ставьте

PPP Имя пользователя — пропишите логин для доступа в интернет, выданный провайдером

Пароль — пропишите пароль для доступа в интернет, выданный провайдером

Подтверждение пароля — повторный ввод пароля

Шифрование — если у провайдера не используется MPPE-шифрование оставьте Без шифрования;. Если шифрование используется, установите MPPE AUTOили уточните тип шифрования у провайдера.

Алгоритм аутентификации — оставьте AUTO

KeepAlive — подключение будет постоянно включенным.

MTU — поменяйте значение на 1450 или меньше

В поле Разное проверьте, чтобы стояли галочки NAT и Сетевой экран.

Если провайдер предоставляет услугу интернет телевидения, поставьте галочку Включить IGMP.

Нажмите Сохранить;.

Настройка PPtP (VPN) при автоматическом получении локального IP адреса (DHCP)

  1. В поле Тип соединения (Connection Type): выберите PPTP (PPTP и L2TP — туннельные протоколы типа точка-точка, позволяющие компьютеру устанавливать защищённое соединение с сервером за счёт создания специального туннеля в стандартной, незащищённой сети.)
  2. В поле MAC вводите номер вашей сетевой карты (узнать его можно в состоянии подключения по локальной сети или через командную строку «ipconfig /all»)
  3. PPP имя пользователя(PPP Username): Ваш логин из договора
  4. Пароль (Password): Ваш пароль из договора
  5. Подтверждение пароля (Confirm Password): повтор пароля
  6. Имя сервиса(Service name): — IP/Имя сервера провайдера
  7. Значение MTU — 1372
  8. Алгоритм аутентификации: Auto
  9. Keep alive — ставим галочку для постоянного подключения
  10. Сохраняем настройки кнопкой Save кнопкой Перезагрузка перезагружаем роутер.

NAT при автоматическом получении IP адреса (DHCP)

  1. В поле Тип соединения (Connection Type): выберите IPoE
  2. В поле MAC вводите номер вашей сетевой карты (узнать его можно в состоянии подключения по локальной сети или через командную строку «ipconfig /all»)
  3. В пункте Настройка IP выбираем получить IP автоматически
  4. В пункте Настройка IP выбираем получить адрес DNS автоматически
  5. Сохраняем настройки кнопкой Save и перезагружаем роутер.

Настройка Wi-Fi на роутере

В интерфейсе роутера необходимо зайти во вкладку Wi-Fi , меню Основные настройки (Basic settings).

1. SSID название вашей беспроводной сети.

2. Во вкладке Wi-Fi, выбираем настройки безопасности.

3. В выпадающем списке Сетевых аутентификаций (Network Authentication): выбираем WPA-PSK/WPA2-PSK mixed — это наиболее безопасный способ защитить Вашу беспроводную сеть.

В поле ключ шифрования PSK Вы должны ввести любой набор цифр, длиной от 8 до 63. Их также необходимо запомнить, чтобы Вы могли указать их при подключении к сети. Нажимаем на кнопку Изменить, чтобы применить и сохранить настройки.

Проверка статуса подключения к Интернет

В интерфейсе роутера необходимо зайти во вкладку Статус (Status),меню Сетевая статистика(Network Statics)

Сохранение/восстановление настроек роутера

После проведения настроек, рекомендуется сохранить их, чтобы в случае возникновения проблем, можно было их восстановить. Для этого необходимо зайти во вкладку Система ,меню Конфигурация.

  1. Выберите сохранение текущий конфигурации, Для сохранения текущих настроек роутера Файл с настройками будет сохранен в указанное место на жёстком диске.
  2. Для восстановления настроек из файла, необходимо нажать и выбрать Загрузка раннее сохранённой конфигурации в устройство, указать путь к файлу с настройками, затем нажать кнопку.

Ускорение Работы Сайта — Включение Режима Keep-Alive

Введение

Как работает режим Keep-Alive?

В этом руководстве вы научитесь 4 способам, как включить режим Keep-Alive. Keep-Alive позволяет браузеру пользователя скачивать весь необходимый контент (такой как JavaScript, CSS, изображения, видео и т.д.) через постоянное TCP соединение, вместо создания нескольких запросов для каждого файла. Это обеспечит скорость и производительность, так как браузер вашего посетителя сможет получить все из одного, постоянного HTTP соединения. Простыми словами, Keep-Alive — это форма связи между сервером и браузером способная серьезно уменьшить количество запросов и скорость загрузки страницы. Эта схема позволит вам понять разницу и преимущество режима Keep-Alive:

Преимущества режима Keep-Alive:

  • Keep-Alive сокращает использование ресурсов сервера из-за меньшего количества сгенерированных HTTP запросов. Это приносит пользу всем пользователям, независимо от их хостинга (бесплатного, виртуального или VPS).
  • Режим Keep-Alive обеспечивает конвейерность (доставку запросов через одно и тоже TCP соединение).
  • HTTPS запросам нужно больше времени и ресурсов центрального процессора. Если вы используете HTTPS и SSL, Keep-Alive станет еще более полезен.
  • Уменьшение задержки, общее увеличение скорости загрузки и производительности.
  • Keep-Alive поддерживается всеми современными браузерами.
  • Режим Keep-Alive также принесет вам пользу в сфере SEO оптимизации, из-за лучшей производительности сайта.

После всего этого, можно с уверенностью сказать, что Keep-Alive это отличный способ для уменьшения использования ресурсов сервера, и в то же время увеличения скорости загрузки вашего сайта.

Что вам понадобится

Перед тем, как вы начнете это руководство, вам понадобится следующее:

  • Доступ к файлу .htaccess
  • Доступ к httpd.conf (необязательно)
  • Доступ к HttpCoreModule (необязательно)

Шаг 1 — Анализ вашего сайта

Во-первых, вы должны проанализировать ваш сайт с помощью таких инструментов как GTMetrix, чтобы определить включен ли режим Keep-Alive на вашем сервере. Вот результаты после анализа тестовой страницы:

На некоторых серверах или провайдерах услуг хостинга режим Keep-Alive включен по умолчанию. Если ваши результаты выдают 100%, значит вам нет необходимости производить какие-либо действия.

Шаг 2 — Включение режима Keep-Alive

Существует несколько способов включения режима Keep-Alive и их выбор зависит от вашего сервера или провайдера услуг хостинга. Вот несколько вариантов:

Вариант 1 — Редактирование файла .htaccess

Добавление данного кода в ваш файл .htaccess должно помочь включить режим Keep-Alive. Включение режима Keep-Alive через .htaccess заменит собой любые настройки сервера и включит постоянное соединение.

Этот метод должен работать на большинстве виртуальных хостингов на базе Linux. В случае, если вы не знаете где найти файл .htaccess, обратитесь к этому руководству.

Вариант 2 — Включение режима Keep-Alive в Apache через файл httpd.conf

Если у вас есть доступ к файлу настроек Apache, вы можете включить режим оттуда. Вот как должны выглядеть настройки:

  • KeepAlive On включает режим Keep-Alive.
  • MaxKeepAliveRequests устанавливает максимальное количество запросов для одного соединения. 50 запросов для одного соединения считается оптимальным.
  • KeepAliveTimeout определяет, как долго сервер будет ожидать запрос от клиента. Рекомендуется начать с меньших значений, таких как 5 или 10 секунд и увеличивать их по мере необходимости. Выставление слишком больших значений может увеличить нагрузку на сервер.

Если вы не можете найти файл httpd.conf, запустите следующую команду в командной строке:

Вариант 3 — Включение Keep-Alive в NGINX

В NGINX, Keep-Alive по умолчанию обычно включен. Однако в некоторых случаях он может быть выключен. Вы можете включить его используя HttpCoreModule. Найдите значение keepalive_disable, которое в большинстве случаев является причиной его отключения. Перед внесением каких-либо изменений убедитесь, что узнали причину по которой он был отключен.

Вариант 4 — Сервер Windows (IIS)

Если вы используете сервер на базе Windows, вы можете легко включить режим Keep-Alive используя командную строку.

Данная команда включит режим Keep-Alive:

На случай если вы захотите его отключить используйте эту:

Вы также можете обратиться к официальному руководству от Microsoft на эту тему.

Шаг 3 — Проверка изменений

После того, как режим Keep-Alive полностью включен, запустите еще один анализ в GTMetrix или любом другом сайте по анализу производительности. Вот результаты тестового сайта после включения режима Keep-Alive:

Также можно узнать работает ли Keep-Alive проверив header вашего HTTP. Это может быть сделано через терминал, используя следующую команду:

Часть кода Connection: keep-alive означает, что режим Keep-Alive полностью функционирует.

Заключение

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

Имеет ли TCP-сокет соединение «keep alive»?

Я слышал о HTTP keep-alive, но сейчас я хочу открыть соединение сокета с удаленным сервером.
Теперь это соединение сокета останется открытым навсегда или есть ограничение времени ожидания, связанное с ним, подобное HTTP keep-alive?

TCP сокеты остаются открытыми, пока они не будут закрыты.

тем не менее, очень сложно обнаружить сломанное соединение (сломанное, как в маршрутизаторе, и т. д., а не закрытое) без фактической отправки данных, поэтому большинство приложений делают какую-то реакцию пинг-понга так часто, чтобы убедиться, что соединение все еще на самом деле живо.

теперь это соединение сокета останется открытым навсегда или есть ограничение времени ожидания, связанное с ним, подобное HTTP keep-alive?

короткий ответ:да, есть тайм-аут, и он применяется через TCP Keep-Alive.

если вы хотите настроить таймаут Keep-Alive, см. раздел «изменение таймаутов TCP» ниже.

TCP-соединения состоят из двух розеток, одна на каждом конце соединения. Когда одна сторона хочет прекратить соединение, она отправляет RST пакет, который другая сторона признает, и оба закрывают свои сокеты.

Читать еще:  Нету панели управления Nvidia что делать

пока это не произойдет, однако, обе стороны будут держать свое гнездо открытым неопределенно долго. Это оставляет открытой возможность того, что одна сторона может закрыть свой сокет, намеренно или из-за некоторой ошибки, не сообщая другому концу через RST . Для обнаружения этого сценария и закрытия устаревших соединений Используется процесс TCP Keep Alive.

Keep-Alive Process

есть три настраиваемых свойства, которые определяют, как Keep-Alives работают. В Linux они 1 :

  • tcp_keepalive_time
    • по умолчанию 7200 секунд
  • tcp_keepalive_probes
    • по умолчанию 9
  • tcp_keepalive_intvl
    • по умолчанию 75 секунды!—57—>

процесс работает следующим образом:

  1. клиент открывает TCP-соединение
  2. если соединение молчит для tcp_keepalive_time секунд, отправить один пустой ACK пакета. 1
  3. ответил ли сервер соответствующим ACK самостоятельно?
    • нет
      1. ждать tcp_keepalive_intvl секунд, затем отправить еще ACK
      2. повторить пока число ACK зонды, которые были отправлены, равны tcp_keepalive_probes .
      3. если на данный момент ответа не получено, отправьте RST и прекратить связь.
    • да: вернуться к Шагу 2

этот процесс включен по умолчанию в большинстве операционных систем, и поэтому мертвые TCP-соединения регулярно обрезаются, как только другой конец не отвечает в течение 2 часов 11 минут (7200 секунд + 75 * 9 секунд).

2 Часа По Умолчанию

поскольку процесс не запускается, пока соединение не простаивает в течение двух часов по умолчанию, устаревшие TCP-соединения могут задерживаться очень долго, прежде чем быть обрезаны. Это может быть особенно опасно для дорогих соединений, таких как соединения с базой данных.

Keep-Alive является необязательным

по данным RFC 1122 4.2.3.6, отвечая на и/или ретрансляцию TCP Keep-Alive пакеты необязательно:

разработчики могут включать «keep-alives» в свои реализации TCP, хотя эта практика не является общепринятой. Если keep-alives в комплекте, приложение должно быть в состоянии включить или выключить их для каждого TCP-соединение, и они должны по умолчанию отключены.

крайне важно помнить, что сегменты ACK, не содержащие данных, не являются надежно передается по протоколу TCP.

рассуждение заключается в том, что пакеты Keep-Alive не содержат данных и не являются строго необходимыми и рискуют засорить трубки паутины, если они используются.

однако на практике, мой опыт был в том, что эта проблема со временем уменьшилась, поскольку пропускная способность стала дешевле; и, таким образом, пакеты Keep-Alive обычно не отбрасываются. документация Amazon EC2 например, дает косвенное одобрение Keep-Alive, поэтому, если вы размещаете с AWS, вы, вероятно, безопасно полагаетесь на Keep-Alive, но ваш пробег может отличаться.

изменение таймаутов TCP

За Исполнение

к сожалению, поскольку TCP-соединения управляются на уровне ОС, Java не поддерживает настройку таймаутов на уровне сокета, например в java.net.Socket . Я нашел несколько попыток 3 использовать собственный интерфейс Java (JNI) для создания сокетов Java, вызывающих собственный код для настройки эти варианты, но ни один из них, по-видимому, не имеет широкого принятия или поддержки сообщества.

вместо этого, вы можете быть вынуждены применить конфигурацию операционной системы в целом. Имейте в виду, что эта конфигурация повлияет на все TCP-соединения, запущенные во всей системе.

текущие настройки TCP Keep-Alive можно найти в

  • /proc/sys/net/ipv4/tcp_keepalive_time
  • /proc/sys/net/ipv4/tcp_keepalive_probes
  • /proc/sys/net/ipv4/tcp_keepalive_intvl

вы можете обновить любой из них так:

такие изменения не будут сохраняться при перезапуске. Чтобы внести постоянные изменения, используйте sysctl :

текущие настройки можно просмотреть с помощью sysctl :

обратите внимание, Mac OS X определяет keepidle и keepintvl в единицах МС в отличие от Linux, который использует секунды.

свойства можно задать с помощью sysctl который сохранит эти настройки при перезагрузке:

кроме того, вы можете добавлять их в /etc/sysctl.conf (создает файл, если он не существует).

у меня нет машины Windows для подтверждения, но вы должны найти соответствующие настройки TCP Keep-Alive в реестре at

1. См. man tcp для получения дополнительной информации.

2. Этот пакет часто называют пакетом» Keep-Alive», но в спецификации TCP это просто обычный ACK пакета. Такие приложения, как Wireshark, могут маркировать его как пакет» Keep-Alive » путем метаанализа последовательности и номеров подтверждения, которые он содержит в ссылка на предыдущие сообщения в сокете.

3. Некоторые примеры, которые я нашел в базовом поиске Google, -lucwilliams / JavaLinuxNet и flonatel/libdontdie.

вы ищете опцию сокета SO_KEEPALIVE.

на API сокета Java предоставляет» keep-alive » для приложений через setKeepAlive и getKeepAlive методы.

EDIT: SO_KEEPALIVE реализован в стеках сетевых протоколов ОС без отправки каких-либо» реальных » данных. Интервал keep-alive зависит от операционной системы и может быть настроен через параметр ядра.

поскольку данные не отправляются, SO_KEEPALIVE может только проверить живучесть сетевое подключение, а не живость службы, к которой подключен сокет. Чтобы проверить последнее, вам нужно реализовать то, что включает отправку сообщений на сервер и получение ответа.

TCP keepalive и HTTP keepalive — очень разные понятия. В TCP keepalive-это административный пакет, отправленный для обнаружения устаревшего соединения. В HTTP keepalive означает постоянное состояние соединения.

Это из спецификации TCP,

пакеты Keep-alive должны быть отправлены только тогда, когда никакие данные или пакеты подтверждения не были получены для соединения в течение интервала. Этот интервал должен быть конфигурируемым и иметь значение по умолчанию не менее двух несколько часов.

Как вы можете видеть, интервал TCP keepalive по умолчанию слишком длинный для большинства приложений. Возможно, вам придется добавить активности в свой протокол.

Если вы находитесь за маскирующимся NAT (как и большинство домашних пользователей в эти дни), существует ограниченный пул внешних портов, и они должны быть разделены между TCP-соединениями. Поэтому маскирующиеся NATs склонны предполагать, что соединение было прервано, если данные не были отправлены в течение определенного периода времени.

Это и другие подобные проблемы (в любом месте между двумя конечными точками) могут означать, что соединение больше не будет «работать», если вы попытаетесь отправить данные после разумного периода простоя. Тем не менее, вы не можете обнаружить это, пока вы попробовать для отправки данных.

использование keepalives оба уменьшается вероятность того, что соединение будет прервано где-то по линии, а также позволяет узнать о сломанном соединении раньше.

вот некоторая дополнительная литература по keepalive, которая объясняет это гораздо более подробно.

поскольку Java не позволяет вам контролировать фактическое время keepalive, вы можете использовать примеры для их изменения, если вы используете ядро Linux (или ОС на основе proc).

Использование KEEPALIVE-сокетов для обнаружения и отключения зависших клиентских соединений InterBase и Firebird

Овчинников Василий, 17.05.2005, изменено – 06.09.2005.

В системах, предназначенных для работы в реальном времени или близком к нему, существует проблема отслеживания на серверной стороне состояния клиентских соединений и принятия мер для их принудительного отключения в случае недоступности клиента вследствие разрыва соединения. Особенно при использовании Classic Firebird SQL Server важно своевременно освобождать ресурсы, занимаемые такими фантомными соединениями.

Если имеются пользователи, подключающиеся к серверу через модемы, то достаточно велика вероятность обрыва модемного соединения в самый неподходящий момент.

Например, клиент сохраняет измененный набор записей. После выполнения UPDATE, но до выполнения COMMIT модемное соединение разрывается. Обычно клиентское приложение в такой ситуации восстанавливает соединение с сервером, но клиент, продолжая работу с теми же данными, при сохранении которых он получил сообщение об ошибке по причине разрыва соединения, не может сохранить свои изменения, получая со стороны сервера сообщение о конфликте блокировки. Ему мешает его предыдущее соединение, открывшее транзакцию, в контексте которой был выполнен UPDATE, но не был выполнен COMMIT, т. к. соединение со стороны клиента было разорвано.

Точно так же обрывы соединений могут возникать и в локальной сети, если сбоит оборудование – сетевые карты, хабы, коммутаторы – или возникают помехи. В interbase.log/firebird.log обрывы коннектов tcp показываются как ошибки 10054 (Windows. на Unix – 104), обрывы netbeui – как ошибки 108/109.

Для отслеживания и отключения таких «мертвых» соединений InterBase и Firebird использует один из двух механизмов – DUMMY-пакеты (реализован на прикладном уровне начиная с InterBase 5.0 между сервером InterBase/ Firebird и клиентской библиотекой gds32/fbclient, включается в ibconfig/firebird.conf и в данном документе рассматриваться не будет) и KEEPALIVE-сокеты (используется по умолчанию начиная с InterBase 6.0). Использование KEEPALIVE включается установкой опции сокета SO_ KEEPALIVE при его открытии. Вам не нужно специально заботиться об этом, если вы используете Firebird 1.5 или выше – это реализовано в программном коде сервера Firebird, как для Classic, так и для Superserver. Для InterBase и Firebird (младше 1.5) в варианте Classic (существуют только для Unix/ Linux) необходима дополнительная настройка (см. п. 3). В этом случае отслеживание состояния соединения возлагается не на сервер Firebird, а на стек TCP операционной системы. Однако для практического использования требуется настройка параметров KEEPALIVE.

Описание KEEPALIVE

Стек TCP отслеживает момент прекращения прохождения пакетов между клиентом и сервером, запуская таймер KEEPALIVE. Как только таймер достигнет величины KEEPALIVE_ TIME, стек TCP сервера выполняет первую пробу KEEPALIVE. Проба – это пустой пакет c флагом ACK, отправляемый клиенту. Если на стороне клиента все в порядке, то стек TCP на клиентской стороне посылает ответный пакет с флагом ACK и стек TCP сервера, получив ответ, сбрасывает таймер KEEPALIVE. Если клиент не отвечает на пробу, то пробы со стороны сервера продолжают выполняться. Их количество равно KEEPALIVE_ PROBES и выполняются они через интервал времени KEEPALIVE_ INTERVAL. Если клиент не ответил на последнюю пробу, то по истечении еще одного интервала времени KEEPALIVE_ INTERVAL стек TCP операционной системы сервера закрывает соединение и Firebird высвобождает все ресурсы, занимаемые обслуживанием данного соединения.

Читать еще:  Ctrl w что делает

Таким образом, разорванное клиентское соединение будет закрыто по истечении времени KEEPALIVE_ TIME+ ( KEEPALIVE_ PROBES+1)* KEEPALIVE_ INTERVAL.

Значения параметров по умолчанию достаточно велики, что делает их практическое применение неэффективным. Параметр KEEPALIVE_ TIME, например, имеет значение по умолчанию 2 часа и в Linux и в Windows. Реально достаточно одной-двух минут для принятия решения о принудительном отключении недоступного клиента. С другой стороны, настройки KEEPALIVE по умолчанию иногда приводят к принудительному обрыву соединений в сетях Windows, которые неактивны в течение этих самых двух часов (сомнения по поводу необходимости наличия в приложениях таких соединений – это уже другой вопрос).

Ниже мы рассмотрим настройку этих параметров для операционных систем семейства Windows и операционной системы Linux.

Настройка KEEPAILVE в Linux

Параметры KEEPALIVE в Linux можно изменить либо прямым редактированием файловой системы / proc либо вызовами sysctl.

Для первого случая надо редактировать:

Время задается в секундах.

Для автоматической установки этих параметров в случае перезагрузки сервера добавьте в /etc/sysctl.conf:

Слово замените на нужные вам величины.

Если вы используете Firebird Classic ранее версии 1.5, то в /etc/xinet.d/firebird пропишите следующее:

Настройка KEEPALIVE в Windows 95/98/ME

Параметры:

  • KeepAliveTime = миллисекунды
  • KeepAliveInterval = 32-значное число
  • MaxDataRetries = 32-значное число

Настройка KEEPALIVE в Windows 2000/NT/XP

Настройка KEEPALIVE в Windows (для клиентов)

параметр DisableDHCPMediaSense=1. См. описание данного параметра здесь: http://support.microsoft.com/?scid =kb%3Bru%3B239924&x=13&y=14.

Рассмотрим пример настройки Firebird SQL Server 1.5.2 CS под ОС Linux:

  • Убедимся, что в firebird.conf отключен механизм DUMMY-пакетов (параметр закомментирован)
  • Убедимся в наличии конфигурационного файла /etc/xinet.d/firebird
  • Изменяем параметры стека TCP
  • Устанавливаем соединение к любой базе данных на сервере с любого сетевого клиента.
  • Смотрим трафик на сервере используя любой фильтр пакетов.
  • Если клиента отключить физически (выключить коммутатор или модем – мало ли, что может случиться в действительности), то на пробу сервера ответ от клиента не приходит, и сервер начинает с 10-ти секундным интервалом посылать пробы. Если на пятую пробу клиент не ответил, то еще через 10 секунд серверный процесс выгружается, освобождая ресурсы и блокировки. Если клиент подал признаки жизни и откликнулся хотя бы и на пятую пробу (худший случай), то снова выдерживается 15-сек тайм-аут и опять начинаются пробы. И т. д.

Заключение

В заключение хотелось бы привести практические рекомендации по выбору величин параметров KEEPALIVE.

Во-первых, определите для себя необходимую величину параметра KEEPALIVE_TIME. Чем больше будет его значение, тем позже начнутся KEEPALIVE-пробы. Если вы постоянно наблюдаете на своем сервере множество зависших коннектов, и вам приходится их удалять вручную, то следует уменьшить величину KEEPALIVE_TIME.

Во-вторых, значения параметров KEEPALIVE_INTERVAL и KEEPALIVE_PROBES должны удовлетворять вашим требованиям по своевременному отключению уже обнаруженных системой зависших соединений. Если ваши пользователи устанавливают соединения с сервером через ненадежные каналы связи, то вам, возможно, захочется увеличить количество проб и интервал между ними для того, чтобы пользователь успел обнаружить обрыв и восстановить соединение с сервером. В случае, если клиентоы используют выделенное подключение к сетям общего пользования (Интернет) или используют доступ к SQL-серверу по локальной сети, возможно уменьшение количества и интервала между KEEPALIVE-пробами.

Общие рекомендации могут звучать так: если вы на практике получаете большое количество сообщений от клиентов об ошибках сохранения результатов работы по причине конфликта блокировки без видимых на то причин, т. е. при отсутствии конкурирующих соединений, работающих с теми же данными, то вам надо увеличивать реакцию системы на отключение зависших коннектов. Практически величина KEEPALIVE_TIME может составлять от 1 минуты и более – вы сами должны оценить время выполнения самой длительной транзакции в системе, чтобы не перегружать сетевой трафик KEEPALIVE-проверками нормально работающих соединений, запустивших длительные транзакции. Величина KEEPALIVE_INTERVAL – от 10 секунд и более, а величина KEEPALIVE_PROBES – от 5 проверок и более. Помните, что большое количество проверок и малый интервал между ними могут существенно увеличить сетевой трафик при большом количестве одновременно работающих пользователей.

Также помните, что в случае, если ваши пользователи активно работают по изменению общих данных, ошибки блокировки будут возникать как следствие штатной ситуации. В этом случае вам потребуетсякак корректная обработка ошибок блокировки в клиентских приложениях и само приложение должно быть спроектировано так, чтобы минимизировать появление таких ошибок.

И, наконец, еще несколько примеров общих конфигураций. Под временем простоя будем подразумевать время, в течение которого пользователи не смогут обновить данные, обновление которых начато транзакцией, открытой зависшим соединением. Итоговое время – это время, по истечении которого зависшее соединение будет закрыто.

  • Клиенты используют модемные соединения, в системе преобладают короткие транзакции, время простоя ограничено 3 минутами.

Определение разрыва TCP-соединения


Автор: Андрей Елсуков
Источник: RSDN Magazine #1-2004

Опубликовано: 03.10.2004
Исправлено: 10.12.2016
Версия текста: 1.0

Протокол TCP, в отличие от UDP, осуществляет доставку дейтаграмм, называемых сегментами, в виде байтовых потоков с установлением соединения. TCP применяется в тех случаях, когда требуется гарантированная доставка сообщений. Он использует контрольные суммы пакетов для проверки их целостности, контролирует последовательность передаваемых данных и избавляет программиста от многих рутинных задач. В качестве примеров прикладных протоколов, использующих TCP, можно назвать протокол FTP, HTTP, SMTP и многие другие.

В данной статье речь будет идти о реализациях стека TCP/IP в Microsoft Windows NT/2000/XP и более поздних версиях, а также реализации Windows Sockets версии 2 и более поздних.

Будучи однажды создан, канал TCP может существовать «вечно». Если клиент и сервер пассивны, то при разрыве соединения, например, при проблемах со средой передачи, сетевой атаке, крахе сервера или клиента, участники соединения (либо один из них) не подозревают о возникших проблемах. Конечно, проблема рано или поздно будет выявлена — когда клиент или сервер попытаются послать какую-то информацию.

В архитектуре клиент-сервер довольно часто встречаются реализации, в которых клиент, отправив запрос на сервер, долгое время ожидает ответа сервера. Еще более актуальная ситуация — в реализациях TCP-сервера необходимо точно знать, сколько из соединившихся клиентов реально существуют. Многие из прикладных протоколов применяют для этого «пустую операцию» (NOP), которая время от времени производится между клиентом и сервером для проверки наличия соединения. Данный подход хорош тем, что он не зависит от реализации стека TCP/IP. Есть и другой метод – таймер контроля работоспособности (keep-alive).

Таймер keep-alive

Принцип работы этого таймера предельно прост. Если канал между клиентом и сервером пассивен некоторое время (по умолчанию 2 часа), то посылается служебное сообщение, если ответа на него не поступило, через 75 секунд (обычно) сообщение посылается повторно и так несколько раз. Если ответ получен – таймер сбрасывается, и отчёт начинается заново. Если после нескольких повторов ответа так и не поступило, то соединение разрывается. Число повторов зависит от реализации стека TCP/IP, в некоторых реализациях может изменяться, в некоторых – нет…

При использовании сокетов в Windows keep-alive сообщения по умолчанию выключены. Включить их можно с помощью функции setsockopt:

В качестве параметров в функцию передаются:

  • s – дескриптор сокета, с которым будет связано соединение;
  • level – уровень, для которого определена требуемая опция (SOL_SOCKET, IPPROTO_TCP,…);
  • optname – опция, значение которой нужно изменить;
  • optval – указатель на буфер со значением опции;
  • optlen– размер буфера optval в байтах.

Для включения/выключения посылки keep-alive используется опция SO_KEEPALIVE уровня SOL_SOCKET. Параметр optval интерпретируется функцией как булево значение, для включения посылки он должен иметь значение TRUE, иначе – FALSE.

На практике нет никакого смысла ждать 2 часа до посылки keep-alive сообщения, куда интереснее более реальные интервалы времени (несколько десятков секунд или минут). Для изменения этого интервала в Winsock2 предусмотрена функция WSAIoctl:

В качестве параметров в функцию передаются:

  • s – дескриптор сокета, с которым будет связано соединение;
  • dwIoControlCode – код выполняемой операции;
  • lpvInBuffer – указатель на входной буфер;
  • cbInBuffer – размер входного буфера в байтах;
  • lpvOutBuffer – указатель на выходной буфер;
  • cbOutBuffer – размер выходного буфера;
  • lpcbBytesReturned – указатель на число байт, которые реально возвращены;
  • lpOverlapped – указатель на структуру WSAOVERLAPPED;
  • lpCompletionRoutine – указатель на функцию завершения операции;

Для изменения интервалов времени нужно передать функции структуру tcp_keepalive с кодом операции SIO_KEEPALIVE_VALS, которые определены в заголовочном файле mstcpip.h.

Поле onoff отвечает за включение/выключение посылки keep-alive сообщений. Если его значение отлично от нуля – посылка будет осуществляться, иначе — нет. Поле keepalivetime определяет интервал между посылкой сообщений при пассивном состоянии канала. Поле keepaliveinterval определяет интервал посылки сообщений, если ответ не получен. Интервалы задаются в миллисекундах. Значения интервалов имеют силу только в пределах соединения, связанного с сокетом s.

Заключение

В MSDN очень скупо описано все, что связано с keep-alive. После практических испытаний я обнаружил, что функция WSAIoctl перекрывает действие setsockopt. Точнее, действие setsockopt мною не проверено, потому как ждать 2 часа у меня терпения не хватает. А вызов setsockopt после WSAIoctl ни к чему не приводит. Если кто-то осведомлён о работе этих функций больше меня, буду рад выслушать пояснения.

Для проверки работы keep-alive я написал простенькую программку, которая соединяется с 21-м портом по заданному адресу. Интервал посылки keep-alive сообщений устанавливается равным 10 секундам, с повтором через 1 секунду. Далее я пользовался анализатором трафика и пакетным фильтром. С помощью пакетного фильтра создал ситуацию потери связи с сервером, в результате которой после нескольких безответных посылок keep-alive возникает событие FD_CLOSE.

Исходник проекта (MSVC 7.0) прилагается в архиве.

Ссылка на основную публикацию
Adblock
detector