Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:laboratoare:lab10 [2018/04/29 10:57]
anda.nicolae [Structura socket]
so2:laboratoare:lab10 [2019/05/06 10:20] (current)
liza_elena.babu [Structura socket]
Line 30: Line 30:
 ===== Noțiuni teoretice ===== ===== Noțiuni teoretice =====
  
-Dezvoltarea Internet-ului a dus la creșterea exponențială a aplicațiilor de rețea și, drept  consecință,​ la creșterea cerințelor de viteza și productivitate a subsistemului de rețea (networking) al unui sistem de operare. Subsistemul de networking nu este o componentă esențială a nucleului unui sistem de operare (kernel-ul ​de Linux poate fi compilat fără suport de rețea). Este, însă, destul de puțin probabil pentru un sistem de calcul (sau chiar un dispozitiv embedded) să conțină un sistem de operare fără suport de rețea, datorită nevoii de conectivitate. Atât sistemele Linux (Unix), cât și Windows folosesc [[http://​en.wikipedia.org/​wiki/​TCP/​IP_model|stiva TCP/IP]]. Nucleul acestora va conține implementate protocoalele până la nivelul transport inclusiv, urmând ca protocoalele de nivel aplicație să fie implementate în user-space (HTTP, FTP, SSH, etc.).+Dezvoltarea Internet-ului a dus la creșterea exponențială a aplicațiilor de rețea și, drept  consecință,​ la creșterea cerințelor de viteza și productivitate a subsistemului de rețea (networking) al unui sistem de operare. Subsistemul de networking nu este o componentă esențială a nucleului unui sistem de operare (kernel-ul Linux poate fi compilat fără suport de rețea). Este, însă, destul de puțin probabil pentru un sistem de calcul (sau chiar un dispozitiv embedded) să conțină un sistem de operare fără suport de rețea, datorită nevoii de conectivitate. Atât sistemele Linux (Unix), cât și Windows folosesc [[http://​en.wikipedia.org/​wiki/​TCP/​IP_model|stiva TCP/IP]]. Nucleul acestora va conține implementate protocoalele până la nivelul transport inclusiv, urmând ca protocoalele de nivel aplicație să fie implementate în user-space (HTTP, FTP, SSH, etc.).
  
 ==== Networking în user-space ==== ==== Networking în user-space ====
Line 157: Line 157:
  
 Parametrii acestor funcții sunt următorii: Parametrii acestor funcții sunt următorii:
-  * ''​msg'',​ o structura [[http://lxr.free-electrons.com/​source/​include/​linux/​socket.h?v=4.9#L47|struct msghdr]], ce conține mesajul de transmis/​recepționat. Dintre componentele importante ale acestei structuri avem ''​msg_name''​ și ''​msg_namelen'',​ care, pentru sockeți ''​UDP'',​ trebuie completate cu adresa la care se transmite mesajul ([[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​in.h?v=4.9#L227|struct sockaddr_in]]) +  * ''​msg'',​ o structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​socket.h#​L48|struct msghdr]], ce conține mesajul de transmis/​recepționat. Dintre componentele importante ale acestei structuri avem ''​msg_name''​ și ''​msg_namelen'',​ care, pentru sockeți ''​UDP'',​ trebuie completate cu adresa la care se transmite mesajul ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​in.h#​L229|struct sockaddr_in]]) 
-  * ''​vec'',​ o structură [[http://lxr.free-electrons.com/​source/​include/​linux/​uio.h?v=4.9#L18|struct kvec]], ce conține un pointer către buffer-ul ce conține datele și dimensiunea acestuia; după cum se poate observa, are o structură similară cu structura [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​uio.h?v=4.9#L16|struct iovec]] (structura [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​uio.h?v=4.9#L16|struct iovec]] corespunde datelor user space, iar structura [[http://lxr.free-electrons.com/​source/​include/​linux/​uio.h?v=4.9#L18|struct kvec]] corespunde datelor kernel space)+  * ''​vec'',​ o structură [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​uio.h#​L19|struct kvec]], ce conține un pointer către buffer-ul ce conține datele și dimensiunea acestuia; după cum se poate observa, are o structură similară cu structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​uio.h#​L17|struct iovec]] (structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​uio.h#​L17|struct iovec]] corespunde datelor user space, iar structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​uio.h#​L19|struct kvec]] corespunde datelor kernel space)
  
-Modul de lucru cu funcțiile de transmitere poate fi urmărit în cadrul handler-ului pentru apelul de sistem [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L1618|sys_sendto]]:​+Modul de lucru cu funcțiile de transmitere poate fi urmărit în cadrul handler-ului pentru apelul de sistem [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L1691|sys_sendto]]:​
 <code c> <code c>
 SYSCALL_DEFINE6(sendto,​ int, fd, void __user *, buff, size_t, len, SYSCALL_DEFINE6(sendto,​ int, fd, void __user *, buff, size_t, len,
Line 205: Line 205:
 === Câmpuri ale structurii socket === === Câmpuri ale structurii socket ===
  
-Structura [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L101|struct socket]]:+Structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L100|struct socket]]:
 <code c> <code c>
 /** /**
Line 220: Line 220:
  socket_state state;​  socket_state state;​
  
- kmemcheck_bitfield_begin(type);​ 
  short type;​  short type;​
- kmemcheck_bitfield_end(type);​ 
  
  unsigned long flags;​  unsigned long flags;​
Line 240: Line 238:
 === Structura proto_ops === === Structura proto_ops ===
  
-Structura [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L136|struct proto_ops]] conține implementările operațiilor specifice protocolului implementat (''​TCP'',​ ''​UDP'',​ etc.); funcțiile de aici vor fi apelate din funcțiile generice de lucru cu [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L101|struct socket]] ([[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L571|sock_release]],​ [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L626|sock_sendmsg]],​ etc.)+Structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L133|struct proto_ops]] conține implementările operațiilor specifice protocolului implementat (''​TCP'',​ ''​UDP'',​ etc.); funcțiile de aici vor fi apelate din funcțiile generice de lucru cu [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L100|struct socket]] ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L588|sock_release]],​ [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L643|sock_sendmsg]],​ etc.)
  
-Structura [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L136|struct proto_ops]] conține, așadar, o serie de pointeri de funcții pentru implementări specifice de protocol:+Structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L133|struct proto_ops]] conține, așadar, o serie de pointeri de funcții pentru implementări specifice de protocol:
 <code c> <code c>
 struct proto_ops { struct proto_ops {
Line 260: Line 258:
  int (*getname) ​  ​(struct socket *sock,  int (*getname) ​  ​(struct socket *sock,
        struct sockaddr *addr,        struct sockaddr *addr,
-       ​int *sockaddr_len, ​int peer);+       int peer);
  //...  //...
 </​code>​ </​code>​
  
-Inițializarea câmpului ''​ops''​ din [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L101|struct socket]] se realizează în funcția [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L1097|__sock_create]],​ prin apelul funcției [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L202|create]] specifică protocolului;​ un apel echivalent este cel din [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L1168|implementarea funcției __sock_create]]:​+Inițializarea câmpului ''​ops''​ din [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L100|struct socket]] se realizează în funcția [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L1196|__sock_create]],​ prin apelul funcției [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L207|create]] specifică protocolului;​ un apel echivalent este cel din [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L1267|implementarea funcției __sock_create]]:​
 <code c> <code c>
 //... //...
Line 273: Line 271:
 </​code>​ </​code>​
  
-Se va realiza astfel instanțierea pointerilor de funcții cu apeluri specifice tipului de protocol asociat socket-ului. Apelurile [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L2436|sock_register]] și [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L2469|sock_unregister]] sunt folosite pentru completarea vectorului [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#​L158|net_families]].+Se va realiza astfel instanțierea pointerilor de funcții cu apeluri specifice tipului de protocol asociat socket-ului. Apelurile [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L2512|sock_register]] și [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L2545|sock_unregister]] sunt folosite pentru completarea vectorului [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L158|net_families]].
  
 Pentru restul operațiilor cu socketi (în afară de creare, închidere și transmitere/​recepție mesaj, prezentate mai sus, în secțiunea [[#​Operații asupra structurii socket|Operații asupra structurii socket]]), se vor apela funcțiile date de pointerii din această structură. Spre exemplu, pentru operația ''​bind'',​ care asociază unui socket un port pe mașina locală, vom avea următoarea secvență de cod: Pentru restul operațiilor cu socketi (în afară de creare, închidere și transmitere/​recepție mesaj, prezentate mai sus, în secțiunea [[#​Operații asupra structurii socket|Operații asupra structurii socket]]), se vor apela funcțiile date de pointerii din această structură. Spre exemplu, pentru operația ''​bind'',​ care asociază unui socket un port pe mașina locală, vom avea următoarea secvență de cod:
Line 293: Line 291:
 </​code>​ </​code>​
  
-După cum se poate observa, pentru transmiterea informațiilor legate de adresa și portul care se vor asocia socket-ului,​ se completează o structură [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​in.h?v=4.9#L227|struct sockaddr_in]]. ((hton* -- despre funcțiile ''​htons'',​ ''​htonl''​ vom discuta la secțiunea [[#​Conversii|Conversii]].))+După cum se poate observa, pentru transmiterea informațiilor legate de adresa și portul care se vor asocia socket-ului,​ se completează o structură [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​in.h#​L229|struct sockaddr_in]]. ((hton* -- despre funcțiile ''​htons'',​ ''​htonl''​ vom discuta la secțiunea [[#​Conversii|Conversii]].))
  
 ==== Structura sock ==== ==== Structura sock ====
  
-Structura [[http://lxr.free-electrons.com/​source/​include/​net/​sock.h?v=4.9#L232|struct sock]] descrie un //INET socket//. O astfel de structură este asociată unui socket creat în user-space și, implicit, unei structuri [[http://​lxr.free-electrons.com/​source/​include/​linux/​net.h?​v=4.9#​L101|struct socket]]. Structura este folosită pentru a menține informații despre starea unei conexiuni. Câmpurile structurii și operațiile asociate încep, de obicei, cu șirul ''​sk_''​. Câteva câmpuri sunt prezentate mai jos:+Structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​net/​sock.h#​L234|struct sock]] descrie un //INET socket//. O astfel de structură este asociată unui socket creat în user-space și, implicit, unei structuri [[http://​lxr.free-electrons.com/​source/​include/​linux/​net.h?​v=4.9#​L101|struct socket]]. Structura este folosită pentru a menține informații despre starea unei conexiuni. Câmpurile structurii și operațiile asociate încep, de obicei, cu șirul ''​sk_''​. Câteva câmpuri sunt prezentate mai jos:
 <code c> <code c>
 struct sock { struct sock {
  //...  //...
- unsigned int sk_padding : 2,+ unsigned int sk_padding : 1,
  sk_no_check_tx : 1,  sk_no_check_tx : 1,
  sk_no_check_rx : 1,  sk_no_check_rx : 1,
Line 328: Line 326:
   * pointerii de funcții de la sfârșit sunt callback-uri pentru diverse situații.   * pointerii de funcții de la sfârșit sunt callback-uri pentru diverse situații.
  
-Inițializarea ''​struct sock''​ și atașarea acesteia la un socket BSD se face cu ajutorul callback-ului [[http://lxr.free-electrons.com/​source/​include/​linux/​net.h?v=4.9#L202|create]] din [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#​L158|net_families]] (apelat in [[http://lxr.free-electrons.com/​source/​net/​socket.c?v=4.9#L1097|__sock_create]]). Mai jos este prezentat modul de +Inițializarea ''​struct sock''​ și atașarea acesteia la un socket BSD se face cu ajutorul callback-ului [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​net.h#​L207|create]] din [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L158|net_families]] (apelat in [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L1196|__sock_create]]). Mai jos este prezentat modul de 
-inițializare a structurii ''​struct sock''​ pentru protocolul IP, în cadrul funcției [[http://lxr.free-electrons.com/​source/​net/​ipv4/​af_inet.c?v=4.9#L240|inet_create]]:​+inițializare a structurii ''​struct sock''​ pentru protocolul IP, în cadrul funcției [[https://elixir.bootlin.com/​linux/​v4.15/​source/​net/​ipv4/​af_inet.c#​L241|inet_create]]:​
 <code c> <code c>
 /* /*
Line 364: Line 362:
 ==== Structura sk_buff ==== ==== Structura sk_buff ====
  
-Structura [[http://lxr.free-electrons.com/​source/​include/​linux/​skbuff.h?v=4.9#L565|struct sk_buff]] (//socket buffer//) descrie un pachet de rețea. Câmpurile structurii conțin informații atât despre antetele și conținutul pachetelor cât și protocoalele utilizate, dispozitivul de rețea utilizat, pointeri către celelalte structuri ''​struct sk_buff''​. O descriere sumară a conținutului structurii este prezentată mai jos:+Structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​skbuff.h#​L585|struct sk_buff]] (//socket buffer//) descrie un pachet de rețea. Câmpurile structurii conțin informații atât despre antetele și conținutul pachetelor cât și protocoalele utilizate, dispozitivul de rețea utilizat, pointeri către celelalte structuri ''​struct sk_buff''​. O descriere sumară a conținutului structurii este prezentată mai jos:
 <code c> <code c>
-struct sk_buff { 
 struct sk_buff { struct sk_buff {
  union {  union {
Line 375: Line 372:
  
  union {  union {
- ktime_t tstamp+ struct net_device *dev
- struct skb_mstamp skb_mstamp;+ /* Some protocols might use this space to store information,​ 
 + * while device pointer would be NULL. 
 + * UDP receive path is one user. 
 + */ 
 + unsigned long dev_scratch;
  };  };
  };  };
 +
  struct rb_node rbnode;​ /* used in netem & tcp stack */  struct rb_node rbnode;​ /* used in netem & tcp stack */
  };  };
  struct sock *sk;  struct sock *sk;
