В чем различия между буфером ядра, буфером сокета TCP и скользящим окном - PullRequest
0 голосов
/ 09 декабря 2018

Вот мое понимание входящего потока данных в TCP / IP

  1. Ядро считывает данные в свой буфер из сетевого интерфейса
  2. Ядро копирует данные из своего буфера в TCP Socket Buffer, гдеРаботает скользящее окно
  3. Программа, заблокированная read (), активируется и копирует данные из буфера сокета.

Я немного запутался, где находится скользящее окноили это так же, как буфер сокета

1 Ответ

0 голосов
/ 09 декабря 2018

Linux не обрабатывает скользящее окно TCP как отдельный буфер, а несколько индексов, указывающих, сколько уже получено / прочитано.Процесс обработки пакетов в ядре Linux может быть описан многими способами и может быть разбит на маленькие части по мере углубления, но общий процесс выглядит следующим образом:

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

Здесь важно помнить, что копии - это самое плохое в производительности.Следовательно, ядро ​​всегда (если не обязательно) будет избегать копий и использовать вместо них указатели.

...