Eine gute Entdeckung von Mike Penningtion (in den Kommentaren ), in der Sie eine detaillierte technische Beschreibung des Pfads einer Anforderung auf dem Network Stack finden und sichern (speziell für Linux OS 2005).
Ein genauerer Blick, wo die folgenden Schritte extrahiert wurden :
Beachten Sie, dass die aufgeführten Schritte bei weitem nicht so detailliert sind wie das oben erwähnte Dokument.
Das Betriebssystem verfügt über einen speziellen Dateideskriptor für den Ethernet-RX-Port.
The rx ring is a ring in the kernel memory where the network card transfers the incoming packet through DMA. The raw data which is stored in the rx ring structure is either copied into a sk buff structure.
Daraufhin wird eine ISR ausgelöst, um das Paket auf die Netzwerkschicht zu verschieben. Beachten Sie, dass hier festgelegt wird, ob das Paket verarbeitet oder weitergeleitet werden soll (was interessant war, wie ich mir vorstellen kann, wie das Aktivieren der Weiterleitung funktioniert, wie für VPNs).
Wenn gültig, wird es auf die IP-Schicht verschoben. Er prüft sein Protokoll (vom IP-Header) und ruft die tcp v4 rcv
Funktion auf, wenn TCP das Protokoll ist, und bewegt sich auf die TCP-Schicht.
Und dieser Teil ist entscheidend:
The next step for this function is to find an open socket for this incoming packet,
Dies geschieht durch Aufruf des tcp v4 lookup
, im folgenden Codesegment:
sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source, skb->nh.iph->daddr, ntohs(th->dest), tcp_v4_iif(skb));
Im Wesentlichen ist festzustellen, dass es eine LUT gibt, die den TCP-Socket der Quell- und Zieladresse / den Ports der Socketverbindung zuordnet, wie durch diesen Funktionsaufruf angegeben.
Wenn ein gültiger Socket vorhanden ist, werden die Daten in tcp_data_queue
den Stack eingefügt, um den Anwendungsverbrauch zu erhöhen.