1 of 31

10

Gestiunea rețelei

2 of 31

Gestiunea reţelei

  • Implementarea sockeţilor în Linux
  • Rutarea în Linux
  • Interfaţa cu hardware-ul
  • Optimizări
  • Bibliografie
    • Linux Network Architecture

3 of 31

Componente ale stivei de reţea în Linux

Berkely Socket Interface

Network device drivers

Queing discipline

Data link layer

Transport layer

TCP

UDP

Network layer

IP

NetFilter

BRIDGING

ARP

ETH

Routing

4 of 31

Implementarea sockeţilor în Linux

struct FILE

struct socket

struct inode

socket file operations:

- read

- write

- select

...

5 of 31

Implementarea sockeţilor în Linux (2)

proto_ops

struct sock

struct inet_sock

sk_prot

...

 

struct tcp_sock

struct sock

struct inet_sock

sk_prot

...

 

struct udp_sock

struct socket

......

release()

bind()

connect()

accept()

sendmsg()

recvmsg()

poll()

...

inet_dgram_connect

inet_sendmsg

udp_poll

inet_release

inet_bind

...

struct sock *

6 of 31

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);

7 of 31

Exemplu: trimiterea unui pachet UDP (2)

sys_write → vfs_write → do_sync_write → filp->f_op->aio_write

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)

ip_local_out();

VFS

layer

Generic socket

layer

IP socket

layer

UDP socket

layer

IP socket

layer

routing

8 of 31

Fluxul pachetelor

9 of 31

Tabela de rutare

  • Conţine informaţii necesare rutării unui pachet pentru o reţea cunoscută
    • Adresa reţelei
    • Masca reţelei
    • Interfaţa sau next hop-ul pe unde trebuie trimis pachetul
    • Metrica

[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

10 of 31

Rutarea unui pachet

  • Pentru pachetele primite se verifică dacă adresa destinaţie coincide cu vreo adresa locală
    • Daca da, se trimite pachetul local
  • Dacă nu, se rutează pachetul
    • Se determină
      • Interfaţa 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 interfaţa selectată

11 of 31

Implementarea rutării în Linux

  • Procesul de rutare este iniţiat din bottom-half handler-ul asociat gestiunii reţelei
  • Pentru determinarea informatiilor de rutare se consulta in ordine
    • Cache-ul de rute
    • Forwarding Information Database (FIDB)

12 of 31

Forwarding Information Database

  • O tabelă cu 32 de intrări, câte una pentru fiecare mască de reţea posibilă
  • O intrare în tabelă conţine un pointer către o listă de structuri ce descriu rute cu aceaşi mască de reţea

13 of 31

Forwarding Information Database (3)

14 of 31

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

15 of 31

Cache-ul de rute

16 of 31

FIB TRIE

  • O nouă implementare ce foloseste un prefix tree in loc de un hash table
  • Reprezentare compacta a rutelor în memorie și timp bun de căutare (comparabil cu cache-ul de rute)

17 of 31

Simple Trie Lookup

18 of 31

Compressed Trie Lookup

19 of 31

Netfilter

  • Infrastructura folosită în Linux pentru implementarea facilităţilor 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

20 of 31

skb

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

Pointer to data

(linear part)

SKB

prev

next

Pointer to data

SKB

prev

next

Pointer to data

skb_frag

Pointer to data

skb_frag

Pointer to data

SKB

prev

next

21 of 31

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 transport_header;

sk_buff_data_t network_header;

sk_buff_data_t mac_header;

sk_buff_data_t tail;

sk_buff_data_t end;

unsigned char *head,

*data;

unsigned int truesize;

atomic_t users;

 

22 of 31

Operații 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);

23 of 31

Operații 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

End

Tail

Data

skb_reserve

skb_push

skb_put

skb_pull

skb_trim

24 of 31

Interfața hardware

RX ring

TX ring

Memory

NIC

CPU

Packet buffers

IRQ

(packet received)

IRQ

(packet sent)

25 of 31

Interfaţa hardware (2)

  • RX ring umplut de SO cu buffere pentru pachetele recepţionate
  • TX ring actualizat de SO pentru fiecare pachet de trimis
  • Transferul pachetelor din/în memorie se face de către placa de reţea
  • Procesorul este întrerupt doar cand
    • S-a recepţionat un pachet
    • Placa de reţea 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

26 of 31

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 generării unei întreruperi
    • Se dezactivează întreruperea plăcii de reţea
    • Se procesează toate pachetele
    • Abia apoi se activează întreruperea la loc

27 of 31

TCP offload

  • Full offload - Implementarea stivei TCP/IP direct în placa de reţea
  • Probleme:
    • Scalabilitate
    • Securitate
    • Conformanţă
  • Performanța stivei de rețea este direct proporționala cu numarul de pachete procesate pe secundă (doar headerele sunt procesate)

28 of 31

TCP offload (2)

  • Exemplu: daca un end-point poate procesa 60K pachete pe secundă, atunci pentru următoarele dimensiuni de pachete obținem:
    • 1538 -> 738Mbps
    • 2038 -> 978Mbps
    • 9038 -> 4.3Gbps
    • 20738 -> 9.9Gbps
  • Stateless offload
    • Stiva folosește pachete mari
    • TSO (Transmit/TCP Segmentation Offload): hardware-ul primește 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ă

29 of 31

Transmit Segmentation offload

  • În hardware de către placa de reţea
  • În software înainte de trimiterea către device driver (GSO generic segmentation offload)

Networking stack

NIC

ETH

IP

TCP

Payload

ETH

IP

TCP

Payload

ETH

IP

TCP

Payload

...

MSS

Copy

MSS

Copy

Copy

Copy

Copy &

update

Copy &

update

30 of 31

Large receive offload

  • Dacă se recepţionează pachete ale aceluaşi segment în ordine ele se vor agrega şi către stiva se va trimite un pachet mare (până la 64KB)
  • Agregarea se poate face în hardware sau software
  • Pentru a reduce latenţa, în momentul în care se iesi din bulca NAPI se face flush

ETH

IP

TCP

Payload

ETH

IP

TCP

Payload

ETH

IP

TCP

Payload

Copy

Check and discard

2nd packet

Check and update

31 of 31

Intrebări

?