Kernel Buffer、TCP Socket Buffer和Sliding有什么区别Window
What are the differences between Kernel Buffer, TCP Socket Buffer and Sliding Window
这是我对 TCP/IP
中传入数据流的理解
- 内核从网络接口读取数据到它的缓冲区
- 内核将数据从其缓冲区复制到 TCP 套接字缓冲区,其中滑动 Window 起作用
- 被read()阻塞的程序唤醒并从套接字缓冲区复制数据。
有点迷惑滑动window在什么位置,还是和socket buffer一样
Linux 不将 TCP 的滑动 window 作为一个单独的缓冲区来处理,而是作为几个指示已经接收/读取了多少的索引。 Linux 内核数据包处理过程可以用多种方式描述,随着你的深入可以分成小部分,但大体流程如下:
- 内核准备通过网络接口接收数据,它准备SKB(套接字缓冲区)数据结构并将它们映射到接口Rx DMA缓冲区环。
- 当数据包到达时,它们会填充这些预先配置的缓冲区,并在数据包到达的中断上下文中通知内核。在这种情况下,缓冲区被移动到网络堆栈的 recv 队列中,以便在中断上下文中处理它们。
- 网络堆栈检索这些数据包并相应地处理它们,最终到达 TCP 层(如果它们确实是 TCP 数据包),后者又处理 window。
- 请参阅
struct tcp_sock
成员 u32 rcv_wnd
,然后在 tp->rcvq_space.space
中用作 window 中剩余的每个连接 space。
- 缓冲区被添加到套接字接收队列,并相应地作为流数据在
tcp_recvmsg()
中读取
这里要记住的重要一点是,副本是性能方面最糟糕的事情。因此,内核将始终(除非绝对必要)避免复制并改用指针。
这是我对 TCP/IP
中传入数据流的理解- 内核从网络接口读取数据到它的缓冲区
- 内核将数据从其缓冲区复制到 TCP 套接字缓冲区,其中滑动 Window 起作用
- 被read()阻塞的程序唤醒并从套接字缓冲区复制数据。
有点迷惑滑动window在什么位置,还是和socket buffer一样
Linux 不将 TCP 的滑动 window 作为一个单独的缓冲区来处理,而是作为几个指示已经接收/读取了多少的索引。 Linux 内核数据包处理过程可以用多种方式描述,随着你的深入可以分成小部分,但大体流程如下:
- 内核准备通过网络接口接收数据,它准备SKB(套接字缓冲区)数据结构并将它们映射到接口Rx DMA缓冲区环。
- 当数据包到达时,它们会填充这些预先配置的缓冲区,并在数据包到达的中断上下文中通知内核。在这种情况下,缓冲区被移动到网络堆栈的 recv 队列中,以便在中断上下文中处理它们。
- 网络堆栈检索这些数据包并相应地处理它们,最终到达 TCP 层(如果它们确实是 TCP 数据包),后者又处理 window。
- 请参阅
struct tcp_sock
成员u32 rcv_wnd
,然后在tp->rcvq_space.space
中用作 window 中剩余的每个连接 space。 - 缓冲区被添加到套接字接收队列,并相应地作为流数据在
tcp_recvmsg()
中读取
这里要记住的重要一点是,副本是性能方面最糟糕的事情。因此,内核将始终(除非绝对必要)避免复制并改用指针。