当前位置: 首页 > Linux

是主机的IP地址还是网卡的IP地址?

时间:2023-04-06 02:50:17 Linux

我上大学的时候,宿舍里的每个人都买了一台电脑。为了节省网费,全宿舍从二手市场买了一台TP-LINK路由器。这样大家的电脑就通过路由器连接到学校网管中心,再连接到外网。从路由器的后台界面我们可以看到,路由器为每一台电脑都分配了一个IP地址。看来IP属于主机。进入工作场所后,公司的电脑配备了两块物理网卡,通过两根网线连接到两个网络(10.X.X.X/8和192.X.X.X/24)。从适配器管理界面可以看到,两块网卡有自己的IP地址。IP地址似乎属于网卡。那么,哪种说法是正确的呢?先得出结论:IP地址是属于主机的,即使我们在网卡上配置了IP地址。IP地址和网络接口在Linux中,我们可以通过ifconfig-a或者ipaddr看到主机上的所有网络接口,它有两个来源,一个是物理网卡的驱动创建的,一个是内核本身或者用户主动创建的虚拟界面。举个栗子:ipaddr命令一共输出4项,其中ens33是物理网卡驱动创建的,lo是内核启动时自己创建的loopback网络接口,veth0和veth1是vethpeervirtual我们自己创建的网络接口。我们可以将每个网络接口视为一个管道,一端连接到本机内核路由子系统,另一端因类型而异。物理网卡对应的网络接口的另一端引出设备驱动程序;vethpeer类型接口的另一端通向另一端;tun型设备的另一端引出用户应用程序。另外,从上面的输出也可以看出,网络接口不一定有IP地址(本文所说的IP地址指的是IPv4地址),比如veth0和veth1后面就没有IP地址.IP地址是网络层的概念,而网卡其实更多是链路层的概念。一个IP报文的接收处理流程简化版如下:routes根据路由转发ENDEND这个过程中,网卡只参与链路层报头的检查。只要数据包通过检查,就会被送到网络层进行路由。至于数据包之后去了哪里,它不会关心。消息的去向完全取决于路由!一般来说,只有两条路线。如果匹配到本地路由,则表示消息是给你的。然后根据报文的协议字段,发送给相应的协议(如TCPUDPICMP)进行处理;如果匹配到使用了其他路由,则表示该消息只使用本机作为中转站,因此会根据路由结果找到消息的出网接口,从另一端发送出去网络接口(管道)。那么问题来了,这些路由是从哪里来的呢?答案是:当你为网络接口配置IP地址时,内核会生成相应的主机路由、网段路由、广播路由!还是上面那个栗子,我们给veth0配置IP地址。在MAIN表中,我们可以看到新增的网段路由。在LOCAL表中,我们可以看到新增的主机路由和广播路由。下面我们来做个实验,从PC2ping刚刚给veth0配置IP(我们需要先在PC2上配置1.2.3.4的静态路由,让它知道这个地址其实是在局域网内的主机上,不会通过默认网关)执行ping,可以ping通!我们在PC1上的网卡上抓包的结果如下:这是普通局域网中的ping交互过程:PC2先通过ARP获取到1.2.3.4对应的MAC地址,然后是普通的ICMP请求和ICMP回复。有点意思的是,PC2得到的是1.2.3.4的00:0c:29:d6:56:46,不是veth0的MAC地址,而是ens33的MAC地址。这说明上面的交互过程根本没有涉及到veth0!如果你用tcpdump在veth0上抓包,你是得不到任何结果的!这样做的原因是,当Linux收到ARP请求时,默认行为是只要ARP请求报文的目的IP地址与本地路由匹配,它就会回复收到ARP的网络接口的MAC地址请求消息。只有主机路由,没有IP地址。即如果veth0没有配置IP,只配置主机路由呢?在上面的操作中,我们删除了之前为veth0配置的IP地址,而是主动配置了一条本地路由。还是在PC2上ping1.2.3.4,能ping通!结论我们在网络接口上配置IP地址的本质是配置路由。毕竟,IP地址仍然属于主机,而不属于网络接口。