Открыть сервис

Tabular Data Stream

Tabular Data Stream (TDS) — это протокол прикладного уровня, используемый для передачи данных между реляционными базами данных и клиентскими приложениями. Он определяет формат и правила обмена запросами и ответами, включая структурированные наборы строк, метаданные о типах данных, а также управляющие сообщения (например, подтверждения, ошибки). TDS изначально разработан компанией Sybase в 1980-х годах, а впоследствии адаптирован и расширен компанией Microsoft для использования в продуктах семейства SQL Server. Протокол работает поверх транспортных протоколов, таких как TCP/IP, и обеспечивает эффективную передачу больших объёмов табличных данных в бинарном виде, что минимизирует накладные расходы по сравнению с текстовыми протоколами (например, HTTP/JSON).

История

Протокол TDS был создан в 1984 году компанией Sybase Inc. для своей системы управления базами данных (СУБД) Sybase SQL Server. Основной целью разработки было создание эффективного бинарного протокола, способного обрабатывать запросы на языке SQL и возвращать результаты в виде таблиц с минимальной задержкой. В 1987 году компания Microsoft лицензировала исходный код Sybase SQL Server и начала разработку собственной версии, которая позже стала Microsoft SQL Server. Вместе с кодом был получен и протокол TDS.

Версии протокола эволюционировали параллельно с развитием СУБД:

  • TDS 4.2 (1990-е) — использовался в Microsoft SQL Server 6.5 и Sybase Adaptive Server Enterprise (ASE) 11.5. Поддерживал базовые типы данных и простые запросы.
  • TDS 5.0 (1996) — разработан Sybase для ASE 12.0. Ввёл поддержку больших объектов (TEXT, IMAGE), динамических курсоров и расширенных метаданных.
  • TDS 7.0 (1998) — представлен Microsoft для SQL Server 7.0. Существенно переработан: добавлена поддержка Unicode, новых типов данных (DATETIME, MONEY), а также механизмов шифрования и аутентификации.
  • TDS 7.1 (2000) — использовался в SQL Server 2000. Включал поддержку XML-данных и множественных активных результирующих наборов (MARS).
  • TDS 7.2 (2005) — внедрён в SQL Server 2005. Оптимизирован для работы с большими наборами данных, добавлена поддержка пользовательских типов данных (CLR UDT) и механизма Service Broker.
  • TDS 7.3 (2008) — SQL Server 2008. Ввёл поддержку пространственных типов данных (GEOGRAPHY, GEOMETRY) и фильтрованных индексов.
  • TDS 7.4 (2012) — SQL Server 2012. Добавлена поддержка последовательностей (SEQUENCE), оконных функций и улучшенная обработка ошибок.
  • TDS 8.0 (2016) — SQL Server 2016. Включает поддержку JSON, темпоральных таблиц и Always Encrypted (шифрование на стороне клиента).

Начиная с SQL Server 2000, Microsoft прекратила поддержку старых версий TDS (4.2 и 5.0), окончательно удалив их в SQL Server 2012. В настоящее время протокол TDS является закрытым, но его спецификация частично опубликована Microsoft в рамках программы Open Specifications.

Архитектура и принцип работы

TDS — это протокол типа «запрос-ответ» (request-response). Клиент (например, приложение, использующее драйвер ODBC, OLE DB или JDBC) устанавливает TCP-соединение с сервером базы данных на порту 1433 (стандартный порт для SQL Server). После установки соединения происходит процесс аутентификации, после чего клиент отправляет пакеты TDS, содержащие SQL-запросы, а сервер возвращает пакеты с результатами.

Структура пакета TDS

Каждый пакет TDS состоит из заголовка и тела. Заголовок имеет фиксированный размер (8 байт) и включает:

  • Тип пакета (1 байт) — определяет назначение: запрос (SQL Batch), ответ (Result Set), управляющее сообщение (Attention, Login) и т.д.
  • Состояние (1 байт) — флаги, указывающие на начало/конец потока или наличие ошибки.
  • Длина (2 байта) — общая длина пакета (заголовок + тело).
  • Канал (2 байта) — идентификатор сессии.
  • Номер пакета (1 байт) — порядковый номер в последовательности (для фрагментации больших сообщений).
  • Окно (1 байт) — зарезервировано.

Тело пакета содержит данные, формат которых зависит от типа пакета. Например, для запроса тело содержит SQL-текст, а для ответа — набор строк (rowset) в бинарном виде.