- struct net_device *dev;+ 
 +        union { 
 +  ktime_t tstamp; 
 + u64 skb_mstamp;​ 
 + };
  
  /*  /*
Line 394: Line 400:
  unsigned long _skb_refdst;​  unsigned long _skb_refdst;​
  void (*destructor)(struct sk_buff *skb);  void (*destructor)(struct sk_buff *skb);
 +        union { 
 +         ​ struct { 
 +  unsigned long _skb_refdst;​ 
 + void (*destructor)(struct sk_buff *skb); 
 + }; 
 + struct list_head tcp_tsorted_anchor;​ 
 + };
  /* ... */  /* ... */
  
Line 401: Line 413:
  __u16 mac_len,​  __u16 mac_len,​
  hdr_len;​  hdr_len;​
- 
-         /* ... */ 
- 
-         ​void ​                   (*destructor)(struct sk_buff *skb); 
  
          /* ... */          /* ... */
Line 423: Line 431:
  *data;  *data;
  unsigned int truesize;​  unsigned int truesize;​
- atomic_t users;+ refcount_t users;
 }; };
 </​code>​ </​code>​
Line 432: Line 440:
   * ''​sk''​ este socket-ul asociat buffer-ului;​   * ''​sk''​ este socket-ul asociat buffer-ului;​
   * ''​destructor''​ este apelul callback de dealocare a buffer-ului;​   * ''​destructor''​ este apelul callback de dealocare a buffer-ului;​
