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) в бинарном виде.
Процесс обмена данными
- Установка соединения: Клиент отправляет пакет
Login7, содержащий учётные данные (логин, пароль, имя базы данных). Сервер отвечает пакетомLoginAckс подтверждением или ошибкой. - Отправка запроса: Клиент отправляет пакет
SQLBatchс текстом SQL-запроса. Для повышения производительности запросы могут быть объединены в один пакет (batch). - Обработка на сервере: Сервер выполняет запрос и формирует ответ. Ответ может включать:
- Метаданные (пакет
ColMetadata) — описание столбцов результирующей таблицы: имена, типы данных, размеры, точность. - Строки данных (пакеты
Row) — каждая строка передаётся в виде последовательности значений, закодированных в бинарном формате (длина поля, затем данные). - Управляющие сообщения — например,
Done(указывает на завершение выполнения),Error(сообщение об ошибке),Info(предупреждения).
- Завершение: После получения всех данных клиент может отправить пакет
Attentionдля прерывания выполнения, если это необходимо, или закрыть соединение.
Версии и совместимость
Протокол TDS не является полностью обратно совместимым. Разные версии СУБД поддерживают разные версии протокола. Клиентские драйверы (например, sqlsrv для PHP, pyodbc для Python) обычно договариваются с сервером о максимальной поддерживаемой версии во время установки соединения. Если клиент не поддерживает версию сервера, соединение может быть отвергнуто или переключено на более старую версию.
| Версия TDS | СУБД | Основные нововведения |
|---|---|---|
| 4.2 | SQL Server 6.5, Sybase ASE 11.5 | Базовая поддержка SQL, типы данных (INT, CHAR, VARCHAR) |
| 5.0 | Sybase ASE 12.0 | Большие объекты, динамические курсоры |
| 7.0 | SQL Server 7.0 | Unicode, новые типы данных, шифрование |
| 7.1 | SQL Server 2000 | XML, MARS |
| 7.2 | SQL Server 2005 | CLR UDT, Service Broker |
| 7.3 | SQL Server 2008 | Пространственные данные, фильтрованные индексы |
| 7.4 | SQL Server 2012 | Последовательности, оконные функции |
| 8.0 | SQL Server 2016 | JSON, 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), позволяющий клиенту отправлять несколько запросов без ожидания завершения предыдущих, что повышает производительность в многопоточных приложениях.
Источники
- Microsoft Corporation. «[MS-TDS]: Tabular Data Stream Protocol Specification». Open Specifications, 2021.
- Sybase Inc. «Sybase Adaptive Server Enterprise 12.0: TDS Protocol Reference». Sybase Documentation, 1996.
- FreeTDS Project. «FreeTDS: A free implementation of the TDS protocol». FreeTDS.org, 2023.
- Brian K. «Understanding the TDS Protocol». SQL Server Central, 2005.
- Microsoft Corporation. «SQL Server Network Protocols». SQL Server Technical Documentation, 2019.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →