Sunteți pe pagina 1din 29

10

Gestiunea reelei

Gestiunea reelei

Implementarea sockeilor n Linux


Rutarea n Linux
Interfaa cu hardware-ul
Optimizri
Bibliografie
Linux Network Architecture

Componente ale stivei de reea n Linux

Berkely Socket Interface

Transport layer
TCP

UDP

Network layer
IP

Routing

NetFilter

Data link layer


ETH

ARP

Queing discipline

Network device drivers

BRIDGING

Implementarea sockeilor n Linux

socket file operations:


- read
- write
- select
...

struct FILE

struct inode

struct socket

Implementarea sockeilor n Linux (2)

struct socket
struct sock *

...
...
proto_ops

struct sock

struct inet_sock
sk_prot
...

struct tcp_sock

release()
bind()
connect()
accept()
sendmsg()
recvmsg()
poll()
...

struct sock

struct inet_sock
sk_prot
...

struct udp_sock

inet_dgram_connect
inet_sendmsg
udp_poll
inet_release
inet_bind
...

Exemplu: trimiterea unui pachet UDP

char c;
struct sockaddr_in addr;
int s;

s = socket(AF_INET, SOCK_DGRAM, 0);


connect(s, (struct sockaddr*)&addr, sizeof(addr));
write(s, &c, 1);
close(s);

Exemplu: trimiterea unui pachet UDP (2)


VFS
layer

sys_write vfs_write do_sync_write filp->f_op->aio_write

Generic socket
layer

IP socket
layer

UDP socket
layer

IP socket
layer

sock_aio_write sock->ops->sendmsg

sk->sk_prot->sendmsg

ip_append_data / udp_flush_pending_frames

skb = sock_alloc_send_skb();
skb_queue_tail(sk, skb)

routing

ip_local_out();

Fluxul pachetelor

Tabela de rutare

[tavi@tropaila tavi]$ /sbin/route


Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
172.16.1.0 192.168.58.1 255.255.255.0 UG 0 0 0 vmnet1
172.16.125.0 * 255.255.255.0 U 0 0 0 vmnet8
192.168.58.0 * 255.255.255.0 U 0 0 0 vmnet1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo

Conine informaii necesare rutrii unui pachet pentru o reea cunoscut


Adresa reelei
Masca reelei
Interfaa sau next hop-ul pe unde trebuie trimis pachetul
Metrica

Rutarea unui pachet

Pentru pachetele primite se verific dac adresa destinaie


coincide cu vreo adresa local
Daca da, se trimite pachetul local

Dac nu, se ruteaz pachetul


Se determin

Interfaa pe care trebuie trimis pachetul


Adresa de nivel 2 a next hop-ului
Adresa de nivel 3 a next hop-ului
dac este necesar se fragmenteaz / defragmenteaz pachetul
se suprascrie header-ul de nivel 2 i se transmite pachetul pe
interfaa selectat

Implementarea rutrii n Linux

Procesul de rutare este iniiat din bottom-half handler-ul


asociat gestiunii reelei
Pentru determinarea informatiilor de rutare se consulta in
ordine
Cache-ul de rute
Forwarding Information Database (FIDB)

Forwarding Information Database

O tabel cu 32 de intrri, cte una pentru fiecare masc de reea


posibil
O intrare n tabel conine un pointer ctre o list de structuri ce
descriu rute cu aceai masc de reea

Forwarding Information Database (3)

Rutarea prin FIB

Se consulta FIB incepand cu zona asociata celei mai


specifice masti (/32)
Se inspecteaza hash table-ul fiecarei zone
Pentru a mari viteza de cautare se folosesc contoare pentru a
indica cat de des a fost folosita o ruta; in cadrul unei liste din
hash table nodurile se tin ordonate descrescator dupa acest
contor

Daca nu se face match in hash table-ul unei zone, se trece


la urmatoarea
Daca nu se face match pe nici o ruta se face drop pe pachet

Cache-ul de rute

Netfilter

Infrastructura folosit n Linux pentru implementarea


facilitilor de firewall & NAT
Bazat pe hook-uri:
NF_IP_PRE_ROUTING
NF_IP_LOCAL_IN
NF_IP_FORWARD
NF_IP_LOCAL_OUT
NF_IP_POST_ROUTING
NF_IP_NUMHOOKS

skb

Descrie un pachet
O parte linear +
Un vector de fragmente +
O list de fragmente

skb_frag

skb_frag

Pointer to
data

Pointer to
data

SKB
Pointer to
data
(linear
part)

prev
next

SKB

SKB

Pointer to
data

Pointer to
data

prev

prev

next

next

