Linux - статьи




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


Глеб Пахаренко ()

Нашу курсовую мы разделим на 4 части

  • общий обзор
  • более специфическое исследование сетевой активности
  • пройдемся через вызовы функций
  • разберём основные структуры данных и участки кода
  • Рассмотрим подробнее что происходит с пакетом при попадании в нашу машину. Сначала он обрабатывается драйвером аппаратуры(сетевой карты и т.д) если пакет предназначен нам то он посылается на выше лежаций уровень - сетевой там определяется для кого он предназначен: нам или кому-то другому, для етого просматривается кэш маршрутизации,если там нет маршрута то Forwarding Information Base (FIB), если пакет предназначен другому компьютеру то ядро шлёт его на соответствующее устройство (сетевую карту) ,если нам ,то через транспортный и вышележашие уровни приложению. Обмен данными между приложением и ядром осуществляется через абстракцию сокета.В Линухе используется BSD сокеты.

    Рассмотрим поподробнее структуру пакета

    Ключ к быстрому обмену данными в использовании структуры sk_buf и передачи на вышестоящии уровни тобько указаттеля на неё

    описание структуры лежит в linux/skbuff.h

    её поля

    struct sk_buff { /* These two members must be first. */ struct sk_buff * next; /* Next buffer in list */ struct sk_buff * prev; /* Previous buffer in list */

    struct sk_buff_head * list; /* List we are on */ struct sock *sk; /* Socket we are owned by */ struct timeval stamp; /* Time we arrived */ struct net_device *dev; /* Device we arrived on/are leaving by */

    /* Transport layer header */ union { struct tcphdr *th; struct udphdr *uh; struct icmphdr *icmph; struct igmphdr *igmph; struct iphdr *ipiph; struct spxhdr *spxh; unsigned char *raw; } h;

    /* Network layer header */ union { struct iphdr *iph; struct ipv6hdr *ipv6h; struct arphdr *arph; struct ipxhdr *ipxh; unsigned char *raw; } nh;

    /* Link layer header */ union { struct ethhdr *ethernet; unsigned char *raw; } mac;

    struct dst_entry *dst;

    /* * This is the control buffer. It is free to use for every * layer. Please put your private variables there. If you * want to keep them across layers you have to do a skb_clone() * first. This is owned by whoever has the skb queued ATM. */ char cb[48];




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