Sunday, Feb 05th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Сетевые протоколы Размер пакета IP. Выходная процедура IP.

Размер пакета IP. Выходная процедура IP.

Параметр msg является цепочкой mbuf, содержащей размер пакета для отправки, включая скелетный заголовок IP; opt является необязательным mbuf, содержащим опции IP для вставки после заголовка. Если дан маршрут он может содержать ссылку на элемент маршрутизации (структуру rtentry), который определяет маршрут до места назначения, оставшийся от предыдущего вызова, и в котором для будущего использования будет оставлен любой новый маршрут.

Мы уже видели соглашение по вызову для выходной процедуры IP, которая представляет собой:

int ip_output (
struct mbuf *msg,
struct mbuf *opt,
struct route *ro, int flags,
struct ip_moptions *imo,
struct inpcb *inp)

Поскольку в FreeBSD 5.2 из структуры inpcb были удалены копированные маршруты, этот кешированный маршрут используется редко. Поле flags может разрешить использовать широковещание или может указывать, что таблицы маршрутизации нужно игнорировать. Если выставлено поле imo, то оно включает опции для многоадресных передач. Управляющий блок протокола inp используется подсистемой IPSec для хранения данных об ассоциациях безопасности для пакета. Схема работы, выполняемой ipoutput(), следующая.

  • Вставка всех IP-опций.
  • Заполнение оставшихся полей заголовка (версия IP, нулевое смещение, размер заголовка и идентификация нового пакета, размер пакета), если пакет содержит псевдозаголовок IP.
  • Определение маршрута (т.е. исходящего интерфейса и места назначения следующего транзитного участка).
  • Проверка того, не является ли место назначения групповым адресом. Если да, определение исходящего интерфейса и числа транзитных участков.
  • Проверка того, не является ли место назначения широковещательным адресом; если да, проверка того, разрешено ли широковещание.
  • Выполнение всех необходимых пакету манипуляций IPSec, таких, как шифрование.
  • Проверка наличия каких-нибудь правил фильтрования, которые изменили бы пакет или предотвратили его отправку.
  • Если размер пакета не больше максимального размера пакета для исходящего интерфейса, вычисление контрольной суммы и вызов выходной процедуры интерфейса.
  • Если размер пакета больше максимального размера пакета для исходящего интерфейса, разделение пакета на фрагменты и поочередная их отправка.

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

Возвращенный маршрут включает указатель на исходящий интерфейс. Информация интерфейса включает максимальный размер пакета, флаги, включая возможности широковещания и многоадресной рассылки, и процедуру вывода. Если маршрут помечен флагом RTFGATEWAY, адрес маршрутизатора следующего транзитного участка дан в маршруте; в противном случае место назначения пакета является местом назначения следующего транзитного участка.

Если маршрутизацию следует проигнорировать из-за опции MSGDONTROUTE или опции SODONTROUTE, в этом случае находится непосредственно подсоединенная сеть, в которой находится место назначения; если непосредственно подсоединенной сети нет, возвращается ошибка. После обнаружения исходящего интерфейса и места назначения следующего транзитного участка для отправки пакета информации достаточно.

Выходная процедура интерфейса обычно проверяет адрес назначения и помещает пакет в выходную очередь, возвращая ошибку лишь если интерфейс выключен, выходная очередь заполнена или непонятен адрес назначения.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 19 гостей онлайн