next up previous contents
Next: TCP/UDP Up: Netzwerkkommunikation Previous: BSD-Socket   Contents

INET-Socket

Die INET-Socket-Schicht verwaltet die netzwerkspezifischen Teile des Sockets für die AF_INET Adressfamilie. Hier ist unter anderem die Implementation der TCP/IP Protokoll-Suite in Linux festgeschrieben. Die Struktur struct sock [include/net/sock.h] bildet die Grundlage der Implementation. Da diese Struktur hier im einzelnen zu lang und zu detailliert wäre, seien hier nur die wichtigsten Elemente (stark gekürzt) erklärt:

struct sock { 
 
  __u32 daddr; 
  __u16 dport; 
  __u32 saddr; 
  __u16 sport;
Quell- und Zieladresse, sowie Portnummer.

  struct sk_buff_head receive_queue;
Liste von sk_buff (s.o.) Strukturen der auf den Socket ankommenden Pakete.

  struct sk_buff_head write_queue;
Liste von sk_buff (s.o.) Strukturen der vom den Socket zu sendenden Pakete.

struct proto *prot;
Struktur mit Zeigern auf die einzelnen Funktionen der Transport-Schicht.

 union { 
    struct tcp_opt af_tcp;  
    struct raw_opt tp_raw4; 
    struct raw6_opt tp_raw; 
    struct spx_opt af_spx; 
  } tp_pinfo;
Struktur mit den Informationen zum jeweiligen Transport Protokoll. Bei TCP (struct tcp_opt) z.B. die Sequenznummern, diverse Zähler (z.B. für ''slow start'' und ''congestion control''), Timestamps und statistische Daten.

  union { 
    void *destruct_hook; 
    struct unix_opt af_unix; 
    struct inet_opt af_inet; 
    struct atalk_sock af_at; 
    struct ipx_opt af_ipx; 
    x25_cb *x25; 
    struct pppox_opt *pppox; 
    struct netlink_opt *af_netlink; 
    struct atm_vcc *af_atm; 
    struct irda_sock *irda; 
    struct wanpipe_opt *af_wanpipe; 
    ... 
  } protinfo;
Hier werden private Daten der jeweiligen Adressfamilie des benutzten Protokolls in der ''network'' Schicht gespeichert.

  ... 
};
In [net/ipv4/af_inet.c] sind die einzelnen Funktionen der INET Adressfamilie implementiert. Dies sind im wesentlichen:

inet_stream_connect(struct socket *sock, struct sockaddr * uaddr, int addr_len, int flags);

inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, int addr_len, int flags); extern inet_accept(struct socket *sock,

inet_listen(struct socket *sock, int backlog);

inet_accept(struct socket *sock, struct socket *newsock, int flags);

inet_recvmsg(struct socket *sock, struct msghdr *ubuf, int size, int flags, struct scm_cookie *scm);

inet_sendmsg(struct socket *sock, struct msghdr *msg, int size, struct scm_cookie *scm);

inet_shutdown(struct socket *sock, int how);

inet_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen);

inet_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen);

Diese Funktionen werden von den Funktionen der BSD-Socketschicht aufgerufen und rufen ihrerseits wieder über den prot Eintrag in der sock Struktur die Funktionen der entsprechenden Transportschicht (TCP/UDP) auf.

Ein Auszug aus der Struktur struct proto welche die Zeiger auf diese Funktionen bereithält:

struct proto { 
  void (*close)(struct sock *sk, long timeout); 
  int (*connect)(struct sock *sk, struct sockaddr *uaddr, int addr_len); 
  int (*disconnect)(struct sock *sk, int flags); 
  struct sock * (*accept) (struct sock *sk, int flags, int *err); 
  int (*ioctl)(struct sock *sk, int cmd, unsigned long arg); 
  int (*init)(struct sock *sk); 
  int (*destroy)(struct sock *sk); 
  void (*shutdown)(struct sock *sk, int how); 
  int (*setsockopt)(struct sock *sk, int level, int optname, char *optval, int optlen); 
  int (*getsockopt)(struct sock *sk, int level, int optname, char *optval, int *option); 
  int (*sendmsg)(struct sock *sk, struct msghdr *msg, int len); 
  int (*recvmsg)(struct sock *sk, struct msghdr *msg, int len, int noblock, int flags, int *addr_len); 
  int (*bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len); 
... 
};


next up previous contents
Next: TCP/UDP Up: Netzwerkkommunikation Previous: BSD-Socket   Contents
2002-02-17