10
Gestiunea rețelei
Gestiunea reţelei
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
Implementarea sockeţilor în Linux
struct FILE
struct socket
struct inode
socket file operations:
- read
- write
- select
...
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 *
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)
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
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
Rutarea unui pachet
Implementarea rutării în Linux
Forwarding Information Database
Forwarding Information Database (3)
Rutarea prin FIB
Cache-ul de rute
FIB TRIE
Simple Trie Lookup
Compressed Trie Lookup
Netfilter
skb
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
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;
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);
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
Interfața hardware
RX ring
TX ring
Memory
NIC
CPU
Packet buffers
IRQ
(packet received)
IRQ
(packet sent)
Interfaţa hardware (2)
Procesare pachetelor
TCP offload
TCP offload (2)
Transmit 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
Large receive offload
ETH
IP
TCP
Payload
ETH
IP
TCP
Payload
ETH
IP
TCP
Payload
Copy
Check and discard
2nd packet
Check and update
Intrebări
?