пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
  Это руководство рассчитано на новичков, и здесь вы узнаете, что же такое команда  awk . Кроме того, вы сможете ознакомиться с тем, как ее можно использовать при работе с текстом. Приступим! Что такое команда  awk ? awk - это язык описания сценариев. Он поможет вам при работе с командной строкой. Кроме того, эту команды очень часто используют для обработки текста.  С помощью  awk вы можете выбирать данные (один или несколько фрагментов текста), опираясь на созданный шаблон.  Например, с помощью  awk вы можете выполнять такие операции, как поиск определенного слова или комбинации символов в заданном фрагменте текста или выбор определенной строки или определенного столбца в указанном файле.  Базовый синтаксис команды  awk В самом простом варианте после команды  awk следуют набор одинарных кавычек и набор фигурных скобок, в последнюю очередь пишется имя файла, который вы хотите найти.  Это выглядит примерно вот так: awk '{action}' your_file_name.txt Если вы хотите найти текст, у которого есть определенный шаблон, или слово в тексте, то внешний вид команды будет следующим: awk '/regex pattern/{action}' your_file_name.txt Как создать файл-пример? Для того, чтобы создать файл в командной строке, вам понадобиться команда  touch . Например,  touch filename.txt , где  filename – это имя вашего файла. После чего вы можете воспользоваться командой  open   ( open filename.txt ), которая откроет редактор текста, например, TextEdit, где вы сможете добавить содержимое файла.  Итак, предположим, что у вас есть текстовый файл под названием  information.txt , в котором хранятся данные, разделенные на несколько столбцов. Содержимое файла выглядит примерно так: fristName lastName  age city ID Thomas  Shelby  30  Rio  400 Omega Night 45  Ontario  600 Wood  Tinker  54  Lisbon N/A Giorgos Georgiou  35  London 300 Timmy Turner  32  Berlin N/A В данном случае мы имеем столбцы  firstName ,  lastName ,  age ,  city и  ID . Вы можете в любое время просмотреть содержимое вашего файла, набрав команду  cat text_file , где  text_file - это имя вашего файла. Как напечатать все содержимое файла с помощью команды  awk ? Для того, чтобы напечатать  все содержимое файла, внутри фигурных скобок необходимо указать действие  print $0 . Это будет работать точно также, как команда  cat , которую мы упомянули чуть выше. awk '{print $0}' information.txt Результат: fristName lastName  age city ID Thomas  Shelby  30  Rio  400 Omega Night 45  Ontario  600 Wood  Tinker  54  Lisbon N/A Giorgos Georgiou  35  London 300 Timmy Turner  32  Berlin N/A Если вы хотите пронумеровать строки, то для этого вам нужна встроенная переменная  NR : awk '{print NR,$0}' information.txt 1 fristName lastName  age city ID 2 3 Thomas  Shelby  30  Rio  400 4 Omega Night 45  Ontario  600 5 Wood  Tinker  54  Lisbon N/A 6 Giorgos Georgiou  35  London 300 7 Timmy Turner  32  Berlin N/A Как напечатать определенные столбцы с помощью команды  awk ? Вы можете указать какие-то конкретные столбцы, которые вы хотите напечатать.  Для того, чтобы напечатать первый столбец, вам потребуется вот такая команда: awk '{print $1}' information.txt Результат: Thomas Omega Wood Giorgos Timmy $1 обозначает первое поле данных. В нашем случае это первый столбец. Для того, чтобы напечатать второй столбец, вам нужно подставить в команду  $2 : awk '{print $2}' information.txt Результат: lastName Shelby Night Tinker Georgiou Turner Как же команда  awk определяет, где начинается и где заканчивается каждый столбец? По умолчанию она это делает по пробелам.  Для того, чтобы напечатать больше, чем один столбец, например, первый и четвертый, вам нужно сделать следующее: awk '{print $1, $4}' information.txt Результат: fristName city Thomas  Rio Omega Ontario Wood  Lisbon Giorgos London Timmy Berlin $1 - это первое входное поле (первый столбец), а  $4 - четвертое. Вы записываете их через запятую ( $1, $4 ). В результате столбцы напечатаются через пробел, что обеспечит их читаемость.  Для того, чтобы напечатать последнее поле данных (последний столбец), вам нужно подставить в команду  $NF , что обозначает  последнее поле в записи: awk '{print $NF}' information.txt Результат: ID 400 600 N/A 300 N/A Как напечатать определенные строки столбца? Помимо всего прочего вы можете выбрать столбец и указать его строки, которые вы хотите напечатать.  awk '{print $1}' information.txt | head -1 Результат: FirstName Давайте разберем эту команду поподробнее. Команда  awk '{print $1}' information.txt печатает первый столбец. После чего с помощью вертикальной черты вывод этой команды (которую вы наблюдали ранее)  передается команде  head , где аргумент  -1 отвечает за выбор первой сроки столбца. Если вы хотите напечатать две строки, то команда будет выглядеть вот так: awk '{print $1}' information.txt | head -2 Результат: FirstName Dionysia Как напечатать строки с помощью специального шаблона? Вы можете напечатать строку, которая  начинается с какой-то определенной буквы. Например, awk '/^O/' information.txt Результат: Omega Night 45  Ontario  600 Эта команда выбирает все строки, которые  начинаются с буквы  O . Для начала вы пишете символ  ^ , который указывает на то, что строка с этой буквы должна начинаться, после чего вы пишете букву, с которой должна начинаться строка. Кроме того, вы можете напечатать строку, которая  заканчивается определенным образом. awk '/0$/' information.txt Результат: Thomas  Shelby  30  Rio  400 Omega Night 45  Ontario  600 Giorgos Georgiou  35  London 300 Эта команда печатает все строки, которые заканчиваются на  0 . Символ  $ , записанный после, указывает на то, что строка должна заканчиваться на этот символ. Команду можно немного изменить: awk '! /0$/' information.txt Символ  ! используется вместо  NOT . То есть в данном случае команда выбирает строки, которые НЕ заканчиваются на  0 . fristName lastName  age city ID Wood  Tinker  54  Lisbon N/A Timmy Turner  32  Berlin N/A Как использовать регулярные выражения в  awk ? Для того, чтобы вывести слова, которые содержат определенные буквы, и напечатать слова, которые соответствуют заданному шаблону, вам снова потребуется пара слешей, которую мы уже видели ранее. Если вы хотите найти слова, которые содержат  io , то вот какую команду вам нужно запустить: awk ' /io/{print $0}' information.txt Результат: Thomas  Shelby  30  Rio  400 Omega Night 45  Ontario  600 Giorgos Georgiou  35  London 300 В результате вы получите все записи, которые содержат сочетание  io . Допустим, что у вас есть еще один столбец -  department : fristName lastName  age city ID department Thomas  Shelby  30  Rio  400  IT Omega Night 45  Ontario  600  Design Wood  Tinker  54  Lisbon N/A  IT Giorgos Georgiou  35  London 300  Data Timmy Turner  32  Berlin N/A  Engineering Для того, чтобы найти информацию обо всех людях, которые работают в IT-отделе ( IT ), вам нужно указать в слешах строку, которую вы ищете: awk '/IT/' information.txt Результат: Thomas  Shelby  30  Rio  400  IT Wood  Tinker  54  Lisbon N/A  IT А что делать, если вы хотите увидеть только имя и фамилию людей, которые работают в IT-отделе ( IT )?  Вы можете указать соответствующие столбцы: awk '/IT/{print $1, $2}' information.txt Результат: Thomas Shelby Wood Tinker В результате на экране отобразятся строки, в которых присутствует  IT . Причем, отобразятся не все поля, а только первый и второй столбцы. Могут возникать ситуации, когда при поиске слов по определенному шаблону, вам может потребоваться символ перехода (escape), например, awk '/N\/A$/' information.txt Результат: Wood  Tinker  54  Lisbon N/A Timmy Turner  32  Berlin N/A Я хотел найти строки, который заканчиваются на  N/A . И потому, дабы избежать ошибки, записывая  N/A , мне пришлось воспользоваться символом перехода ( \ ).  Как использовать операторы сравнения в  awk ? Если вы, например, хотите найти информацию о сотрудниках, возраст которых не превышает  40 лет, то вам понадобиться оператор сравнения  < : awk '$3 <  40 { print $0 }' information.txt Результат: Thomas  Shelby  30  Rio  400 Giorgos Georgiou  35  London 300 Timmy Turner  32  Berlin N/A В результате вы получите информацию только о сотрудниках младше 40 лет. Заключение Вот оно! Теперь вы знаете, что такое  awk , и умеете работать с ним и текстовыми данными. 
