Linux не обрабатывает скользящее окно TCP как отдельный буфер, а несколько индексов, указывающих, сколько уже получено / прочитано.Процесс обработки пакетов в ядре Linux может быть описан многими способами и может быть разбит на маленькие части по мере углубления, но общий процесс выглядит следующим образом:
- Ядро готовится к приему данных по сетиИнтерфейс, он подготавливает структуры данных SKB (Socket Buffer) и сопоставляет их с буферным кольцом DMA интерфейса Rx.
- Когда пакеты приходят, они заполняют эти предварительно сконфигурированные буферы и уведомляют ядро в контексте прерывания о прибытии пакетов.В этом контексте буферы перемещаются в очередь recv для сетевого стека, чтобы обрабатывать их из контекста прерывания.
- Сетевой стек извлекает эти пакеты и обрабатывает их соответствующим образом, в конечном итоге поступая на уровень TCP (еслиэто действительно TCP-пакеты), которые, в свою очередь, обрабатывают окно.
- См.
struct tcp_sock
member u32 rcv_wnd
, который затем используется в tp->rcvq_space.space
как пространство для каждого соединения, оставленное в окне. - Буфер добавляется в очередь приема сокетов и соответственно читается как потоковые данные в
tcp_recvmsg()
Здесь важно помнить, что копии - это самое плохое в производительности.Следовательно, ядро всегда (если не обязательно) будет избегать копий и использовать вместо них указатели.