内核缓冲区、TCP 套接字缓冲区和滑动窗口有什么区别

asa*_*blo 6 networking tcp linux-kernel sliding-window

这是我对 TCP/IP 中传入数据流的理解

  1. 内核从网络接口读取数据到其缓冲区
  2. 内核将数据从其缓冲区复制到 TCP 套接字缓冲区,滑动窗口在其中工作
  3. 被read()阻塞的程序被唤醒并从套接字缓冲区复制数据。

我有点困惑滑动窗口位于哪里,或者它与套接字缓冲区相同

小智 10

Linux 并不将 TCP 的滑动窗口作为单独的缓冲区来处理,而是将其作为指示已接收/读取的数量的多个索引来处理。Linux内核数据包处理过程可以用多种方式描述,并且随着深入,可以分为几个小部分,但总体流程如下:

  1. 内核准备通过网络接口接收数据,它准备SKB(套接字缓冲区)数据结构并将它们映射到接口Rx DMA缓冲区环。
  2. 当数据包到达时,它们会填充这些预配置的缓冲区,并在数据包到达的中断上下文中通知内核。在这种情况下,缓冲区被移动到一个接收队列,以便网络堆栈在中断上下文之外处理它们。
  3. 网络堆栈检索这些数据包并相应地处理它们,最终到达 TCP 层(如果它们确实是 TCP 数据包),TCP 层又处理窗口。
  4. 查看struct tcp_sock成员u32 rcv_wnd,然后将其用作tp->rcvq_space.space窗口中留下的每个连接空间。
  5. 缓冲区被添加到套接字接收队列并相应地作为流数据读取tcp_recvmsg()

这里要记住的重要一点是,副本是性能方面最糟糕的事情。因此,内核将始终(除非绝对必要)避免复制并使用指针。