4697-1 (Реализация сети в операционной системе Linux)

2016-07-30СтудИзба

Описание файла

Документ из архива "Реализация сети в операционной системе Linux", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "4697-1"

Текст из документа "4697-1"

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

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

Рассмотрим подробнее что происходит с пакетом при попадании в нашу машину. Сначала он обрабатывается драйвером аппаратуры(сетевой карты и т.д) если пакет предназначен нам то он посылается на выше лежащий уровень - сетевой там определяется для кого он предназначен: нам или кому-то другому, для этого просматривается кэш маршрутизации, если там нет маршрута то 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];

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). */

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. */

unsigned short security; /* Security level of packet */

unsigned int truesize; /* Buffer size */

unsigned char *head; /* Head of buffer */

unsigned char *data; /* Data head pointer */

unsigned char *tail; /* Tail pointer */

unsigned char *end; /* End pointer */

void (*destructor)(struct sk_buff *); /* Destruct function */

#ifdef CONFIG_NETFILTER

/* Can be used for communication between hooks. */

unsigned long nfmark;

/* Cache info */

__u32 nfcache;

/* Associated connection, if any */

struct nf_ct_info *nfct;

#ifdef CONFIG_NETFILTER_DEBUG

unsigned int nf_debug;

#endif

#endif /*CONFIG_NETFILTER*/

#if defined(CONFIG_HIPPI)

union{

__u32 ifield;

} private;

#endif

#ifdef CONFIG_NET_SCHED

__u32 tc_index; /* traffic control index */

#endif

};

там же содержится масса полезных функций для работы с sk_buff. все протоколы используют ету структуру добавляя заголовки своего уровня

Маршрутизация

Уровень IP использует 3 структуры для маршрутизации FIB где хранятся все маршруты routing cache где находятся наиболее часто используемые neibour table список компьютеров физически соединенных с данным

FIB содержит 32 зоны по одной на каждый бит ip адреса каждая зона содержит точки входа для хостов и сетей которые задайтся данной маской подсети 255.0.0.0 имеет 8 значащих бит и поэтому в восьмой зоне 255.255.255.0 в 24 зоне

файл /proc/net/route содержит FIB

routing cache хэш-таблица которая содержит до 256 цепочек маршрутов если подходящий маршрут не найден в кэше то он добавляется туда из FIB устаревшие записи по истечении некоторого времени удаляются содержимое кэша можно увидеть в /proc/net/rt_cache

Инициализация сети

главные настройки сети в дистрибутиве RedHat (Mandrake) лежат в /etc/sysconfig/network ,/etc/sysconfig/network-scripts/ifcfg-eth0 и тд...

содержимое моих файлов (не в virtual mashine редхате а на нормальной машине Mandrake-8.2 где соответственно нет никаких сетевых карт)

/etc/sysconfig/network

NETWORKING=yes

FORWARD_IPV4=false

HOSTNAME=freeland.linux

DOMAINNAME=linux

/etc/sysconfig/network-scripts/ifcfg-lo

DEVICE=lo

IPADDR=127.0.0.1

NETMASK=255.0.0.0

NETWORK=127.0.0.0

# If you're having problems with gated making 127.0.0.0/8 a martian,

# you can change this to something else (255.255.255.255, for example)

BROADCAST=127.255.255.255

ONBOOT=yes

NAME=loopback

Очень полезной программой является ifconfig синтаксис которой подробно рассмотрен в мануале

[20:16][pts1]/etc/sysconfig/network-scripts [root]

#ifconfig

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:3242 errors:0 dropped:0 overruns:0 frame:0

TX packets:3242 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:227644 (222.3 Kb) TX bytes:227644 (222.3 Kb)

не менее полезна команда route

#route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

127.0.0.0 * 255.0.0.0 U 0 0 0 lo

её назначение ,а также многих других описано в Linux Network Administrator Guide

Соединения

В этой части мы подробно рассмотрим сокеты и всё что с ними связано

Когда процесс создаёт сокет то он пустой потом система определяет маршрут к удалённому хосту и вносит эту информацию в сокет. После этого пакеты направляются на нужное устройство

Есть два типа сокетов BSD сокеты которые включают как член INET cокеты BSD сокеты описываются структурой struct socket в linux/net.h

struct socket

{

socket_state state;

unsigned long flags;

struct proto_ops *ops;

struct inode *inode;

struct fasync_struct *fasync_list; /* Asynchronous wake up list */

struct file *file; /* File back pointer for gc */

struct sock *sk;

wait_queue_head_t wait;

short type;

unsigned char passcred;

};

