我想问问一些网络的方面的知识。但是这方面的一些细枝末角很难找到回答的。



比如一个http的应用层的数据包往外发送。

然后经过传输层。添加了源端口和目的端口。然后调用ip网络层的函数。

网络层添加源ip和目的地ip。这里有一个问题。比如如果电脑上面有多张网卡。有多个ip。这里的源ip又如何选择呢?还有目的地ip。这个可以是由上层的应用提供。这没有问题。

我记得这里ip层还有路由选择。由iptables 打上标签,还有ip rule 多张的路由表。每张表有许多的ip route 规则。


在这里也是我在一些细节方面有一些不敢肯定的事情。

比如刚刚上面的是我们的应用层的数据往外发送。对应的路线是从上层的协议到下层的协议。

在ip层的这里。根据目的地ip选择对应的链路层发送数据,链路层对应的调用网卡的驱动程序发送数据。

这里的目的地ip有两种。一种本网络段的情况,把目的地ip和子网掩码做与运算。源地址和子网掩码做与运算。然后比较这两个结果。如果是一样的话,说明该数据包是发往本网络段的数据包。所以调用链路层的代码的时候,把目的地ip传入。链路层可以根据目的地ip查询得到对应的mac地址。在链路层填写对应的源mac地址为本网卡的mac地址。目的地mac是刚刚查询arp表得到的mac地址。对于arp表如果查询不到的mac地址的情况,就发送arp请求得到mac地址。一般应该都能够得到吧?如果得不到的情况。该包应该会被丢弃吧????毕竟可能该设备已经离开了本网络段了。


是嘛?我说的对吗?我的问题在ip层这里发生了疑惑。对于一个数据包,发往本网络段的时候。如何选择对应的网卡的链路层呢?对于一个电脑有许多的网卡的时候,并且都可以上网的情况。我知道这可以通过查询路由表,路由表给出了对于指定的网络段应该走哪个网卡。即使找不到也有路由表有默认的网卡可以选择。


可是对于ip层的数据包如果是外部的网络段呢?这个根据目的地ip无论如何在本网段都不可能得到mac地址的啊?更不知道选择哪个网卡进行发送了。就算选择了网卡,可是mac地址又是填写多少呢?这是不是默认的网关ip的作用。说通俗一点,网关啥都不是,就是本网段的候选设备。在找不到目的地ip的mac地址的情况,就默认使用网关的ip进行arp表的查询,得到网关ip的mac地址。全部的数据都通过路由表指定的网卡发出数据(目的地的mac是网关的mac地址)。更明白一点就是。在根据目的地ip地址得到mac地址,如果不是本网段的数据包。根据目的地ip得不到mac地址,在数据链路层,目的地的mac地址统一填写候选的设备的mac地址。这样嘛?


可是这上面的部分是上层的应用数据往下层发送的情况。





还有下层数据网上层发送呢!

链路层得到数据包查看该目的地mac地址是不是和自己本机的mac地址是否相等。如果相等的话。就接收。否则就丢弃。默认的情况,至少应该可以修改代码达到不管什么数据包都可以接收的情况吧?

得到数据后,拆包,把数据传送到上一层的ip层。ip层得到数据包后,查看目的地ip。目的地的ip地址做子网掩码计算。判断目的地ip是否属于本网络段?可是我疑惑。对于多个网卡,多个不同的网络段,应该使用哪个来判断是否属于同一个网段呢?是不是在通过链路层的时候就已经默认选择了对应的网络段。因为每个网卡都有一个ip地址和子网掩码。更应该说判断数据包的目的地ip与本网卡的ip地址,是否同属于一个网段?


就算判断是同一个网络段。数据包是往上层应用发送,递交给传输层。还是进行转发呢?这是不是得看具体的路由表的规则啊?能不能有更详细的呢?如果是进行转发的话。估计又得看具体的路由表的规则,看是从哪个网卡出啊?



本人了解一些iptables  ,ip rule , ip route 的命令。但是在一个电脑有多个网卡,我想实现不通的上层的应用的目的地ip进行走一些特定的网卡的时候,我在实践过程中,发现,哪些笼统的网络知识很难解决我的需求。更别说。我的电脑还有wifi. 如果插上手机usb,还可以通过usb进行上网。等等各种情况,如果我不了解清楚这些,我根本就很难实现我的需求。