linux生成的ip 包的原地址是怎么得来的?
比如一 linux 双网卡 ,一个网卡 ip 1.1.1.2 mask /24 ,一个 网卡 ip 2.2.2.2 mask /24 ,网关是 1.1.1.1
这时候我访问 5.5.5.5
实际netstat来看 是 1.1.1.2 在和 5.5.5.5 通信 没有问题,但问题是本地进程如何知道 生成的ip包的原地址使用1.1.1.2而不使用 2.2.2.2 ??
问题一:包的原地址的确定是本地进程自己来确定的还是交给内核来确定的??
本地进程只和内核交互作,确定原地址的工作由内核来进行?
问题二:无论是谁确定的,他根据什么呢?
目的地址不在本机地址段,所以选择和默认路由在同一段里的地址??
问题三:如果是这样那么这个过程是在路由之前还是路由之后呢?其实还是回到了第一个问题
问题四:由于我知道的根据linux的netfilter的介绍,封包处理流程是本地进程生成的包直接进入iproute2进行处理,iproute2实际上是先根据ip rule 选择一个表,然后根据表中的route 项来进行路由,那么这就可能出现多个表中的路由项都有到达5.5.5.5的项
比如表 main 的 default route 是1.1.1.1
而表 self 的 defalut route是 2.2.2.1
他们都有到达 5.5.5.5的可能
我做了个策略路由
ip rule from 1.1.1.2 to all table main ##原地址是1.1.1.2 的包走main表 也就是 1.1.1.1
ip rule from 2.2.2.2 to all table self ##原地址是2.2.2.2 的包走self表 也就是 2.2.2.1
这时候有两个默认路由那么如果按照问题三假设的判断方法就无法确定生成包的原地址了(虽然情况是用哪个源地址和5.5.5.5都通),这是我一个令我非常疑惑的问题,我相信linux网络方面的编程高手,和熟悉linux内核源码的朋友可能会觉得我这个问题很简单,甚至弱智,骂我弱智尽管骂但是一定告诉我怎么回事!谢谢大家了!不说我弱智我就更更更更谢谢你了:)
[ 本帖最后由 sbyond 于 2005-12-6 12:19 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
楼主 指的通信 是怎么样一个通信?
通信么,比如我 telnet 5.5.5.5 80
应用程序 一般填充 struct sockaddr_in数据结构 调用connect函数去连接 远程的主机。
至于你说的为什么用第一块网卡的IP不用第二块网卡的IP。 这个不是应用程序决定的。 是由内核决定的。
那么内核根据什么决定的呢?比如我说的那种情况??就好像我最后举的例子中,会不会出现每次内核挑选的原地址不同的情况呢?(能不能知道内核选择地址时的判断原理)
还有我想确定以下,内核决定这个原地址时是否在 route decision 之前??还是在route decision 之后?
因为如果做根据原地址的策略路由 那么这个 原地址必须 在route decision之前就确定下来,
从网络处理流程来看 local process 生成的 数据包 下一步直接交给 iproute2处理 然后是netfilter 的几个表,然后就从网卡出去了
搞不懂
[ 本帖最后由 miaoer 于 2005-12-6 15:44 编辑 ]
内核是根据路由来取的源地址
每个网卡有一个ip地址,如eth0、eth1等设定。每个网卡的ip可以用ifconfig命令或者在rc或者profile中设定
内核的决定是很简单的,根据目的地址查路由表,找到dst ip,以及关联的本地IP及接口,就over了……
然后就是arp表的查询或询问/应答,然后……