Перейти к содержанию

SLIP (Serial Line Internet Protocol)

SLIP появился в начале 1980-х для передачи IP-пакетов по последовательным линиям и был описан в RFC 1055 всего на нескольких страницах. Протокол давно ушёл из сетей, но его способ отделять пакеты друг от друга остался одним из самых простых для собственных протоколов поверх UART.

Обновлено Редакция GAW

SLIP (Serial Line Internet Protocol) — способ разбить поток байтов последовательной линии на пакеты, описанный в RFC 1055 в 1988 году. Сам документ называет себя «не-стандартом»: он фиксирует уже сложившуюся практику — SLIP вырос из стека 3COM UNET, а около 1984 года Рик Адамс реализовал его для 4.2 BSD. От протокола в нём только кадрирование — разделитель конца пакета и правило байт-стаффинга для данных, которые с этим разделителем совпали.

Коды

ИмяВосьмеричныйHexНазначение
END3000xC0конец пакета
ESC3330xDBначало экранированной пары
ESC_END3340xDCпосле ESC — означает байт данных 0xC0
ESC_ESC3350xDDпосле ESC — означает байт данных 0xDB

Передатчик проходит по данным: байт 0xC0 заменяет парой DB DC, байт 0xDB — парой DB DD, остальные отправляет как есть, а в конце ставит END. Приёмник делает обратное и, встретив END, отдаёт накопленный пакет. RFC 1055 советует начинать каждый пакет тоже с END, чтобы отбросить шум, оставшийся на линии.

Пример: данные 01 C0 02 уходят в линию как C0 01 DB DC 02 C0.

Ограничения

RFC 1055 перечисляет их сам: нет адресации, нет поля типа пакета, нет обнаружения и исправления ошибок, нет сжатия. Для пакета задан и практический предел — драйверы BSD принимали до 1006 байт. Второй недостаток — непредсказуемый размер: если в данных много байтов 0xC0 и 0xDB, пакет растёт вплоть до двукратного. COBS решает эту задачу с гарантией не больше одного лишнего байта на 254.

Когда выбрать SLIP

Для небольших пакетов поверх UART, где код должен уместиться в десяток строк, SLIP по-прежнему удобен: кодирование и декодирование идут по одному байту без буферизации, а после сбоя приёмник синхронизируется на ближайшем END. Целостность добавляют сами — CRC в конце данных. Как выбрать между паузой, длиной в заголовке и разделителем, разобрано в статье о реализации протоколов.

Частые вопросы

Какие коды использует SLIP?

По RFC 1055 их четыре: END = 0xC0 (192) — конец пакета, ESC = 0xDB (219) — признак экранирования, ESC_END = 0xDC (220) и ESC_ESC = 0xDD (221). Байт данных 0xC0 передают как DB DC, байт 0xDB — как DB DD. ESC SLIP не совпадает с ASCII-символом Escape (0x1B).

Зачем ставить END и в начале пакета?

RFC 1055 советует это, чтобы приёмник сбросил мусор, накопившийся на линии с прошлого пакета, — например, шум после включения. Пустой пакет между двумя END просто отбрасывается.

Есть ли в SLIP контрольная сумма?

Нет. RFC 1055 прямо перечисляет, чего в протоколе нет: адресации, типа пакета, обнаружения и исправления ошибок, сжатия. Для собственного протокола поверх SLIP в конец данных добавляют CRC и проверяют его после разбора кадра.

Источники

  1. J. Romkey. RFC 1055: A Nonstandard for Transmission of IP Datagrams over Serial Lines: SLIP, June 1988 — два специальных символа: END — восьмеричное 300 (десятичное 192), ESC — восьмеричное 333 (десятичное 219), не путать с ASCII ESC; байт данных, равный END, передаётся парой ESC и 334 (220), равный ESC — парой ESC и 335 (221); после пакета передаётся END; рекомендуется начинать пакет тоже с END, чтобы сбросить накопленный шум; максимальный размер пакета берклиевских драйверов — 1006 байт; в протоколе нет адресации, идентификации типа пакета, обнаружения и исправления ошибок и сжатия; пример функций send_packet и recv_packet на C
  2. S. Cheshire, M. Baker. Consistent Overhead Byte Stuffing. IEEE/ACM Transactions on Networking, vol. 7, no. 2, April 1999 — SLIP, PPP и AX.25 рассчитаны на малые средние накладные расходы, но в худшем случае размер пакета вырастает до 200 %

Нашли ошибку?