Linux kernel 从struct sock获取对网络接口的引用

Linux kernel 从struct sock获取对网络接口的引用,linux-kernel,kernel,Linux Kernel,Kernel,我正在跟踪每个进程的网络活动。为此,我在struct sock中添加了一些字段,以便在创建套接字时跟踪PID。这将允许我在数据最终发送/接收时更新任务结构。但是,我很难确定正在使用哪个网络接口 我看到struct sk_buff有一个引用网络接口的字段struct net_device*dev,但我不知道如何从struct sock引用它 假设struct sock绑定到接口是否有意义?如果是这样,是否有一种简单的方法来引用正在使用的网络接口?物理接口是动态确定的(某种程度上)。套接字(为了简单

我正在跟踪每个进程的网络活动。为此,我在
struct sock
中添加了一些字段,以便在创建套接字时跟踪PID。这将允许我在数据最终发送/接收时更新任务结构。但是,我很难确定正在使用哪个网络接口

我看到
struct sk_buff
有一个引用网络接口的字段
struct net_device*dev
,但我不知道如何从
struct sock
引用它


假设
struct sock
绑定到接口是否有意义?如果是这样,是否有一种简单的方法来引用正在使用的网络接口?

物理接口是动态确定的(某种程度上)。套接字(为了简单起见,假设TCP会话)只是表示本地[IP,端口]和远程[IP,端口]之间的连接。因此,向远程发送数据需要执行路由操作。这是通过查找内核路由表并确定下一跳的直接计算机(例如,如果RemoteIP位于本地子网中)或查找作为下一跳的回退(“默认网关”)来完成的。从逻辑上讲,这个操作是在一个包一个包的基础上完成的,尽管有一个缓存机制来防止它真正被一个包一个包地完成

但是可以想象的是,当连接正在进行时,所使用的路由/接口可能会发生变化。例如,您可能已经使用一个接口(由于默认网关设置),而管理员可以更改默认网关以指向另一个IP地址,这可能会导致发送到远程的数据包被定向到另一个接口


查看
ip\u queue\u xmit
以查看此操作。因此,是的,有一个通过
sock->sk_dst_缓存
绑定到物理接口,它提供了一个
struct dst_条目
,其中包含
struct net_设备
。但是可以想象,在发送下一个数据包之前,条目可能会失效。

这很有趣。我的理解是TCP是面向连接的——这意味着一旦建立了连接,源IP和目标IP就固定了,您无法更改它。如果接口不是固定的,那么服务器不会拒绝来自不同源IP的数据包吗?我想我需要回顾一下我的网络基础知识:|谁说源IP会改变?路由(通过网络的路径)可以在端点不改变的情况下改变。通常情况下,如果更改接口,源IP将改变。源IP不会改变的唯一情况是,它们连接到同一路由器/NAT。如果源IP发生变化,则连接将终止。这是使用类似MPTCP的东西的一个主要优点。是的,这是正常的。这就是为什么我使用“可想象”这个词,而不是“普通”这样的不同术语。但是,如果接口发生变化,则源IP(即本地侧IP)不必发生变化。例如,我可以在系统上为同一网络提供一个新接口,使用一个新网关(甚至相同的网关)。它应该能够继续操作现有会话。此外,没有什么可以阻止非对称路由配置(出站在B上,入站仍然在A上[我的初始IP地址在A上])。