Процесс обмена данными

  1. Установка соединения: Клиент отправляет пакет Login7, содержащий учётные данные (логин, пароль, имя базы данных). Сервер отвечает пакетом LoginAck с подтверждением или ошибкой.
  2. Отправка запроса: Клиент отправляет пакет SQLBatch с текстом SQL-запроса. Для повышения производительности запросы могут быть объединены в один пакет (batch).
  3. Обработка на сервере: Сервер выполняет запрос и формирует ответ. Ответ может включать:
  • Метаданные (пакет ColMetadata) — описание столбцов результирующей таблицы: имена, типы данных, размеры, точность.
  • Строки данных (пакеты Row) — каждая строка передаётся в виде последовательности значений, закодированных в бинарном формате (длина поля, затем данные).
  • Управляющие сообщения — например, Done (указывает на завершение выполнения), Error (сообщение об ошибке), Info (предупреждения).
  1. Завершение: После получения всех данных клиент может отправить пакет Attention для прерывания выполнения, если это необходимо, или закрыть соединение.

Версии и совместимость

Протокол TDS не является полностью обратно совместимым. Разные версии СУБД поддерживают разные версии протокола. Клиентские драйверы (например, sqlsrv для PHP, pyodbc для Python) обычно договариваются с сервером о максимальной поддерживаемой версии во время установки соединения. Если клиент не поддерживает версию сервера, соединение может быть отвергнуто или переключено на более старую версию.

Версия TDSСУБДОсновные нововведения
4.2SQL Server 6.5, Sybase ASE 11.5Базовая поддержка SQL, типы данных (INT, CHAR, VARCHAR)
5.0Sybase ASE 12.0Большие объекты, динамические курсоры
7.0SQL Server 7.0Unicode, новые типы данных, шифрование
7.1SQL Server 2000XML, MARS
7.2SQL Server 2005CLR UDT, Service Broker
7.3SQL Server 2008Пространственные данные, фильтрованные индексы
7.4SQL Server 2012Последовательности, оконные функции
8.0SQL Server 2016JSON, Always Encrypted

Реализации и использование

TDS является основным протоколом для Microsoft SQL Server и Sybase ASE. Большинство клиентских библиотек для работы с этими СУБД (например, Microsoft.Data.SqlClient, pymssql, FreeTDS, jTDS) реализуют поддержку TDS. Протокол также используется в облачных сервисах, таких как Azure SQL Database, где он обеспечивает соединение с базами данных через интернет.

FreeTDS

FreeTDS — это открытая реализация протокола TDS, разработанная для обеспечения совместимости с Microsoft SQL Server и Sybase ASE на Unix-подобных системах. Она поддерживает версии TDS от 4.2 до 7.4 и используется в таких проектах, как php-mssql (устаревший) и pymssql. FreeTDS позволяет приложениям, написанным на C, Python, Ruby и других языках, подключаться к SQL Server без использования проприетарных драйверов Microsoft.

jTDS

jTDS — это реализация TDS на Java, которая поддерживает версии протокола до 7.1. Она была популярна до появления официального драйвера Microsoft JDBC, но в настоящее время считается устаревшей и не поддерживает новые возможности SQL Server (например, Always Encrypted).

Критика и ограничения

TDS, будучи бинарным протоколом, обеспечивает высокую производительность при передаче больших объёмов данных, однако имеет ряд недостатков:

  • Закрытость: Полная спецификация протокола не опубликована, что затрудняет разработку сторонних реализаций и устранение ошибок. Microsoft публикует лишь частичную документацию в рамках программы Open Specifications.
  • Сложность отладки: В отличие от текстовых протоколов (например, HTTP), трафик TDS трудно анализировать без специальных инструментов (например, Wireshark с поддержкой TDS).
  • Зависимость от версии: Несовместимость версий может приводить к проблемам при подключении старых клиентов к новым серверам и наоборот.
  • Отсутствие поддержки в некоторых языках: Для ряда языков программирования (например, Go, Rust) реализация TDS отсутствует или является неполной, что вынуждает разработчиков использовать REST API или другие протоколы.

Интересные факты

  • Порт 1433, используемый TDS по умолчанию, был выбран случайно: он соответствует номеру, который был свободен в списке портов IANA на момент разработки SQL Server 7.0.
  • В версии TDS 7.0 была введена поддержка шифрования с использованием протокола SSL/TLS, что стало важным шагом для безопасности корпоративных баз данных.
  • Протокол TDS поддерживает механизм «Multiple Active Result Sets» (MARS), позволяющий клиенту отправлять несколько запросов без ожидания завершения предыдущих, что повышает производительность в многопоточных приложениях.

Источники

  1. Microsoft Corporation. «[MS-TDS]: Tabular Data Stream Protocol Specification». Open Specifications, 2021.
  2. Sybase Inc. «Sybase Adaptive Server Enterprise 12.0: TDS Protocol Reference». Sybase Documentation, 1996.
  3. FreeTDS Project. «FreeTDS: A free implementation of the TDS protocol». FreeTDS.org, 2023.
  4. Brian K. «Understanding the TDS Protocol». SQL Server Central, 2005.
  5. Microsoft Corporation. «SQL Server Network Protocols». SQL Server Technical Documentation, 2019.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →