Реалізація мережі в операційній системі Linux
Гліб Пахаренко
Розглянемо докладніше що відбувається з пакетом при попаданні в нашу машину. Спочатку він обробляється драйвером апаратури (мережевої карти і т.д) якщо пакет призначено нам то він надсилається на вище лежить рівень - мережевий там визначається для кого він призначений: нам або комусь іншому, для цього проглядається кеш маршрутизації, якщо там немає маршруту то Forwarding Information Base (FIB), якщо пакет призначений іншого комп'ютера те ядро ​​шле його на відповідний пристрій (мережеву карту), якщо нам, то через транспортний і вищерозміщені рівні додатком. Обмін даними між додатком і ядром здійснюється через абстракцію сокета. У Линух використовується BSD сокети. p> Розглянемо поподробнее структуру пакету
Ключ до швидкого обміну даними у використанні структури sk_buf і передачі на вищестоящі рівні тільки покажчика на неї
опис структури лежить в linux/skbuff.h
її поля
struct sk_buff {
/* These two members must be first. */p> 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];
unsigned int len;/* Length of actual data */
unsigned int data_len;
unsigned int csum;/* Checksum */
unsigned char __ unused,/* Dead field, may be reused */
cloned,/* head may be cloned (check refcnt to be sure). */p> pkt_type,/* Packet class */
ip_summed;/* Driver fed us an IP checksum */
__u32 priority;/* Packet queueing priority */
atomic_t users;/* User count - see datagram.c, tcp.c */
unsigned short protocol;/* Packet protocol from driver. */p> unsigned short security;/* Security level ...