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

Стоповый символ

Стоповый символ (также стоп-символ, стоп-маркер, терминатор) — в теории формальных языков, программировании и телекоммуникациях — специальный знак или последовательность знаков, обозначающий конец передаваемого блока данных, сообщения, строки или файла. В отличие от служебных символов, указывающих на границы (например, пробела или перевода строки), стоповый символ выполняет функцию терминации — сигнала о том, что последующая информация не относится к данному блоку или должна игнорироваться.

История возникновения

Понятие стопового символа восходит к ранним этапам развития телеграфии и телетайпной связи. В коде Бодо (1870 год) для разделения букв использовались специальные служебные комбинации, однако чёткого выделения «конца сообщения» не существовало — оператор просто прекращал передачу. С появлением асинхронной последовательной передачи данных (начало XX века) возникла необходимость в маркерах начала и конца кадра. В стандарте RS-232 (1960-е годы) стоповым битом стал единичный импульс длительностью 1, 1,5 или 2 бита, указывающий приёмнику, что передача байта завершена.

С развитием компьютерных систем и файловых форматов стоповые символы стали применяться для обозначения конца строки (EOL) и конца файла (EOF). В операционной системе DOS (1981 год) для маркировки конца текстового файла использовался символ с кодом 0x1A (Ctrl+Z), унаследованный от CP/M. В Unix-подобных системах (с 1969 года) конец файла определяется системой по отсутствию данных, но в пользовательском вводе роль стопового символа выполняет Ctrl+D (код 0x04).

Виды и классификация

По области применения

  1. Стоп-символы в программировании — маркеры конца строки (\0 в C/C++, \n в текстовых файлах), конца файла (EOF), конца списка аргументов (NULL в C).
  2. Стоп-символы в протоколах передачи данных — стоп-бит в асинхронной последовательной связи, флаг конца кадра в HDLC (0x7E), символ ETX (End of Text, код 0x03) в управляющих кодах ASCII.
  3. Стоп-символы в форматах данных — нулевой байт в строках C, маркер конца записи в CSV (символ перевода строки), закрывающий тег в XML/HTML.
  4. Стоп-символы в пользовательском вводе — Ctrl+D в Unix, Ctrl+Z в Windows, Esc в некоторых интерфейсах командной строки.

По способу кодирования

Применение в программировании

Строки с нулевым символом

В языках C и C++ строки представляют собой массивы символов, завершающиеся нулевым байтом (\0). Этот стоповый символ позволяет функциям (например, strlen(), strcpy()) определять длину строки без передачи дополнительного параметра. Недостаток: если нулевой байт отсутствует (например, из-за ошибки), функции могут выйти за границы массива, что приводит к уязвимостям (переполнение буфера).

Конец файла (EOF)

В языке C конец файла обозначается макросом EOF, значение которого обычно равно -1. Функции getchar(), fgetc() возвращают EOF при попытке чтения за концом файла. В стандартных потоках ввода (stdin) EOF может быть эмулирован пользователем через Ctrl+D (Unix) или Ctrl+Z (Windows). В современных языках (Python, Java) EOF обрабатывается исключениями (например, EOFError).

Маркеры в протоколах

В протоколе TCP (1981 год) стоповый символ как таковой отсутствует — конец данных определяется закрытием соединения (FIN-пакет). Однако в прикладных протоколах (HTTP, SMTP) используются явные маркеры: пустая строка (CRLF) в HTTP-заголовках, точка на отдельной строке в SMTP (RFC 5321).

Применение в телекоммуникациях

Асинхронная последовательная передача

В стандарте RS-232 каждый байт данных обрамляется стартовым битом (логический 0) и одним или несколькими стоповыми битами (логическая 1). Стоповый бит гарантирует, что приёмник успеет синхронизироваться перед следующим байтом. Длительность стопового бита (1, 1,5 или 2 бита) выбирается в зависимости от скорости и качества линии.

Кадрирование в HDLC

В протоколе HDLC (High-Level Data Link Control, 1970-е годы) каждый кадр начинается и заканчивается флагом 0x7E. Если внутри кадра встречается байт 0x7E, он экранируется (вставляется 0x7D). Таким образом, флаг выполняет роль стопового символа, однозначно указывая границы кадра.

Проблемы и ограничения

Конфликт с данными

Если стоповый символ может встречаться внутри передаваемых данных, возникает проблема экранирования (escaping). Например, в строках C нельзя хранить нулевой байт, а в текстовых файлах DOS символ Ctrl+Z может быть частью двоичных данных. Решения: escape-последовательности (C: \0 для нуля, но не для хранения), длина строки в заголовке (Pascal), использование специальных флагов (HDLC).

Безопасность

Отсутствие или неправильная обработка стопового символа может привести к уязвимостям. Классический пример — переполнение буфера в C при отсутствии нулевого байта. В веб-приложениях некорректная обработка символа конца строки (CRLF) может вызвать инъекцию HTTP-заголовков (HTTP Response Splitting).

Переносимость

Разные операционные системы используют разные стоповые символы для конца строки: Windows — \r\n (CR+LF), Unix/Linux — \n (LF), классическая Mac OS (до 10.0) — \r (CR). Это приводит к проблемам при обработке текстовых файлов между платформами.

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

Источники

  1. Таненбаум Э., Уэзеролл Д. «Компьютерные сети». 5-е изд. — СПб.: Питер, 2012.
  2. Керниган Б., Ритчи Д. «Язык программирования C». 2-е изд. — М.: Вильямс, 2007.
  3. RFC 5321 — Simple Mail Transfer Protocol (2008).
  4. ISO 3309 — High-Level Data Link Control (HDLC) procedures (1993).
  5. «ASCII Control Characters» — American National Standards Institute, 1968.
  6. Документация GNU C Library — раздел «End-of-File and Errors».

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

На главную BFOmetr →