Материал из Tkabber Wiki
Содержание
- 1 Место и роль DNS в процессе соединения с сервером
- 2 Первая проблема: "TCP vs UDP"
- 3 Вторая проблема: UDP блокируется файрволом
- 4 Ручное разрешение записей DNS
Место и роль DNS в процессе соединения с сервером
Согласно RFC #3920, Ткаббер начинает
долгую дорогу в дюнах своего соединения, пытаясь выполнить
SRV-запрос к DNS. Запрос этот служит,
чтобы выяснить, какой именно компьютер обслуживает XMPP-домен, в котором вы
владеете учётной записью. Другими словами, jabber.ru
в JID'е
vasya@jabber.ru
означает не сервер, а домен. Сервер может иметь совершенно
другое имя в DNS, и самих серверов у домена может быть несколько (у jabber.ru,
например, их два).
Далее Ткабберу может понадобиться выполнить ещё минимум один запрос, чтобы разрешить полученное на первом этапе имя сервера в его IP-адрес.
Здесь могут возникнуть две проблемы:
Первая проблема: "TCP vs UDP"
DNS-запросы чаще всего выполняются при помощи протокола UDP, который не поддерживается интерпретатором Tcl непосредственно. Поддержка UDP реализована несколькими расширениями Tcl (о которых — ниже), и Ткаббер пытается найти и загрузить их при старте; если это ему удалось, запросы к DNS производятся при помощи UDP, в противном случае — при помощи TCP.
Проблема состоит в том, что хотя запросы к DNS с использованием TCP не противоречат стандарту на DNS, весьма многие провайдеры интернета запрещают такие запросы на своих серверах. Более того — обычно сетевой порт для таких запросов закрывается файрволом, и делается это таким образом, что при попытке TCP-соединения на этот порт сервер вместо посылки ответного пакета со специальным уведомлением "соединение невозможно" молча "душит" пакет с запросом на соединение. В результате Ткаббер выжидает прибытия ответного пакета в течение полного таймаута, определённого протоколом TCP/IP (который весьма высок), что и выглядит как "подвисание".
У такой проблемы два решения:
Поставьте одно из расширений Tcl, добавляющее поддержку UDP. Ими являются ceptcl и tcludp.
Заставьте Ткаббер обходиться вообще без запросов к DNS. Этого можно достичь, явно указав IP-адрес сервера. Это делается, например, настройкой Явно указать адрес и порт для подключения, доступной на вкладке Соединение диалога логина. Однако, чтобы узнать этот адрес (и порт) потребуется проявить некоторую смекалку и поработать руками. Рычаги к действию описаны ниже.
Пример решения проблемы с помощью пакета tcludp на дистрибутиве Arch Linux: качаем исходники, распаковываем и устанавливаем пакет (подробная инструкция по установке находится в файле readme архива с исходниками). После этого запускаем tkabber и пробуем соединиться с сервером.
Вторая проблема: UDP блокируется файрволом
Данная проблема, насколько нам известно, существует только в Windows, возникает при установленном расширении tcludp и состоит в следующем:
- tcludp пользуется услугами стандартной службы Windows "DNS-клиент". Служба эта, как и большинство других, реализована в виде динамически загружаемой библиотеки (DLL). Эта библиотека работает внутри специального системного процесса svchost.exe;
- Когда Ткаббер осуществляет запрос к DNS, используя протокол UDP, реальный пакет посылает та самая DLL, что выглядит с точки зрения системы как активность процесса svchost.exe.
- Добавьте сюда параноидальную настройку локального файрвола (которая, к примеру, обычно имеет место быть у пользователей Agnitum Outpost Firewall), запрещающую упомянутому процессу svchost.exe работу с сетью, — и вы получаете проблему "подвисающий Ткаббер" другим способом!
Решение этой проблемы состоит, очевидно, как в более взвешенном отношении к настройкам файрвола, так и к запросам, которые он выдаёт, обнаружив сетевую активность неизвестной ему доселе программы.
Ручное разрешение записей DNS
В Windows средством для ручного общения с DNS-серверами, доступным "из коробки", является утилита командной строки nslookup, в Unix это dig и host. Синтаксис передачи параметров этих утилит отличается, ниже мы приведём конкретные примеры их использования.
A-записи
Записи типа A связывают имена конкретных компьютеров в сети с их IP-адресами. Это — "самый главный" тип записей в DNS, поэтому обычно он подразумевается утилитами работы с DNS. Для примера узнаем IP-адрес машины, на которой работает web-сервер, обслуживающий сайт www.jabber.ru:
C:\>nslookup www.jabber.ru
Server: alpha.dom.lan
Address: 10.1.1.223
Non-authoritative answer:
Name: yo.jabber.ru
Address: 213.248.55.180
Aliases: www.jabber.ru
Из вывода nslookup следует, что www.jabber.ru
— это "альяс" (альтернативное
имя) компьютера yo.jabber.ru
, и он имеет IP-адрес 213.248.55.180. Заодно
nslookup показала, какой именно DNS-сервер обслужил наш запрос.