-  * ''​transport_header'',​ ''​network header''​ și ''​mac_header''​ sunt offset-uri între începutul pachetului si începutul diverselor headere din pachet. Ele sunt menținute intern de diversele niveluri de procesare prin care trece pachetul. Pentru a obține pointeri către headere, folosiți una din următoarele funcții: [[http://lxr.free-electrons.com/​source/​include/​linux/​tcp.h?v=4.9#​L28|tcp_hdr]],​ [[http://lxr.free-electrons.com/​source/​include/​linux/​udp.h?v=4.9#​L25|udp_hdr]],​ [[http://lxr.free-electrons.com/​source/​include/​linux/​ip.h?v=4.9#​L23|ip_hdr]],​ etc. În principiu, fiecare protocol oferă o funcție de a obține o referință la header-ul respectivului protocol din cadrul unui pachet primit. De reținut: câmpul ''​network_header''​ nu este setat decât după ce pachetul ajunge la nivelul rețea, iar câmpul ''​transport_header''​ nu este setat decât după ce pachetul ajunge la nivelul transport.+  * ''​transport_header'',​ ''​network header''​ și ''​mac_header''​ sunt offset-uri între începutul pachetului si începutul diverselor headere din pachet. Ele sunt menținute intern de diversele niveluri de procesare prin care trece pachetul. Pentru a obține pointeri către headere, folosiți una din următoarele funcții: [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​tcp.h#​L28|tcp_hdr]],​ [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​udp.h#​L25|udp_hdr]],​ [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​ip.h#​L23|ip_hdr]],​ etc. În principiu, fiecare protocol oferă o funcție de a obține o referință la header-ul respectivului protocol din cadrul unui pachet primit. De reținut: câmpul ''​network_header''​ nu este setat decât după ce pachetul ajunge la nivelul rețea, iar câmpul ''​transport_header''​ nu este setat decât după ce pachetul ajunge la nivelul transport.
  
-Structura unui [[https://​en.wikipedia.org/​wiki/​IPv4#​Header|antet IP]] ([[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​ip.h?v=4.9#L85|struct iphdr]]) are următoarele câmpuri:+Structura unui [[https://​en.wikipedia.org/​wiki/​IPv4#​Header|antet IP]] ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​ip.h#​L86|struct iphdr]]) are următoarele câmpuri:
 <code c> <code c>
 struct iphdr { struct iphdr {
Line 464: Line 472:
   * ''​daddr''​ reprezintă adresa IP a nodului destinație.   * ''​daddr''​ reprezintă adresa IP a nodului destinație.
  
-Structura unui [[https://​en.wikipedia.org/​wiki/​Transmission_Control_Protocol#​TCP_segment_structure|antet TCP]] ([[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​tcp.h?v=4.9#L24|struct tcphdr]]) are următoarele câmpuri:+Structura unui [[https://​en.wikipedia.org/​wiki/​Transmission_Control_Protocol#​TCP_segment_structure|antet TCP]] ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​tcp.h#​L25|struct tcphdr]]) are următoarele câmpuri:
 <code c> <code c>
 struct tcphdr { struct tcphdr {
Line 505: Line 513:
   * ''​syn'',​ ''​ack'',​ ''​fin''​ sunt flag-uri folosite în protocolul TCP; pentru detalii studiați această [[http://​www.eventhelix.com/​Realtimemantra/​Networking/​Tcp.pdf|diagramă]].   * ''​syn'',​ ''​ack'',​ ''​fin''​ sunt flag-uri folosite în protocolul TCP; pentru detalii studiați această [[http://​www.eventhelix.com/​Realtimemantra/​Networking/​Tcp.pdf|diagramă]].
  
-Structura unui [[https://​en.wikipedia.org/​wiki/​User_Datagram_Protocol#​Packet_structure|antet UDP]] ([[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​udp.h?v=4.9#L22|struct udphdr]]) are următoarele câmpuri:+Structura unui [[https://​en.wikipedia.org/​wiki/​User_Datagram_Protocol#​Packet_structure|antet UDP]] ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​udp.h#​L23|struct udphdr]]) are următoarele câmpuri:
 <code c> <code c>
 struct udphdr { struct udphdr {
Line 540: Line 548:
  
 Pentru conversie există urmatoarele macrodefiniții:​ Pentru conversie există urmatoarele macrodefiniții:​
-  * ''​u16 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#L140|htons]]''​(u16 x)''​+  * ''​u16 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L141|htons]]''​(u16 x)''​
     * convertește un întreg pe 16 biți din host byte-order în network byte-order (//host to network short//)     * convertește un întreg pe 16 biți din host byte-order în network byte-order (//host to network short//)
-  * ''​u32 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#L138|htonl]]''​(u32 x)''​+  * ''​u32 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L139|htonl]]''​(u32 x)''​
     * convertește un întreg pe 32 de biți din host byte-order în network byte-order (//host to network long//)     * convertește un întreg pe 32 de biți din host byte-order în network byte-order (//host to network long//)
-  * ''​u16 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#​L141|ntohs]]''​(u16 x)''​+  * ''​u16 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L141|ntohs]]''​(u16 x)''​
     * convertește un întreg pe 16 biți din network byte-order în host byte-order (//network to host short//)     * convertește un întreg pe 16 biți din network byte-order în host byte-order (//network to host short//)
-  * ''​u32 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#​L139|ntohl]]''​(u32 x)''​+  * ''​u32 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L139|ntohl]]''​(u32 x)''​
     * convertește un întreg pe 32 de biți din network byte-order în host byte-order (//network to host long//)     * convertește un întreg pe 32 de biți din network byte-order în host byte-order (//network to host long//)
  
Line 555: Line 563:
 În kernel-ul Linux, captura de pachete folosind netfilter se realizează prin atașarea unor hook-uri. Hook-urile pot fi precizate în diferite locații din traseul urmat de un pachet de rețea în kernel, în funcție de necesitate. O organigramă cu traseul urmat de un pachet și zonele posibile de plasare a unui hook găsiți [[http://​linux-ip.net/​nf/​nfk-traversal.png|aici]]. În kernel-ul Linux, captura de pachete folosind netfilter se realizează prin atașarea unor hook-uri. Hook-urile pot fi precizate în diferite locații din traseul urmat de un pachet de rețea în kernel, în funcție de necesitate. O organigramă cu traseul urmat de un pachet și zonele posibile de plasare a unui hook găsiți [[http://​linux-ip.net/​nf/​nfk-traversal.png|aici]].
  
-Header-ul inclus atunci când se folosește netfilter este [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9|linux/​netfilter.h]].+Header-ul inclus atunci când se folosește netfilter este [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h|linux/​netfilter.h]].
  
-Un hook se definește prin intermediul structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L65|struct nf_hook_ops]]:​ <code c>+Un hook se definește prin intermediul structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L64|struct nf_hook_ops]]:​ <code c>
 struct nf_hook_ops { struct nf_hook_ops {
- struct list_head ​       list; 
- 
  /* User fills in from here down. */  /* User fills in from here down. */
  nf_hookfn ​              ​*hook;​  nf_hookfn ​              ​*hook;​
Line 572: Line 578:
 </​code>​ </​code>​
  
-În cadrul structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L65|struct nf_hook_ops]],​ ''​pf''​ este tipul pachetului ([[http://lxr.free-electrons.com/​source/​include/​linux/​socket.h?v=4.9#L212|PF_INET]], etc.). ''​priority''​ este prioritatea;​ prioritățile sunt definite în [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​netfilter_ipv4.h?v=4.9|uapi/​linux/​netfilter_ipv4.h]]:<​code c>+În cadrul structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L64|struct nf_hook_ops]],​ ''​pf''​ este tipul pachetului ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​socket.h#​L217|PF_INET]], etc.). ''​priority''​ este prioritatea;​ prioritățile sunt definite în [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​netfilter_ipv4.h|uapi/​linux/​netfilter_ipv4.h]]:<​code c>
 enum nf_ip_hook_priorities { enum nf_ip_hook_priorities {
  NF_IP_PRI_FIRST = INT_MIN,  NF_IP_PRI_FIRST = INT_MIN,
Line 593: Line 599:
 ''​net_device''​ reprezintă dispozitivul (interfața de rețea) pe care se dorește realizată captura. ''​net_device''​ reprezintă dispozitivul (interfața de rețea) pe care se dorește realizată captura.
  
-În momentul în care un pachet este capturat, modul de prelucrare este definit de câmpurile ''​hooknum''​ și ''​hook''​. ''​hooknum''​ este tipul de hook utilizat; pentru IP, tipurile de hook-uri sunt definite în [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​netfilter.h?v=4.9|linux/​netfilter.h]]:<​code c>+În momentul în care un pachet este capturat, modul de prelucrare este definit de câmpurile ''​hooknum''​ și ''​hook''​. ''​hooknum''​ este tipul de hook utilizat; pentru IP, tipurile de hook-uri sunt definite în [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​netfilter.h|linux/​netfilter.h]]:<​code c>
 enum nf_inet_hooks { enum nf_inet_hooks {
  NF_INET_PRE_ROUTING,​  NF_INET_PRE_ROUTING,​
Line 604: Line 610:
 </​code>​ </​code>​
  
-''​hook''​ este handler-ul apelat in momentul capturării unui pachet de rețea (pachet transmis în forma unei structuri ''​struct sk_buff''​). Câmpul ''​priv''​ reprezintă o informație privată transmisă handler-ului. Prototipul handler-ului de captură este definit de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L62|nf_hookfn]]:​ <code c>+''​hook''​ este handler-ul apelat in momentul capturării unui pachet de rețea (pachet transmis în forma unei structuri ''​struct sk_buff''​). Câmpul ''​priv''​ reprezintă o informație privată transmisă handler-ului. Prototipul handler-ului de captură este definit de tipul [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L61|nf_hookfn]]:​ <code c>
 struct nf_hook_state { struct nf_hook_state {
  unsigned int hook;  unsigned int hook;
- int thresh; 
  u_int8_t pf;  u_int8_t pf;
  struct net_device *in;  struct net_device *in;
Line 613: Line 618:
  struct sock *sk;  struct sock *sk;
  struct net *net;  struct net *net;
- struct nf_hook_entry __rcu *hook_entries;​ 
  int (*okfn)(struct net *, struct sock *, struct sk_buff *);  int (*okfn)(struct net *, struct sock *, struct sk_buff *);
 }; };
Line 623: Line 627:
 </​code>​ </​code>​
  
-În cazul funcției de captură de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L62|nf_hookfn]],​ câmpul ''​priv''​ reprezintă informația privată cu care a fost inițializată structura de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L65|struct nf_hook_ops]]. ''​skb''​ este pointer la pachet-ul de rețea capturat; pe baza informațiilor din ''​skb''​ se iau deciziile de filtrare a pachetului. Parametrul ''​state''​ al funcției reprezintă informațiile de stare legate de captura pachetului, incluzând interfața de intrare, interfața de ieșire, prioritatea,​ numărul hook-ului. Prioritatea și numărul hook-ului sunt utile pentru a permite ca aceeași funcție să fie apelată de mai multe hook-uri.+În cazul funcției de captură de tipul [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L61|nf_hookfn]],​ câmpul ''​priv''​ reprezintă informația privată cu care a fost inițializată structura de tipul [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L64|struct nf_hook_ops]]. ''​skb''​ este pointer la pachet-ul de rețea capturat; pe baza informațiilor din ''​skb''​ se iau deciziile de filtrare a pachetului. Parametrul ''​state''​ al funcției reprezintă informațiile de stare legate de captura pachetului, incluzând interfața de intrare, interfața de ieșire, prioritatea,​ numărul hook-ului. Prioritatea și numărul hook-ului sunt utile pentru a permite ca aceeași funcție să fie apelată de mai multe hook-uri.
  
-Un handler de captură poate întoarce una din [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​netfilter.h?v=4.9#​L10|constantele NF_*]]: <code c>+Un handler de captură poate întoarce una din [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​netfilter.h#​L10|constantele NF_*]]: <code c>
 /* Responses from hook functions. */ /* Responses from hook functions. */
 #define NF_DROP 0 #define NF_DROP 0
Line 638: Line 642:
 ''​NF_DROP''​ este folosit pentru a filtra (ignora) un pachet, iar ''​NF_ACCEPT''​ este folosit pentru a accepta un pachet și a-l transmite mai departe. ''​NF_DROP''​ este folosit pentru a filtra (ignora) un pachet, iar ''​NF_ACCEPT''​ este folosit pentru a accepta un pachet și a-l transmite mai departe.
  
-Înregistrarea/​deînregistrarea unui hook se realizează cu ajutorul funcțiilor definite în [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9|linux/​netfilter.h]]:​ <code c>+Înregistrarea/​deînregistrarea unui hook se realizează cu ajutorul funcțiilor definite în [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h|linux/​netfilter.h]]:​ <code c>
 /* Function to register/​unregister hook points. */ /* Function to register/​unregister hook points. */
 int nf_register_net_hook(struct net *net, const struct nf_hook_ops *ops); int nf_register_net_hook(struct net *net, const struct nf_hook_ops *ops);
Line 724: Line 728:
 **Observație:​** numele comenzii este ''​nc'';​ de multe ori ''​netcat''​ este un alias pentru această comandă. Există și alte implementări ale comenzii netcat, unele având parametrii puțin diferiți față de implementarea clasică. Consultați ''​man nc''​ sau rulați ''​nc -h''​ pentru a vedea modul de utilizare. **Observație:​** numele comenzii este ''​nc'';​ de multe ori ''​netcat''​ este un alias pentru această comandă. Există și alte implementări ale comenzii netcat, unele având parametrii puțin diferiți față de implementarea clasică. Consultați ''​man nc''​ sau rulați ''​nc -h''​ pentru a vedea modul de utilizare.
  
-Pentru mai multe informații despre netcat, citiți acest [[http://team5150.com/~random/apps/netcat/Netcat_Tutorial.pdf|tutorial]].+Pentru mai multe informații despre netcat, citiți acest [[https://www.win.tue.nl/~aeb/linux/hh/netcat_tutorial.pdf|tutorial]].
  
 ===== Resurse utile ===== ===== Resurse utile =====
Line 730: Line 734:
   * Understanding Linux Network Internals   * Understanding Linux Network Internals
   * [[http://​www.cs.unh.edu/​cnrg/​gherrin/​|Linux IP networking]]   * [[http://​www.cs.unh.edu/​cnrg/​gherrin/​|Linux IP networking]]
-  * [[http://​www.ecsl.cs.sunysb.edu/​elibrary/​linux/​network/​LinuxKernel.pdf|Linux Networking Kernel]] 
   * [[http://​www.stllinux.org/​meeting_notes/​2001/​0719/​myTUX/​|The TUX Web Server]]   * [[http://​www.stllinux.org/​meeting_notes/​2001/​0719/​myTUX/​|The TUX Web Server]]
-  * [[http://www.beej.us/guide/bgnet/output/html/multipage/|Beej'​s Guide to Network Programming Using Internet Sockets]]+  * [[http://​beej.us/​net2/bgnet.html|Beej'​s Guide to Network Programming Using Internet Sockets]]
   * [[http://​www.linuxjournal.com/​article/​7660|Kernel Korner - Network Programming in the Kernel]]   * [[http://​www.linuxjournal.com/​article/​7660|Kernel Korner - Network Programming in the Kernel]]
-  * [[http://www.phrack.org/​issues.html?​issue=61&id=13&​mode=txt|Hacking the Linux Kernel Network Stack]]+  * [[http://​phrack.org/​issues/61/13.html|Hacking the Linux Kernel Network Stack]]
   * [[http://​www.netfilter.org/​|The netfilter.org project]]   * [[http://​www.netfilter.org/​|The netfilter.org project]]
-  * [[http://www.topsight.net/article.php?​story=2003050621055083|Using Netfilter hooks]] +  * [[https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture|A Deep Dive Into Iptables and Netfilter Architecture]]
-  * [[http://www.6test.edu.cn/​~lujx/​linux_networking/​0131777203_ch19lev1sec3.html|The Netfilter Architecture ​of Linux 2.4]]+
   * [[http://​www.linuxfoundation.org/​en/​Net:​Main_Page|Linux Foundation Networking Page]]   * [[http://​www.linuxfoundation.org/​en/​Net:​Main_Page|Linux Foundation Networking Page]]
  
so2/laboratoare/lab10.1524988625.txt.gz · Last modified: 2018/04/29 10:57 by anda.nicolae
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0