Linux - статьи




Реализация сети в операционной - часть 13


поля struct neighbour struct net_device -девайс hh_cache -указатель на аппаратный кэш sk_buff_head arp_queuq -очередь arp пакетов есть local -в ней находятся свои интерфейсы и main в ней наверное всё остальное

Forwarding Information Database

struct fib_table в include/net/ip_fib.h содержит указатели на различные функции tb_stamp tb_id -255 для local и 254 для main td_data -hash fib таблица

struct fn_hash -net/ipv4/fib_hash.c struct fn_zone *fn_zones[33] -указатели на зоны struct fn_zone *fn_zone_list указатель на первую не пустую зону struct fn_zone содержит унформацию про зону и маршруты для неё struct fib_node ** fz_hash -указывает на хэш записей этой зоны int fz_nent количество записей int fx_divisor числу бакетов для зоны (в основном 16 кроме зоны 0000 loopback девайса) int fz_order индекс зоны в родительской fn_hash

struct fib_node -содержит информацию по девайсу в fib_info(include/net/ip_fib.h) метрику ,протокол и т.д

Routing Cache

Это наиболее быстрый способ нахождения маршрута Когда ip нужен маршрут ,то он определяет ячейку в хэше,которая указывает на цепочку маршрутов и идёт по этой цепочке пока не найдет нужный маршруты имеют таймеры и частоту использования ,наиболее частые перемещаются в начало.

struct rtable -звено в цепочке содержит адреса отправителя и получателя входящий интерфейс адрес соседа или шлюза

struct dst_entry содержит спецефические для данного маршрута данные и функциии struct dev -понятно pmtu максимальная длина пакета для данного маршрута int (*input)(struct sk_buff) -указатель на функцию приема для данного маршрута часто ето tcp_rcv int (*output)(struct sk_buff) указатель на функцию отсылки (dev_queue_xmit) также разнообразные стстистические данные и опции

Таким образом нами было проведено исследование сетевой архитектуры операционной системы Линух на примере реализации стека протоколов tcp-ip версии 4 в ядре 2.4.7

Приложение

После длительных теотетических изысканий применим их на практике

Нашей целью будет создание удобного пользовательского интерфейса для указания в пакете подставного ip адреса(адреса которого нет у никакого нашего интерфейса) Я не буду показывать ,то как адреса выставляются в ядре.Замечу только то что, из сокетa семейства AF_INET и типа SOCK_RAW пакет с несвоим адресом отправить вроде бы можно (в ядре 2.2 ,насчет 2.4 неуверен -может там есть какие-то проверки). страницы мана говорят про опцию IP_HDRINCL .Их можно отправлять также через тип SOCK_PACKET. Но для всего этого знать код ядра не очень необходимо. Поэтому мы пойдём други путём.




Содержание  Назад  Вперед