我一直在努力寻找 TCP/IP 中使用的缓冲区作为 Linux 中数据包传输的一部分。我读得越多,我就越困惑。下面给出的是我的问题。有人可以帮我弄清楚吗?
1)驱动程序队列被实现为一个环形缓冲区,其描述符指向skbs,与TCP的接收和发送缓冲区相同吗?如果不是,TCP 的接收/发送缓冲区何时出现在数据包传输中?
2)TCP连接积压队列与接受/接收队列完全不同吗?积压队列适合数据包传输的哪个位置?我了解积压队列用于待处理的连接。
3)每个套接字是否有一个单独的缓冲区用于从TCP接受/发送缓冲区传输数据?
4)对于传入连接来说,正确的流程是? NIC -> 内核环缓冲区(skb) -> IP 堆栈 -> TCP 接受/接收缓冲区 -> Qdisc 层 -> 用于连接的套接字缓冲区。
答案1
一般来说,网络驱动程序有自己的队列,在 Linux 中,数据包被存储并在 sk_buff 上排队。就内核数据包处理而言,这是最重要的结构。该缓冲区(sk_buff)包含指向当前 TCP、IPv4/IPv6 等标头的指针。
TCP 积压由 struct sock 处理,用于处理 TCP 状态和缓冲将重新组装的数据包。
一般来说,我会说最重要的结构是 sk_buf 和 sock。除了内核源代码之外,查看此链接也可能对您有所帮助。
https://ops.tips/blog/how-linux-tcp-introspection/
http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
希望能帮助到你