Хорошая находка от Mike Penningtion (в комментариях ), где можно найти подробное техническое описание пути запроса по сетевому стеку и резервному копированию (специфично для ОС Linux 2005).
Более подробный обзор, из которого были извлечены следующие шаги :
Обратите внимание, что хотя перечисленные шаги не так подробны, как в документе, упомянутом выше, примерно эти шаги:
ОС имеет выделенный файловый дескриптор для порта Ethernet Ethernet,
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.
Затем запускается ISR для перемещения пакета на сетевой уровень. Обратите внимание, что здесь выбирается, обрабатывать ли пакет или пересылать его (что было интересно, так как я думаю, возможно, именно так работает включение пересылки, например, для VPN)
Если он действителен, он переходит на IP-уровень. Он проверяет свой протокол (из заголовка IP) и, если протокол TCP, вызывает tcp v4 rcv
функцию, тем самым переходя на уровень TCP.
И эта часть имеет решающее значение:
The next step for this function is to find an open socket for this incoming packet,
это делается путем вызова tcp v4 lookup
, в следующем сегменте кода:
sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source, skb->nh.iph->daddr, ntohs(th->dest), tcp_v4_iif(skb));
По сути, я понял, что существует LUT, сопоставляющий сокет TCP с адресом / портом источника и получателя соединения сокета, как указано в этом вызове функции.
Если существует допустимый сокет, данные помещаются в tcp_data_queue
стек для использования приложения.