img
Баги и ошибки неизбежны в программировании. Тем не менее они могут раздражать и вызывать разочарование в работе. Предлагаем разобраться, что такое try / catch в JavaScript. Что такое блок try/catch в JavaScript? Блок try/catch в JavaScript используется для обработки ошибок. Он помогает избежать прерывание кода из-за ошибок в вашем скрипте. Хотя это может показаться чем-то, что можно легко реализовать с помощью оператора if, try/catch предоставляет много преимуществ, которые выходят за рамки возможностей if/else, некоторые из которых мы рассмотрим ниже. Оператор try позволяет проверить блок кода на наличие ошибок. Оператор catch позволяет обработать эту ошибку. Например: Вот как строится конструкция try/catch. Вы помещаете код в блок try, и если возникает ошибка, JavaScript передает управление оператору catch, который выполняет указанные действия. В данном случае он выводит ошибку в виде оповещения. Все ошибки JavaScript на самом деле являются объектами, которые содержат два свойства: имя (например, Error, SyntaxError и т. д.) и само сообщение об ошибке. Поэтому, когда мы выводим e, мы получаем что-то вроде ReferenceError: getData is not defined. Как и любой другой объект в JavaScript, вы можете решать, как получить значения по-разному, например, e.name (ReferenceError) и e.message (getData is not defined). Но на самом деле это не отличается от того, что делает JavaScript. Хотя JavaScript уважает вас достаточно, чтобы записать ошибку в консоль, а не показывать оповещение всему миру. Как использовать операторы try/catch Оператор throw Одно из преимуществ try/catch - это возможность отображать свои собственные пользовательские ошибки. Это называется throw error. В ситуациях, когда вы не хотите видеть те ошибки, которые отображает JavaScript, вы можете бросить свою ошибку (исключение) с помощью оператора throw. Эта ошибка может быть строкой, булевым значением или объектом. И если возникает ошибка, оператор catch отобразит ту ошибку, которую вы выбросили. Здорово, не правда ли? Но мы можем пойти дальше, создавая ошибку с помощью конструкторов ошибок JavaScript. JavaScript в основном классифицирует ошибки на шесть групп: EvalError - ошибка, произошедшая в функции eval. RangeError - число вне диапазона, например, 1.toPrecision(500). Метод toPrecision дает числам десятичное значение, например, 1.000, и число не может иметь 500 таких значений. ReferenceError - использование переменной, которая не была объявлена. SyntaxError - ошибка синтаксиса при выполнении кода. TypeError - использование значения, выходящего за пределы ожидаемых типов, например, 1.toUpperCase(). URIError - ошибка, если используются незаконные символы в функции URI. Таким образом, мы можем легко выбросить ошибку, например, throw new Error("Привет"). В этом случае имя ошибки будет Error, а сообщение — Привет. Вы также можете создать свой собственный конструктор ошибки, например: И вы можете использовать это везде с throw new CustomError("данные не определены"). Проверим конструкцию try/catch. Рассмотрим следующий пример: Но когда вы попробуете это выполнить, даже с использованием оператора try, это все равно не сработает. Это потому, что в JavaScript существуют два основных типа ошибок (то, что я описал выше — синтаксическая ошибка и так далее — на самом деле не являются типами ошибок. Вы можете назвать их примерами ошибок): ошибки времени разбора (parse-time errors) и ошибки времени выполнения (runtime errors) или исключения. Ошибки времени разбора — это ошибки, которые возникают в коде, когда движок не понимает код. Например, в приведенном выше коде, JavaScript не понимает, что вы имеете в виду под {{}}, и из-за этого ваш try/catch здесь бесполезен (он не сработает). С другой стороны, ошибки времени выполнения — это ошибки, которые возникают в корректном коде, и это именно те ошибки, которые try/catch сможет обработать. Приведенный выше код является корректным, и try/catch корректно обработает ошибку. Оператор finally Оператор finally действует как нейтральная зона, базовая точка или финальная стадия для блока try/catch. С помощью finally вы говорите, что, независимо от того, что произойдет в блоке try/catch (ошибка или отсутствие ошибки), код в блоке finally должен выполниться. Например: Вложенные блоки try Вы также можете вкладывать блоки try, но, как и любое другое вложение в JavaScript (например, if, for и так далее), это может привести к громоздкости и ухудшению читаемости кода, поэтому я не рекомендую это делать. Но это только мое мнение. Вложение блоков try дает вам преимущество использования одного блока catch для нескольких блоков try. Хотя вы можете написать блок catch для каждого try отдельно, вот пример: В этом случае не будет ошибки во внешнем блоке try, так как с ним все в порядке. Ошибка возникает во внутреннем блоке try, и она уже обработана своим собственным блоком catch. Рассмотрим следующий пример: Этот код работает немного иначе: ошибка возникает во внутреннем блоке try, который не содержит catch, но вместо этого имеет блок finally. Обратите внимание, что блок try/catch можно записать тремя разными способами: try...catch, try...finally, try...catch...finally. Однако ошибка выбрасывается из внутреннего блока try. Блок finally для этого внутреннего try выполнится в любом случае, потому что, как мы уже говорили, он работает, что бы ни произошло в блоке try/catch. И хотя во внешнем блоке try нет ошибки, управление все равно передается его блоку catch для регистрации ошибки. Более того, используется ошибка, созданная во внутреннем блоке try, потому что она произошла именно там. Если бы мы создали ошибку для внешнего блока try, она все равно бы отобразила внутреннюю ошибку, если только внутренняя не поймает свою собственную ошибку. Вы можете поэкспериментировать с кодом ниже, закомментировав внутренний блок catch. Повторное выбрасывание ошибки (Rethrow Error) Оператор catch ловит все ошибки, которые попадают в него, и иногда нам это не нужно. Например: Предположим на секунду, что введенное число будет меньше 5 (цель использования "use strict" — указать, что код должен выполняться в строгом режиме). В строгом режиме, например, нельзя использовать необъявленные переменные. Я хочу, чтобы оператор try выбросил ошибку "y не меньше 5", когда значение y больше 5, что маловероятно. Ошибка должна быть связана с тем, что y не меньше..., а не с тем, что y не определена. В таких ситуациях вы можете проверить тип ошибки, и если это не та ошибка, которую вы хотите, повторно выбросить её: Это просто повторно выбросит ошибку для другого оператора try или остановит выполнение скрипта. Это полезно, когда вы хотите отслеживать только определенный тип ошибок, а остальные, возникшие из-за невнимательности, должны остановить выполнение кода.
img
Теперь мы можем продолжить поиск и устранение неисправностей. В большинстве случаев вы ожидаете увидеть определенную сеть в таблице маршрутизации, но ее там нет. Далее рассмотрим несколько сценариев неправильной (или полностью не рабочей) работы EIGRP и как исправить наиболее распространенные ошибки. Ниже перечислены часто встречающиеся ошибки: Первую часть статьи про траблшутинг EIGRP можно почитать здесь. Кто-то настроил distribute-list, чтобы информация о маршрутах фильтровалась. Было настроено автосуммирование или кто-то настроил суммирование вручную Split-horizon блокирует объявление маршрутной информации. Перераспределение было настроено, но информация из EIGRP не используется. Перераспределение было настроено, но никакие внешние маршруты EIGRP не отображаются. Case #1 Давайте начнем с простой топологии. OFF1 и OFF2 работают под управлением EIGRP, и каждый маршрутизатор имеет интерфейс обратной связи. Вот конфигурация обоих маршрутизаторов: OFF1(config)#router eigrp 12 OFF1(config-router)#no auto-summary OFF1(config-router)#network 1.1.1.0 0.0.0.255 OFF1(config-router)#network 192.168.12.0 0.0.0.255 OFF2(config)#router eigrp 12 OFF2(config-router)#no auto-summary OFF2(config-router)#network 2.2.2.0 0.0.0.255 OFF2(config-router)#network 192.168.12.0 0.0.0.255 Все работает нормально, пока через пару недель один из пользователей не пожаловался на то, что ему не удалось подключиться к сети 2.2.2.0 / 24 из-за OFF1. Посмотрите на таблицу маршрутизации на OFF1, и вот что вы видите: По какой-то причине нет сети 2.2.2.0 / 24 в таблице маршрутизации. Видно, что на OFF1 не настроен distribute lists. OFF2 содержит сеть 1.1.1.0 / 24 в своей таблице маршрутизации. Давайте выполним быструю отладку, чтобы увидеть, что происходит. Отладка показывает нам, что происходит. Прежде чем вы увидите это сообщение, придется немного подождать, или вы можете сбросить соседство EIGRP, чтобы ускорить процесс. Как видите, в сети 2.2.2.0 / 24 отказано из-за distribute list. Другой быстрый способ проверить это - использовать команду show ip protocol. В этом случае использование show run могло бы быстрее обнаружить distribute-list. Вот список доступа, доставляющий нам неприятности. OFF2(config)#router eigrp 12 OFF2(config-router)#no distribute-list 1 out Удалим distribute-list. Задача решена! Извлеченный урок: если команды network верны, проверьте, есть ли у вас distribute-list, который запрещает объявлять префиксы или устанавливать их в таблицу маршрутизации. Имейте в виду, distribute-list могут быть настроены как входящие или исходящие, как список доступа. Case #2 В следующем сценарии те же 2 маршрутизатора, но разные сети в loopback. Вот конфигурация: OFF1(config)#router eigrp 12 OFF1(config-router)#network 192.168.12.0 OFF1(config-router)#network 10.0.0.0 OFF2(config)#router eigrp 12 OFF2(config-router)#network 192.168.12.0 OFF2(config-router)#network 10.0.0.0 Как вы видите - это довольно базовая конфигурация. Глядя на таблицы маршрутизации, не видно сети 10.1.1.0 / 24 или 10.2.2.0 / 24. Видна запись для сети 10.0.0.0/8, указывающую на интерфейс null0. Эта запись отображается только при настройке суммирования и используется для предотвращения циклов маршрутизации. Давайте включим отладку и посмотрим, что мы можем найти. OFF2#clear ip eigrp 12 neighbors Этой командой мы сделаем сброс соседства EIGRP, чтобы ускорить процесс. Имейте в виду, что это, вероятно, не самое лучшее, что можно сделать в производственной сети, пока вы не узнаете, что не так, но это действительно помогает ускорить процесс. Вот наш ответ. Отладка говорит нам, что сеть 10.2.2.0 / 24 не следует объявлять, а сеть 10.0.0.0 / 8 нужно объявлять (это вкратце). Это может произойти по двум причинам: Суммирование было кем-то настроено Авто-суммирование включено для EIGRP. Как вы видите, авто-суммирование включено для EIGRP. В зависимости от версии IOS авто-суммирование включено или отключено по умолчанию. OFF1(config)#router eigrp 12 OFF1(config-router)#no auto-summary OFF2(config)#router eigrp 12 OFF2(config-router)#no auto-summary Отключение автоматического суммирования должно помочь. Ну что, наши сети появились в таблице маршрутизации. Извлеченный урок: если включена автоматическое суммирование EIGRP, вы можете столкнуться с нестабильными сетями. Case #3 Очередная проблема. В приведенном выше примере у нас есть 2 маршрутизатора, но разные сети. OFF1 содержит сеть 172.16.1.0 / 24 на интерфейсе обратной связи, а OFF2 содержит сеть 172.16.2.0 / 24 и 172.16.22.0 / 24 на своих интерфейсах обратной связи. Посмотрим конфигурацию EIGRP обоих маршрутизаторов: Как вы видите, что все сети объявляются. Обратите внимание, что в OFF1 включено автоматическое суммирование, а в OFF2 отключено автоматическое суммирование. Кто-то настроил суммирование на OFF2 и отправляет ее на OFF1. Суммирование создана для сети 172.16.0.0 / 16. Однако, если посмотреть на таблицу маршрутизации OFF1, она не появится. Мы видим запись для сети 172.16.0.0 / 16, но она указывает на интерфейс null0, а не на OFF2. Что здесь происходит? OFF2#clear ip eigrp 12 neighbors Давайте сделаем отладку на OFF2, чтобы увидеть, объявляется ли суммирование. Выполним команду clear ip eigrp neighbors, просто чтобы ускорить процесс. Глядя на отладку, видно, что OFF2 работает правильно. Он объявляет сводный маршрут 172.16.0.0 / 16 так, как должен. Это означает, что проблема должна быть в OFF1. Давайте проведем отладку OFF1. Мы можем видеть, что OFF1 получает сводный маршрут от OFF2, но решает не использовать его. Это хороший момент для проверки таблицы топологии EIGRP. Вы видите, что он имеет суммирование сети 172.16.0.0 / 16 от OFF2 в своей таблице топологии EIGRP, но OFF1 решает не использовать ее, потому что вход через интерфейс null0 является лучшим путем. OFF1(config)#router eigrp 12 OFF1(config-router)#no auto-summary Решение состоит в том, что нам нужно избавиться от записи null0 в таблице маршрутизации. Единственный способ сделать это - отключить автоматическое суммирование. Отключение автоматического суммирования удаляет запись null0, и теперь суммирование OFF2 установлено проблема решена! Извлеченный урок: автоматическое суммирование EIGRP создает запись через интерфейс null0, которая может помешать установке суммирования, которые вы получаете от соседних маршрутизаторов. Case #4 Есть еще одна проблема с суммированием, которую сейчас и разберем. Мы используем топологию, которую вы видите выше, и ниже конфигурация EIGRP обоих маршрутизаторов. Все сети объявлены, и автоматическое суммирование отключено на обоих маршрутизаторах. Суммирование было настроено на OFF2 и должно быть объявлено к OFF1. К сожалению, ничего не видно на OFF1. Давайте проверим OFF2, чтобы посмотреть, что не так. Когда дело доходит до устранения неполадок с сетью, вашими друзьями являются не Google или Яндекс, а команды Debug и show. Странно, это единственная сеть, которую OFF2 объявляет. Одно из золотых правил маршрутизации: вы не можете объявлять то, чего у вас нет. Очевидно, OFF2 знает только о сети 192.168.12.0 / 24. Вот это ошибка! Кто-то выполнил команду отключения на интерфейсах обратной связи. OFF2(config)#interface loopback 0 OFF2(config-if)#no shutdown OFF2(config)#interface loopback 1 OFF2(config-if)#no shutdown Включим интерфейсы. Теперь мы видим, что суммирование объявляется. Теперь мы видим суммирование в таблице маршрутизации OFF1- проблема решена! Извлеченный урок: вы не можете объявлять то, чего у вас нет в таблице маршрутизации. ВАЖНО. Последняя проблема может быть показаться простой, но есть важный момент, который вы не должны забывать: для объявления итогового маршрута в таблице маршрутизации объявляемого маршрутизатора должен быть указан хотя бы один префикс, попадающий в итоговый диапазон! Case #5 Давайте посмотрим на другую топологию. На рисунке выше у нас есть концентратор Frame Relay и соответствующая топология. Каждый из OFF1 и OFF2 имеет интерфейс обратной связи, который мы будем объявлять в EIGRP. Вот соответствующая конфигурация всех маршрутизаторов: CONC(config)#router eigrp 123 CONC(config-router)#no auto-summary CONC(config-router)#network 192.168.123.0 OFF1(config-if)#router eigrp 123 OFF1(config-router)#no auto-summary OFF1(config-router)#network 192.168.123.0 OFF1(config-router)#network 2.2.2.0 0.0.0.255 OFF2(config)#router eigrp 123 OFF2(config-router)#no auto-summary OFF2(config-router)#network 192.168.123.0 OFF2(config-router)#network 3.3.3.0 0.0.0.255 Видно, что все сети объявлены. Наш концентратор-маршрутизатор видит сети из двух OFF-маршрутизаторов. К сожалению, наши маршрутизаторы не видят ничего ... Похоже, что маршрутизатор-концентратор не объявляет сети, которые он изучает с помощью OFF-маршрутизаторов. Давайте включим отладку, чтобы увидеть, что происходит. CONC#clear ip eigrp 123 neighbors Сбросим соседство EIGRP, чтобы ускорить процесс. В отладке мы видим, что наш маршрутизатор-концентратор узнает о сети 2.2.2.0 / 24 и 3.3.3.0 / 24, но объявляет только сеть 192.168.123.0 / 24 для OFF-маршрутизаторов. Разделение горизонта не позволяет размещать объявление от одного маршрутизатора на другой. CONC(config)#interface serial 0/0 CONC(config-if)#no ip split-horizon eigrp 123 Давайте отключим разделение горизонта на последовательном интерфейсе маршрутизатора-концентратора. Теперь мы видим, что маршрутизатор-концентратор объявляет все сети. OFF-маршрутизаторы теперь могут узнавать о сетях друг друга, поскольку split horizon отключено. Это хорошо, но это еще не все. Извлеченный урок: RIP и EIGRP являются протоколами маршрутизации на расстоянии и используют split horizon. Split horizon предотвращает объявление префикса вне интерфейса, на котором мы его узнали. Хотя сети отображаются в таблицах маршрутизации мы не можем пропинговать от одного OFF-маршрутизатора к другому. Это не проблема EIGRP, но она связана с Frame Relay. Мы должны это исправить. Когда OFF1 отправляет IP-пакет на OFF2, IP-пакет выглядит следующим образом: Давайте пока подумаем, как роутер, и посмотрим, что здесь происходит. Сначала нам нужно проверить, знает ли OFF1, куда отправить 3.3.3.3: Существует запись для 3.3.3.3, а IP-адрес следующего перехода - 192.168.123.1 (маршрутизатор-концентратор). Можем ли мы достичь 192.168.123.1? Нет проблем, кажется, OFF1 может пересылать пакеты, предназначенные для сети 3.3.3.0/24. Давайте перейдем к маршрутизатору CONC. У маршрутизатора-концентратора нет проблем с отправкой трафика в сеть 3.3.3.0 / 24, поэтому на данный момент мы можем сделать вывод, что проблема должна быть в маршрутизаторе OFF2. Это IP-пакет, который получает маршрутизатор OFF2, и когда он отвечает, он создает новый IP-пакет, который выглядит следующим образом: Способен ли OFF2 достигать IP-адрес 192.168.123.2 Давайте узнаем! Теперь мы знаем проблему ... OFF2 не может достичь IP-адреса 192.168.123.2 Если мы посмотрим на таблицу маршрутизации OFF2, то увидим, что сеть 192.168.123.0 / 24 подключена напрямую. С точки зрения третьего уровня у нас нет никаких проблем. Пришло время перейти вниз по модели OSI и проверить уровень 2 ... или, может быть, между уровнем 2 и 3. Frame Relay использует Inverse ARP для привязки уровня 2 (DLCI) к уровню 3 (IP-адрес). Вы можете видеть, что нет сопоставления для IP-адреса 192.168.123.2. OFF2(config)#int s0/0 OFF2(config-if)#frame-relay map ip 192.168.123.2 301 Давайте frame-relay map сами. Теперь роутер OFF2 знает, как связаться с роутером OFF1 Наконец, маршрутизатор OFF1 может пропинговать интерфейс обратной связи маршрутизатора OFF2. Когда мы пытаемся пропинговать от маршрутизатора OFF2 к интерфейсу обратной связи маршрутизатора OFF1, у нас возникает та же проблема, поэтому мы также добавим туда оператор frame-relay map: OFF1(config)#int s0/0 OFF1(config-if)#frame-relay map ip 192.168.123.3 201 Теперь у нас есть extra frame-relay map на маршрутизаторе OFF1. И наш пинг проходит!
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59