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

时间:2018-12-09 11:18:34

标签: networking tcp linux-kernel sliding-window

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

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

我对滑动窗口位于何处或与套接字缓冲区相同感到困惑

1 个答案:

答案 0 :(得分:1)

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

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

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