# Диагностика сервера Встроена в боковую панель Core в порядке Плагины → Диагностика сервера → Hash & Checksum. Не требует сеанса SSH или загруженного плагина. Весь код среды выполнения, тесты и тестовые данные находятся в `app/`; модуль не зависит от соседних репозиториев. В репозитории нет `doc.md`, поэтому реализацию описывают этот документ и оба README. ## Порядок работы Введите имя хоста, IPv4, IPv6 или URL HTTP(S)/WS(S). Для одиночных имен хостов/IP-адресов по умолчанию используется HTTPS; явно заданные URL сохраняют при запросе путь, параметры и порт. Учетные данные в URL, неподдерживаемые схемы, пробелы/управляющие символы и имена хостов, похожие на команды оболочки, отклоняются. Литералы IPv6 автоматически заключаются в квадратные скобки; идентификаторы зон для scoped/link-local адресов парсер URL не поддерживает. Выберите Авто (предпочтение IPv4, иначе IPv6), IPv4, IPv6 или Оба. Разрешив адреса, можно выбрать конкретный текущий ответ. Обзор показывает все разрешенные ответы; пробы проверяют выбранный адрес или по одному адресу каждого запрошенного семейства. Оба семейства измеряются независимо. Само наличие AAAA никогда не означает работающую связь по IPv6. Запуск диагностики выполняет DNS, ping, traceroute, HTTP, сжатие, TLS и выбранные порты TCP. WebSocket включается явно. У каждого инструмента также есть собственная кнопка Запустить/Остановить. Одновременно может выполняться только один диагностический прогон. Завершенный прогон означает, что инструменты закончили работу, а не что каждая проба была успешной. Общего вердикта «сервер недоступен» нет. Настраиваются тайм-аут, число пакетов, повторы, максимальное число переходов, резолвер DNS, выбор протоколов, теплое соединение и сравнение HTTP/HTTPS. Смена цели сбрасывает ранее выбранный IP-адрес. История позволяет заново открыть отчет, сравнить два отчета, удалить, импортировать JSON, скопировать или экспортировать JSON/CSV/TXT через нативные диалоги Core. Светлая/темная/системная тема применяется к разделу диагностики и сохраняется в существующей конфигурации UI. CZ/DE/EN сразу следует языку приложения. ## Компоненты и поведение протоколов | Компонент | Реализация и интерпретация | | --- | --- | | `common.js` | Проверяет цели/параметры, ограничения и перечисляемые значения; преобразование IDNA; числовая статистика исключает неизвестные значения. | | `dnsDiagnostics.js` | Системное разрешение адресов использует `dns.lookup`, чтобы учитывать конфигурацию ОС и файлы hosts. Запросы записей используют ограниченный UDP DNS с резервным переходом на TCP для усеченных ответов к `dns.getServers()` или к явно выбранному собственному/публичному резолверу. Неявного перехода на публичный DNS нет. | | `processTools.js` | Запускает системные ping/traceroute с массивом аргументов и `shell: false`, ограниченным выводом, явным тайм-аутом и очисткой при прерывании/завершении. Разбирает ответы пакетов и переходы, а не считает длительность процесса значением RTT. | | `httpDiagnostics.js` | Встроенный curl для HTTP/1.1, HTTP/2 и HTTP/3; строгая проверка сертификатов и закрепленное семейство IP. Каждая версия запрашивается независимо; фиксируется фактическая версия. | | `socketDiagnostics.js` | Явные пробы версий TLS, ограниченные подключения TCP/пассивные баннеры, наблюдение ключа хоста SSH до аутентификации с помощью существующей зависимости ssh2 и необязательная проверка Upgrade по RFC 6455. | | `diagnosticsService.js` | Запускает и отменяет инструменты, выбирает/проверяет адреса, передает ход выполнения, сохраняет частичные измерения и управляет сроком прогона. | | `historyStore.js` | Версионированная ограниченная локальная история, скрытие данных, импорт с проверкой схемы и экспорт измеренных данных. | ### ICMP и маршруты По умолчанию ping выполняет четыре отдельно запускаемых запроса ICMP echo. Результаты содержат измеренное RTT каждого пакета, число полученных/отправленных, потери, мин/среднее/макс, стандартное отклонение генеральной совокупности, среднюю абсолютную разницу между последовательными измеренными RTT (джиттер), TTL/Hop Limit, если он выводится, и отметки времени. Ответ `<1 ms` считается полученным с верхней границей, а не выдуманным числовым RTT. Неизвестные RTT исключаются из статистики задержки. Статистика использует сохраняемое окно не более чем из 500 пакетов; счетчики отправленных/полученных/потерянных охватывают весь прогон. Графики показывают последние 200 наблюдений с разными символами для ответов, ответов ниже разрешения, отсутствующих ответов и явных тайм-аутов запроса/процесса. Отсутствие ответа может означать фильтрацию ICMP, потерю пакетов или тайм-аут; по таким наблюдениям нельзя однозначно определить межсетевой экран. Отсутствующие исполняемые файлы, локальные ошибки прав и некорректные вызовы инструментов — это отдельные ошибки инструмента, а не потеря пакетов или недоступность сервера. Повышение прав не запрашивается. Traceroute передает по ходу работы переходы, адреса, отдельные пробы, средние значения и наблюдаемую долю проб без ответа. Обратный DNS разрешается после построения маршрута с помощью выбранного резолвера. Повторы сравнивают наблюдаемые последовательности адресов переходов; различия могут объясняться балансировкой нагрузки. Промежуточные переходы без ответа не доказывают обрыв маршрута. Исходные метаданные проб и метод отображаются в раскрываемых подробностях. macOS требует для traceroute ожидания в целых секундах; фактический округленный тайм-аут фиксируется. ### DNS Двенадцать типов записей: A, AAAA, CNAME, MX, NS, TXT, SOA, SRV, CAA, PTR, DS и DNSKEY. Разбор формата DNS проверяет идентичность транзакции/вопроса, размеры записей, циклы указателей сжатия и ограничения сообщений. Ответы сохраняют TTL записей, время запроса, резолвер и состояния NXDOMAIN/NODATA/SERVFAIL/refused/timeout. Системный поиск адресов не может предоставить TTL; отдельный запрос записи может. Следование по CNAME ограничено восемью ссылками с обнаружением циклов. Проверка согласованности повторяет ответы A/AAAA выбранного резолвера и для DNS-тестов IP-литералов выполняет PTR с прямым подтверждением. Изменившиеся ответы — это наблюдения, а не доказательство неисправности DNS. Запросы SRV используют имя цели в том виде, в котором оно введено; при необходимости укажите имя службы, например `_service._tcp.example.org`. DNSSEC всегда **не проверяется**. Наличие DS/DNSKEY и даже флаг AD резолвера никогда не считаются независимой проверкой. ### HTTP, производительность и сжатие HTTP/1.1 считает эту версию поддерживаемой, только если она действительно была возвращена. HTTPS HTTP/2 требует согласованного h2; никакой резервный вариант не переименовывается. Незашифрованный HTTP/2 использует prior knowledge, а не пробу HTTP/1.1 Upgrade. Проверка TLS остается строгой для каждого запроса HTTP/WebSocket. Ручные перенаправления ограничены восемью; циклы, недопустимые цели и чрезмерные перенаправления явно завершаются ошибкой. Полная цепочка фиксирует смену доменов и понижение с HTTPS; изменения схемы и www видны в исходных/целевых URL. Учетные данные и схемы перенаправления, отличные от HTTP(S), отклоняются. Каждое перенаправление на другой хост разрешается независимо через выбранный резолвер и запрошенное семейство IP. Измерения включают DNS (если выполнялся), TCP, TLS, TTFB итогового ответа, общий TTFB с учетом DNS/перенаправлений, загрузку, перенаправления и общее фактическое время, фактические байты тела, скорость передачи, статус, заголовки ответа, фактический адрес/порт сервера, ALPN и проверенное повторное использование соединения. Фазы DNS/TCP/TLS, не выполнявшиеся на закрепленном или повторно используемом соединении, обозначаются `N/A`, а не фальшивыми нулями. У QUIC нет фазы TCP; его рукопожатие фиксируется отдельно. Передача заголовков или полные накладные расходы на линии не выдаются за измерение байтов тела. Это время сервера/сети, а не отрисовка страницы или оценки Lighthouse. Каждый выбранный протокол использует одну и ту же цель и повторы. IPv4/IPv6 и HTTP/HTTPS — явные варианты сравнения. Альтернативная схема использует свой порт по умолчанию. Каждый протокол запускает для каждого измерения независимый процесс встроенного клиента. Повторное использование соединения не заявляется. Статистика общего времени включает мин/среднее/медиану/макс/P95 методом ближайшего ранга и отдельную долю ошибок транспорта/протокола; коды статуса HTTP остаются видимыми, даже если сервер успешно возвращает ответ 4xx/5xx. Проверка сжатия отправляет identity, gzip, deflate, br и (если среда выполнения поддерживает) zstd как отдельные запросы Accept-Encoding. Content-Encoding должен совпадать, а ограниченная распаковка должна завершиться успешно. Коэффициент вычисляется, только если хеш декодированного тела, итоговый URL и статус совпадают с эталонным ответом identity. Игнорируемые кодировки считаются неподдерживаемыми; для меняющихся/динамических тел коэффициент не вычисляется. Это наблюдение для данного URL/статуса, а не общая поддержка сервером. Проверка заголовков безопасности показывает наличие и значение HSTS, CSP, X-Content-Type-Options, Referrer-Policy, Permissions-Policy и X-Frame-Options. Директива CSP frame-ancestors может заменять последний. Наличие заголовка не доказывает, что политика настроена правильно или что сайт безопасен. ### Требования к HTTP/3 и доказательство его работы HTTP/1.1, HTTP/2 и HTTP/3 используют один и тот же встроенный клиент curl. На macOS arm64 и Linux x64 используются curl 8.22.0, OpenSSL 3.5.9, nghttp2 1.70.0, ngtcp2 1.25.0 и nghttp3 1.18.0. Windows x64 использует официальную статическую сборку curl-for-win 8.22.0_3 с curl.se с LibreSSL 4.3.3 и теми же библиотеками HTTP. Не требуются ни резервный системный curl, ни загрузка во время работы, ни права администратора. Воспроизводимый рецепт сборки для Windows от разработчиков: https://github.com/curl/curl-for-win/tree/9d77e31e . Перед упаковкой выполните сборку командой `python3 scripts/native/build.py` (Windows: `python scripts/native/build.py`). Для macOS/Linux нужны инструменты C/C++, CMake, Ninja, Perl, make и pkg-config. Исходники закреплены по версии и исходному SHA-256 в `scripts/native/dependencies.lock.json`. Скрипт проверяет каждую загрузку, статически компонует сторонние транспортные библиотеки и завершается с ошибкой без функций HTTP2/HTTP3/SSL. Динамическими остаются только библиотеки операционной системы. Windows использует закрепленный официальный двоичный архив, а не локально скомпилированный транспортный стек Windows. Встроенный файл CA имеет собственный закрепленный хеш; лицензии компонентов и сведения о происхождении сборки прилагаются к среде выполнения. Клиент и хранилище доверенных сертификатов устанавливаются вне app.asar в `resources/native-runtime/-/`. Каждая диагностика перед использованием проверяет хеши компонентов, архитектуру и возможности исполняемого файла. Файлы конфигурации, прокси, переопределения доверия TLS из окружения и переменные для внедрения библиотек исключены. curl запускается по абсолютному пути, без оболочки, с проверенным доверием CA, явно заданным семейством разрешенного IP-адреса, без cookie, без автоматических перенаправлений и с ограничением вывода и времени. Перенаправления проверяет и заново разрешает приложение. Поддерживается HTTPS на портах, отличных от 443. HTTP/3 использует `--http3-only` и считается подтвержденным только после завершенной передачи, сообщающей HTTP версии 3, и успешной проверки сертификата. Протокол могут подтвердить и ответы HTTP с ошибкой, например 404. Alt-Svc — это объявление, а не доказательство. Тайм-аут QUIC, ошибка сертификата, ошибка DNS, отказ в соединении, несовместимый протокол и сбой компонента различаются. Тайм-аут UDP оставляет поддержку на сервере неподтвержденной. Время рукопожатия QUIC не выдается за время TCP. Каждое измерение запускает отдельный процесс/соединение. Опция «warm» для встроенного клиента не заявляет о повторном использовании соединения. Это сохраняет сопоставимость протоколов. Отчеты содержат версии среды выполнения, возможности, проверку TLS и время QUIC, а история и экспорт удаляют тела ответов, параметры запроса URL и заголовки аутентификации. При обновлении транспортного стека или хранилища доверенных сертификатов CA обновите эти закрепления и пересоберите все поддерживаемые платформы. Опубликованные артефакты и снимки исходников неизменяемы. ## IPC в Core Preload предоставляет только `window.chjCore.diagnostics`; все обработчики сохраняют существующую проверку отправителя на главное окно, а сетевая работа остается в главном процессе. Результаты имеют вид `{ ok: true, value }` или `{ ok: false, error: { code, message } }`. | Канал / метод preload | Данные / результат | | --- | --- | | `diagnostics:resolve` / `resolve(options)` | Проверенная цель/настройки → цель и разрешенные адреса. Не более двух одновременных запросов разрешения. | | `diagnostics:start` / `start(options)` | Проверенная цель/настройки/выбор инструментов → непрозрачный идентификатор задания и начальный отчет. | | `diagnostics:cancel` / `cancel(id, tool?)` | Отмена одного активного/ожидающего инструмента или всего прогона. | | `diagnostics:get` / `get(id)` | Снимок известного прогона или сохраненного отчета. | | `diagnostics:history` / `history()` | Сводки локальной истории. | | `diagnostics:removeHistory` / `removeHistory(id)` | Удаление выбранного элемента истории. | | `diagnostics:copy` / `copy(id, format)` | Главный процесс записывает известный отчет со скрытыми данными в буфер обмена. | | `diagnostics:export` / `export(id, format)` | JSON/CSV/TXT через нативный диалог сохранения; renderer не может задать путь в файловой системе. | | `diagnostics:import` / `import()` | Нативный выбор файла, проверка размера/схемы/глубины и скрытие данных перед сохранением. | | `diagnostics:progress` / `onProgress(callback)` | Разрешенные адреса, запуск/завершение инструментов, пакеты, переходы, измерения HTTP и завершение; возвращает функцию отписки. | Никакой общий API для оболочки, файловой системы или сети не предоставляется. Изоляция контекста, песочница, отключенная интеграция Node и существующая CSP renderer остаются включенными. Существующие контракты плагинов, а также проверки и исключения механизма обновления не изменились. ## Ограничения и локальные данные - Один прогон, два активных инструмента, не более двух проб по семействам IP на инструмент; TCP дополнительно ограничивает каждый адрес четырьмя соединениями. - Тайм-аут операции 250–30000 ms; 1–100 пакетов, 1–20 повторов, 1–40 переходов, 1–16 портов. Обычные прогоны останавливаются через пять минут, непрерывный ping — через тридцать минут. Подпроцесс traceroute дополнительно ограничен 180 секундами. - Вывод процесса обычно 256 KiB; тело HTTP 2 MiB; распакованное тело 8 MiB; заголовки HTTP ограничены; тела ответов в историю не попадают. - Хранится не более 500 пакетов/событий хода выполнения, пяти прогонов в памяти, тридцати отчетов истории и 10 MiB истории. История использует существующий закрытый атомарный механизм записи в `/diagnostics/history.json` (режим 0600). - Импорт — не более 2 MiB, схема 1, с ограниченной вложенностью и проверенными коллекциями результатов. Ячейки CSV экранируются, а префиксы формул нейтрализуются. Параметры/фрагменты URL, учетные данные, cookie, заголовки аутентификации и исходные тела исключаются из сохраненных/скопированных/экспортированных отчетов. Исходные подробности показывают измеренные структурированные данные, а не захват пакетов или сохраненное тело ответа. - Нет облачной синхронизации, автоматического входа, изменения конфигурации сервера и агрессивного/неограниченного сканирования. Цель/порты/резолвер пользователь выбирает явно. ## Требования к платформам и проверка | Платформа | ICMP | Маршрут | Другие протоколы | | --- | --- | --- | --- | | Windows 10/11 | `ping.exe -4/-6` | `tracert.exe -4/-6`, ICMP | Встроенный curl.exe с HTTP/2 и HTTP/3. Локализованные поля RTT не зависят от слова «time». | | macOS | `/sbin/ping`, `/sbin/ping6` | `/usr/sbin/traceroute`, `/usr/sbin/traceroute6`, UDP; ожидания в целых секундах | Встроенный curl с HTTP/2 и HTTP/3. | | Ubuntu/Linux | iputils `ping -4/-6` | стандартный `traceroute -4/-6`, UDP | Встроенный curl с HTTP/2 и HTTP/3; отсутствие инструментов ICMP/маршрутов сообщается отдельно. | Новые зависимости npm не добавлялись. Реализация использует встроенные модули Node и существующий в приложении ssh2. Она не устанавливает системные инструменты и не запрашивает права администратора. Межсетевые экраны и ограничения UDP могут помешать тесту подтвердить поддержку; по одному лишь тайм-ауту этого заключить нельзя. Автоматизированное покрытие находится в `diagnosticsCore.test.js`, `diagnosticsNetwork.test.js`, `diagnosticsHttp.test.js` и `diagnosticsIpc.test.js`: проверка/литералы IPv6, нативные/локальные тестовые серверы DNS UDP+TCP, отсутствующие ответы/ответы обоих семейств и ошибки резолвера, CNAME/согласованность, тестовые данные аргументов/разбора ОС, ограниченные реальные дочерние процессы, наблюдения заблокированного ICMP, реальные локальные HTTP/1.1 и TLS h2, перенаправления/ограничения тела/тайм-ауты/повторное использование, включенное/игнорируемое сжатие, возможности HTTP3/разбор успешного результата/отклонение резервного варианта, локальное доверие CA/несоответствие/истечение срока и реальные IPv6 HTTP/HTTPS, подключение TCP/отказ/имитация тайм-аута, реальные рукопожатия WebSocket и SSH до аутентификации, отмена/очистка/частичные результаты, офлайн-состояние, закрытая история (запись и чтение)/отклонение импорта/экспорт, доверенный IPC и подписки preload. `npm test` выполняет детерминированные тесты без публичных тестовых серверов. `npm run test:diagnostics:ui` запускает `scripts/smokeDiagnostics.js` в графическом рабочем столе Electron с рабочими UI/preload/IPC и реальными локальными пробами HTTP/сжатия. Посторонние службы заменены заглушками/отключены только в этой тестовой среде. Проверяются порядок навигации, результаты протоколов, сохранение, CZ/DE/EN, обе темы, переполнение в узком окне и настройки песочницы. Если оболочка задает ELECTRON_RUN_AS_NODE, удалите эту переменную для данной команды. Текущая проверка среды выполнения охватывает контролируемые передачи QUIC, IPv4/IPv6, HTTPS на нестандартном порту, ответы 404, ошибки TLS и службу только с TCP, объявляющую Alt-Svc. Результаты по каждой сборке прилагаются к каждому выпуску. Явные необязательные ограничения: нет независимой проверки DNSSEC (требуется полный жизненный цикл проверяющего резолвера/якоря доверия), нет аудита Lighthouse (только время сервера/сети), нет аудита устаревших версий TLS и службы отзыва/CT, нет заявления о теплом повторном использовании для HTTP3 и нет измерения теплого повторного использования для HTTP/3. Неподдерживаемые возможности отображаются, а не имитируются. ## Файлы в этом изменении Создано: семь файлов служб в `src/main/diagnostics/`; `src/renderer/diagnostics.js`, `diagnosticsI18n.js`, `diagnostics.css`; четыре файла `test/diagnostics*.test.js`; пять файлов в `test/fixtures/diagnostics/`; `scripts/smokeDiagnostics.js`; этот документ. Интегрировано/обновлено: `src/main/index.js`, `src/main/ipc/registerCoreIpc.js`, `src/preload/corePreload.js`, `src/renderer/index.html`, `app.js`, `i18n.js`, `package.json`, `app/README.md`, корневой `README.md`, `.gitignore` (четыре исключения для публичных тестовых данных) и корневой allowlist gitleaks, узко называющий намеренно публичный тестовый ключ TLS. Закрытый ключ подписывающего CA был удален; эти тестовые данные приложение во время работы никогда не использует.