Jedes Netzwerkpaket im Linux Kernel wird durch die sk_buff-Struktur repräsentiert, auf welcher die Funktionen des Linux Netzwerkstacks angewendet werden können. Diese Struktur bietet zum einen eine flexible Handhabung der Daten wenn diese zwischen zwei Netzwerkschichten übergeben werden müssen. Hierzu besitzt diese Struktur einen head und einen data Zeiger, sowie einen tail und einen end Zeiger, die jeweils Anfang und Ende des Pufferbereichs bzw. des Datenbereichs markieren. So wird durch Verschieben des data Pointers, mit wenig Aufwand den Protokoll-Header des darunterliegenden Protokolls für das darüberliegende entfernt, ohne Speicher kopieren zu müssen. Zum anderen bietet die sk_buff Struktur alle wichtigen Metadaten der einzelnen Netzwerkschichten in aufbereiteter Form.
Eine kurze Auflistung der wichtigsten Felder des sk_buff:
- next/prev - Listenzeiger
- list - Zeiger auf die aktuelle Liste
- sock - Zeiger auf den erzeugenden Socket
- dev - Zeiger auf ein struct net_device, von dem das Paket kommt oder für das das Paket bestimmt ist
- real_dev - Erweiterung zu dev (wird für VLAN gebraucht)
- h - Transport Layer Header; h.th für TCP, h.uh für UDP ...
- nh - Network Layer Header; nh.iph für IPv4
- mac - Link Layer Header
- dst - Zeiger auf ein struct dst_entry; Informationen über den weiteren Weg durch den Stack. Wird beim Routing erzeugt.
- cb - Control Buffer (privat)
- len, data_len - Informationen über die Größe der Daten
- csum - Checksummen Informationen
- protocol - Ethernet Protokoll ID (0x0800 für IP)
- data, tail - Zeiger auf Beginn und Ende des Datenbereichs
- head, end - Zeiger auf Beginn und Ende des Pufferbereichs
- nfct - Netfilter Conntrack. Enthält einen Zeiger auf das infos Array einer ip_conntrack Struktur
- nfmark - Feld zur Markierung der Pakete
- nfcache - Netfilter Caching Informationen
Klaus Rechert
2004-03-09