Ранее мы описали прием пакета сетевым интерфейсом и помещение пакета во входную процедуру для соответствующего протокола. Потом обработчик сетевого интерфейса планирует для запуска протокол, установив соответствующий бит в слове состояния сети и назначив выполнение сетевого потока.
Процедура ввода IPv4 вызывается через это программное прерывание, когда сетевые интерфейсы получают сообщения для протокола IPv4. Входная процедура, ip_input(), вызывается с mbuf, который содержит пакет для обработки. Удаление пакета из очереди и вызовы входной процедуры осуществляются вызовом сетевым потоком netisr_dispatch().
Пакет обрабатывается одним из четырех способов: он передается в качестве процедуры ввода протоколу вышележащего уровня, он сталкивается с ошибкой, которая сообщается обратно источнику, он удаляется из-за ошибки или пересылается на следующий транзитный участок на своем пути к месту назначения. В виде наброска шаги по обработке пакета на входе следующие.
- Проверка того, что размер пакета по крайней мере равен размеру заголовка IPv4, и проверка непрерывности заголовка.
- Проверка контрольной суммы заголовка пакета и уничтожение пакета, если там есть ошибка.
- Проверка того, что пакет имеет по крайней мере такой же размер, какой указан в заголовке, и уничтожение пакета, если это не так. Отрезание заполнения от конца пакета.
- Выполнение всех функций фильтрования или защиты, необходимых ipfw или IPSec.
- Обработка опций заголовка.
- Проверка того, предназначен ли пакет для данного хоста. Если да, продолжить обработку пакета. Если нет и если осуществляется маршрутизация, попытаться переправить пакет. В противном случае уничтожить пакет.
- Если пакет был фрагментирован, сохранение его до тех пор, пока не будут получены и повторно собраны все фрагменты, или до тех пор, пока он не устареет.
- Передача пакета входной процедуре следующего вышележащего протокола.
Когда входящий пакет передается входной процедуре, он сопровождается указателем на интерфейс, через который пакет был получен. Эта информация передается следующему протоколу, функции пересылки или функции сообщения об ошибке. Если обнаружена какая-нибудь ошибка и сообщена отправителю пакета, исходный адрес сообщения об ошибке будет установлен в соответствии с местом назначения пакета и входящим интерфейсом.
Решение о том, принимать ли полученный пакет для локальной обработки протоколом вышележащего уровня, не такое простое, как можно было бы подумать. Если у хоста несколько адресов, пакет принимается, если место его назначения совпадает с любым из этих адресов. Если любая из подключенных сетей поддерживает широковещание, а место назначения является широковещательным адресом, пакет также принимается.
Входная процедура IPv4 использует простую и эффективную схему для обнаружения входной процедуры для принимающего протокола входящего пакета. Поле протокола в пакете имеет размер 8 битов; поэтому есть 256 возможных протоколов. Определено или реализовано менее 256 протоколов, а переключение протокола Интернета имеет гораздо меньше 256 элементов. Поэтому ipjnput() использует 256-элементный отображающий массив для отображения номера протокола на элемент переключения протокола принимающего протокола. В качестве каждого из элементов в массиве первоначально установлен индекс непосредственного элемента ввода IP в переключении протокола.
Затем для каждого протокола с отдельной реализацией в системе в качестве соответствующего элемента отображения устанавливается индекс протокола в переключателе протокола IP. Когда получен пакет, IP просто использует поле протокола в качестве индекса в отображающем массиве и вызывает входную процедуру соответствующего протокола.
- 17/01/2010 12:06 - Алгоритмы TCP. Состояние соединения.
- 16/01/2010 11:38 - Отметка времени. Номер последовательности. Переменные последовательности
- 16/01/2010 11:25 - SYN. Состояния ТСР-соединения
- 16/01/2010 11:08 - TCP - Протокол управления передачей
- 16/01/2010 11:03 - Процедура пересылки IP-пакетов
- 16/01/2010 10:46 - Размер пакета IP. Выходная процедура IP.
- 16/01/2010 10:40 - Протокол Интернета IP (ШЗ)
- 15/01/2010 17:34 - Управляющие операции
- 15/01/2010 17:07 - Вывод и ввод UDP. Блок протокола.
- 14/01/2010 18:56 - UDP. Протокол пользовательских дейтаграмм