Кратко

  • Data Offset задаёт физическую границу заголовка, а EOL завершает логический список опций.
  • NOP может выровнять следующую опцию, но не превращает выравнивание в требование к получателю.

Как читать переменную область

Получатель движется по октетам. Kind 1, то есть NOP, занимает один октет. Обычная опция содержит тип, длину и данные; длина включает поля типа и длины, поэтому по ней можно пропустить даже неизвестную опцию. Kind 0, EOL, прекращает интерпретацию значимых опций. Остаток до границы, указанной Data Offset, является нулевым заполнением, а не полезной нагрузкой.

RFC 793 описал эту структуру ещё в 1981 году. RFC 9293 сохраняет требование длины для каждой опции, кроме EOL и NOP, включая будущие опции. Получателю не обязательно понимать каждое значение, но он обязан безопасно продвигаться внутри ограниченной области. Нулевая или противоречивая длина незаконна и требует защитной обработки.

Выравнивание без обязательства

Отправитель может вставить NOP, чтобы начать следующую опцию, например, с границы слова. Это удобство размещения, а не условие протокола. RFC 793 уже требовал принимать опции, начинающиеся не на границе слова; RFC 9293 сохраняет это требование. Универсального выигрыша в производительности NOP также не обещает.

EOL не заменяет Data Offset, не сокращает заголовок и не запускает полезную нагрузку сразу. Он закрывает только логический список. Если EOL появился раньше физической границы, оставшиеся байты должны быть нулевыми. Если опции сами дошли до границы, EOL не нужен.

Стабильная основа расширяемости

Длины позволяют проходить неизвестные значения, а EOL и NOP разделяют разные задачи границ. Так преемственность от RFC 793 к RFC 9293 сохраняет синхронизацию разбора при появлении новых опций.

Sources