struct proto_ops {

int family;

int (*release) (struct socket *sock);

int (*bind) (struct socket *sock, struct sockaddr *umyaddr,

int sockaddr_len);

int (*connect) (struct socket *sock, struct sockaddr *uservaddr,

int sockaddr_len, int flags);

int (*socketpair) (struct socket *sock1, struct socket *sock2);

int (*accept) (struct socket *sock, struct socket *newsock,

int flags);

int (*getname) (struct socket *sock, struct sockaddr *uaddr,

int *usockaddr_len, int peer);

unsigned int (*poll) (struct file *file, struct socket *sock, struct poll_table_struct *wait);

int (*ioctl) (struct socket *sock, unsigned int cmd,

unsigned long arg);

int (*listen) (struct socket *sock, int len);

int (*shutdown) (struct socket *sock, int flags);

int (*setsockopt) (struct socket *sock, int level, int optname,

char *optval, int optlen);

int (*getsockopt) (struct socket *sock, int level, int optname,

char *optval, int *optlen);

int (*sendmsg) (struct socket *sock, struct msghdr *m, int total_len, struct scm_cookie *scm);

int (*recvmsg) (struct socket *sock, struct msghdr *m, int total_len, int flags, struct scm_cookie *scm);

int (*mmap) (struct file *file, struct socket *sock, struct vm_area_struct * vma);

ssize_t (*sendpage) (struct socket *sock, struct page *page, int offset, size_t size, int flags);

};

наиболее важные поля

* struct proto_ops *ops указывает на протокольно зависимые функции

struct inode на inode файла сокета

struct sock* на инет сокет

INET net/sock.h struct sock

struct sock {

/* Socket demultiplex comparisons on incoming packets. */

__u32 daddr; /* Foreign IPv4 addr */

__u32 rcv_saddr; /* Bound local IPv4 addr */

__u16 dport; /* Destination port */

unsigned short num; /* Local port */

int bound_dev_if; /* Bound device index if != 0 */

/* Main hash linkage for various protocol lookup tables. */

struct sock *next;

struct sock **pprev;

struct sock *bind_next;

struct sock **bind_pprev;

volatile unsigned char state, /* Connection state */

zapped; /* In ax25 & ipx means not linked */

__u16 sport; /* Source port */

unsigned short family; /* Address family */

unsigned char reuse; /* SO_REUSEADDR setting */

unsigned char shutdown;

atomic_t refcnt; /* Reference count */

socket_lock_t lock; /* Synchronizer... */

int rcvbuf; /* Size of receive buffer in bytes */

wait_queue_head_t *sleep; /* Sock wait queue */

struct dst_entry *dst_cache; /* Destination cache */

rwlock_t dst_lock;

atomic_t rmem_alloc; /* Receive queue bytes committed */

struct sk_buff_head receive_queue; /* Incoming packets */

atomic_t wmem_alloc; /* Transmit queue bytes committed */

struct sk_buff_head write_queue; /* Packet sending queue */

atomic_t omem_alloc; /* "o" is "option" or "other" */

int wmem_queued; /* Persistent queue size */

int forward_alloc; /* Space allocated forward. */

__u32 saddr; /* Sending source */

unsigned int allocation; /* Allocation mode */

int sndbuf; /* Size of send buffer in bytes */

struct sock *prev;

/* Not all are volatile, but some are, so we might as well say they all are.

* XXX Make this a flag word -DaveM

*/

volatile char dead,

done,

urginline,

keepopen,

linger,

destroy,

no_check,

broadcast,

bsdism;

unsigned char debug;

unsigned char rcvtstamp;

unsigned char use_write_queue;

unsigned char userlocks;

/* Hole of 3 bytes. Try to pack. */

int route_caps;

int proc;

unsigned long lingertime;

int hashent;

struct sock *pair;

/* The backlog queue is special, it is always used with

* the per-socket spinlock held and requires low latency

* access. Therefore we special case it's implementation.

*/

struct {

struct sk_buff *head;

struct sk_buff *tail;

} backlog;

rwlock_t callback_lock;

/* Error queue, rarely used. */

struct sk_buff_head error_queue;

struct proto *prot;

#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)

union {

struct ipv6_pinfo af_inet6;

} net_pinfo;

#endif

union {

struct tcp_opt af_tcp;

#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE)

struct raw_opt tp_raw4;

#endif

#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)

struct raw6_opt tp_raw;

#endif /* CONFIG_IPV6 */

#if defined(CONFIG_SPX) || defined (CONFIG_SPX_MODULE)

struct spx_opt af_spx;

#endif /* CONFIG_SPX */

} tp_pinfo;

int err, err_soft; /* Soft holds errors that don't

cause failure but are the cause

of a persistent failure not just

'timed out' */

unsigned short ack_backlog;

unsigned short max_ack_backlog;

__u32 priority;

unsigned short type;

unsigned char localroute; /* Route locally only */

unsigned char protocol;

struct ucred peercred;

int rcvlowat;

long rcvtimeo;

long sndtimeo;

#ifdef CONFIG_FILTER

/* Socket Filtering Instructions */

struct sk_filter *filter;

#endif /* CONFIG_FILTER */

/* This is where all the private (optional) areas that don't

* overlap will eventually live.

*/

union {

void *destruct_hook;

struct unix_opt af_unix;

#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE)

struct inet_opt af_inet;

#endif

#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)

struct atalk_sock af_at;

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5137
Авторов
на СтудИзбе
440
Средний доход
с одного платного файла
Обучение Подробнее