Skb (2)
struct sk_buff {
struct sk_buff *next;
struct sk_buff *prev;
struct sock *sk;
ktime_t tstamp;
struct net_device *dev;
char cb[48];
unsigned int len,
data_len;
__u16 mac_len,
hdr_len;
void (*destructor)(struct sk_buff *skb);
sk_buff_data_t
sk_buff_data_t
sk_buff_data_t
sk_buff_data_t
sk_buff_data_t

transport_header;
network_header;
mac_header;
tail;
end;

unsigned char *head,


*data;
unsigned int truesize;
atomic_t users;

Operaii comune

unsigned char *skb_transport_header(const struct sk_buff *skb);


void skb_reset_transport_header(struct sk_buff *skb);
void skb_set_transport_header(struct sk_buff *skb, const int offset);
unsigned char *skb_network_header(const struct sk_buff *skb);
void skb_reset_network_header(struct sk_buff *skb);
void skb_set_network_header(struct sk_buff *skb, const int offset);
unsigned char *skb_mac_header(const struct sk_buff *skb);
int skb_mac_header_was_set(const struct sk_buff *skb);
void skb_reset_mac_header(struct sk_buff *skb);
void skb_set_mac_header(struct sk_buff *skb, const int offset);

Operaii comune (2)


/* reserve head room */
void skb_reserve(struct sk_buff *skb, int len);
/* add data to the end */
unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
/* add data to the top */
unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
/* discard data at the top */
unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
/* discard data at the end */
unsigned char *skb_trim(struct sk_buff *skb, unsigned int len);

Head
skb_push

skb_reserve
Data

skb_trim

skb_pull

Tail
skb_put
End

Network device drivers


Operaii
int hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
int open(struct net_device *dev);
int stop(struct net_device *dev);
int do_ioctl(struct net_device *dev, struc tifreq *ifr, int cmd);
int change_mtu(struct net_device *dev, int new_mtu);
int create(struct sk_buff *skb, struct net_device *dev, unsigned
type, const void *daddr, const void *saddr, unsigned len);
int rebuild(struct sk_buff *skb);

Recepia pacheteleor se face din ntrerupere


int netif_rx(struct sk_buff *skb);
int netif_receive_skb(struct sk_buff skb); /* NAPI */

Flags
IFF_UP, IFF_BRODCAST, IFF_RUNNING, etc.

Features
NETIF_F_SG, NETIF_F_CSUM, NETIF_F_GSO, NETIF_F_TSO, etc.

short

Interfaa hardware

Packet buffers

Memory

IRQ
(packet received)

CPU

RX ring

TX ring

NIC

IRQ
(packet sent)

Interfaa hardware (2)

RX ring umplut de SO cu buffere pentru pachetele recepionate


TX ring actualizat de SO pentru fiecare pachet de trimis
Transferul pachetelor din/n memorie se face de ctre placa de reea
Procesorul este ntrerupt doar cand
S-a recepionat un pachet
Placa de reea confirm trimiterea unui pachet

Scatter-gather
Un pachet poate fi format din zone ne-contigue de memorie
Descriptorii de TX/RX mai au un bit: end-of-packet
Necesar pentru zero-copying

Checksum offloading: Ethernet, IP, UDP, TCP

Procesare pachetelor

Se face n context softirq


n context IRQ
La RX: se extrage pachetul din RX ring i se plaseaz n coada de procesare a stivei; de
asemenea se aloca un nou skb i se plaseaz n RX ring
La TX: se eliberareaz memoria pentru pachetul trimis

NAPI: n momentul generrii unei ntreruperi


Se dezactiveaz ntreruperea plcii de reea
Se proceseaz toate pachetele
Abia apoi se activeaz ntreruperea la loc

TCP offload

Full offload - Implementarea stivei TCP/IP direct n placa de


reea
Probleme:
Scalabilitate
Securitate
Conforman

Performana stivei de reea este direct proporionala cu


numarul de pachete procesate pe secund (doar headerele
sunt procesate)

TCP offload (2)

Exemplu: daca un end-point poate procesa 60K pachete pe


secund, atunci pentru urmtoarele dimensiuni de pachete
obinem:
1538 -> 738Mbps
2038 -> 978Mbps
9038 -> 4.3Gbps
20738 -> 9.9Gbps

Stateless offload
Stiva folosete pachete mari
TSO (Transmit/TCP Segmentation Offload): hardware-ul primete pachete mari i le sparge n
pachete mai mici pe care apoi le trimite pe fir
LRO (Large Receive Offload): hardware-ul agregheaz pachetele mici n pachete mari pe care
le trimite apoi la stiv

Transmit Segmentation offload


MSS

ETH

IP

TCP

Payload
Networking stack

Copy
ETH

IP
Copy &
update

Copy

NIC

Copy

ETH

...

TCP

Paylo
ad

Copy &
update

IP

Copy
TCP

Paylo
ad
MSS

n hardware de ctre placa de reea


n software nainte de trimiterea ctre device driver (GSO
generic segmentation offload)

Large receive offload


ETH

Check and
discard

IP

TCP

Payload

2nd packet

Check and update


ETH

IP

TCP

Payloa
d

Copy

ETH

IP

TCP

Payload

Dac se recepioneaz pachete ale aceluai segment n ordine ele se vor agrega i ctre
stiva se va trimite un pachet mare (pn la 64KB)
Agregarea se poate face n hardware sau software
Pentru a reduce latena, n momentul n care se iesi din bulca NAPI se face flush

Intrebri

S-ar putea să vă placă și