
заявленными «обязательно пересекаемыми» могут и не поддерживать данную опцию
–
достаточно, чтобы ее поддерживали лишь те маршрутизаторы, которые перечислены
отправителем. Такая ситуация называется «маршрутизация от источника», так как отправитель
пакета сам определяет, какие маршрутизаторы должен пройти пакет. Так же данную опцию
называют «мягкая маршрутизация от источника», так как пакет может пересекать любые
маршрутизаторы, важно лишь, чтобы он обязательно в строгом порядке пересек завяленные
отправителем маршрутизаторы, какие еще маршрутизаторы он пересечет –
не оговаривается. Как
обеспечивается такая передача пакетов, особенно в условиях поддержки данной опции не всеми
маршрутизаторами сети? Очень просто –
поле Destination Address пакета заполняется не адресом
конечного получателя, как мы обычно привыкли, а адресом первого маршрутизатора, который
необходимо пересечь. Разумеется, обычные маршрутизаторы и перенаправляют пакет этому
самому первому маршрутизатору в списке, заданном отправителем, как будто конечному
получателю, не подозревая, что это лишь заявленный отправителем маршрутизатор, а не
истинный получатель пакета. Когда пакет будет доставлен на первый маршрутизатор из списка
(его адрес указан в поле
Destination Address пакета), маршрутизатор, получивший данный пакет
проверяет, нет ли в пакете опции
LSRR. Если такой опции нет, то маршрутизатор и есть истинный
получатель пакета, если опция есть, то проверяется, не больше ли поле длины в опции поля
Pointer (алгоритм проверки Указателя описан в предыдущих примерах).
Формат опции при этом таков:
Type
Length Pointer IP второго маршрутизатора, третьего и т.д., IP получателя пакета
Поле Type принимает значение 10000011 (131), (опция - копируемая во
фрагменты, так как логично, если уж отправитель требует следования пакетов
по определенному маршруту, то все фрагменты отправлять по этому
маршруту), поле длина показывает, как обычно длину опции, поле Pointer
показываем маршрутизаторам, из какого байта поля данных нужно извлечь
адрес следующего получателя пакета (маршрутизатора или узла). Начальное
значение Pointer = 3. В поле данных записаны четырехбайтовыми словами
адреса второго, третьего и т.д. маршрутизаторов, которые пакету необходимо
пересечь, последним в поле данных указывается адрес конечного узла
получателя.
Рассмотрим логику работы маршрутизатора, обрабатывающего опцию:
если указатель больше, чем длина опции, это значит, что маршрутизатор и есть
истинный получатель пакета, а если нет, это значит что данный маршрутизатор
– лишь один из перечисленных отправителем пакета. Тогда маршрутизатор
поступает следующим образом: начиная с байта, на который указывает Pointer
извлекается четырехбайтовое слово, помещается в поле Destination Address
пакета, а адрес маршрутизатора, который это сделал, записывается вместо
только считанного адреса в позицию, указанную полем Pointer, после чего
поле Pointer увеличивается на 4. Таким образом, маршрутизатор переадресует
пакет следующему маршрутизатору из списка, заданного отправителем, при
этом увеличение указателя на 4 означает, что следующий маршрутизатор
будет брать адрес очередного следующего маршрутизатора из следующего
четырехбайтового слова.
Таким образом, пакет, посланный отправителем путешествует по
составной сети в направлении первого маршрутизатора из списка, так как,