多连接windows系统的源IP地址选择策略

原文地址:http://blogs.technet.com/b/networking/archive/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer.aspx

下面只是其中翻译的一部分


当发送数据报的时候,计算机究竟选择哪个网卡适配器来使用通常是非常令人困惑的。本博客描述了在多连接计算机上,计算机为向外的连接选择网络适配器的过程,并且讨论了如何为本次连接选择本地源IP地址。

什么是源IP地址选择?

         源IP地址选择:指协议栈如何选择一个IP地址的过程。

         WindowsXP和Windows Server 2003是基于弱主机模式的。

         当Windowssocket程序绑定到一个socket的时候,通常会为向外的数据报指定(源)IP地址,该地址作为调用bind()函数的一个参数。大多数的程序并不了解网络的拓扑结构,所以更多情况是在他们的bind()函数调用中指定IPADDR_ANY而不是特定的IP地址。IPADDR_ANY告诉协议栈程序将由协议栈来选择最优的本地IP地址使用。

WindowsXP行为

KB175396 –多连接计算机的WindowsSocket连接

         WindowsVista之前的Windows操作系统的TCP/IP组件是基于弱主机模式。当程序开发者设计使用网络并且和微软产品兼容的程序时,这种模式给程序开发者最大的余地。因为开发者必须指定程序如何访问TCP/IP协议栈并响应进出的帧,这种模也就将控制网络程序行为的的责任抛给了开发者。

 

         在只有一个网络适配器的计算机上,选择的IP地址是计算机上网络适配器的主IP地址。然而,在多连接计算机上,协议栈必须首先做选择。协议栈不可能做出一个明智的选择直到它知道了连接的目标IP地址。

 

         当程序发送一个connect()调用到目的IP地址,或者发送send()调用来发送UDP报文,协议栈参考目的IP地址,之后检查IP路由表来选择发送数据包的最优网络适配器。当选择网络适配器之后,协议栈读取该网络适配器的主IP地址,并且使用该IP地址作为向外数据包的源IP地址。

 

         例如:

         调用中的源请求:IPADDR_ANY

         目标IP:192.168.1.5

         路由表:

网卡接口1-192.168.1.10/32

网卡接口1 - 192.168.1.11/32

网卡接口2- 10.0.0.10/32

网卡接口2 - 10.0.0.11/32

选择的源IP:192.168.1.10

选择的源网卡接口:网卡接口1

 

如果程序在bind()调用中指定了源IP地址,那么该IP地址就作为连接的socket的源IP地址。然而,依旧需要使用路由表基于目标地址来路由向外的IP数据包。该行为的直接结果就是,源IP地址或许和选择发送报文的网络适配器不相关,即源IP地址并不在选择的网络适配器上。

例如:

调用中的源请求:10.0.0.10

目标IP:192.168.1.5

路由表:

网卡接口1-192.168.1.10/32

网卡接口1 - 192.168.1.11/32

网卡接口2- 10.0.0.10/32

网卡接口2 - 10.0.0.11/32

选择的源IP:10.0.0.10

选择的源网卡接口:网卡接口1           注意:该接口不是源IP地址所在的网卡适配器接口。

总结

如果没有指定源IP,那么最匹配目标IP地址的路由中的适配器的主IP地址将被用来源IP来发送数据报,并且与主IP地址相关联的适配器作为源适配器。

如果指定了源IP,那么用来发送数据报的适配器将是最匹配目标IP地址的路由中的适配器,该适配器或许并不是源IP的相关联的适配器。

 

Windows Vista/Windows Server 2008行为

         WindowsVista和之后的Windows系统都是基于强主机模式的。在强主机模式下,主机只能使用发送数据报源IP地址对应的网络适配器接口,当然主IP地址的概念也就不复存在了。

        

         与XP类似,当程序没有指定源IP地址时,协议栈参考目标IP地址,之后查询整个IP路由表来选择发送数据报的最佳网络适配器。当网络适配器选择之后,协议栈采用RFC 3483中定义的地址选择程序来选择向外数据报的源IP地址。

        

         例如:

         调用中的源请求:IPADDR_ANY

         目标IP:192.168.1.5

         路由表:

网卡接口1 -192.168.1.10/32

网卡接口1 -192.168.1.11/32

网卡接口2- 10.0.0.10/32

网卡接口2 - 10.0.0.11/32

         选择的源IP:10.0.0.10

         选择的源网卡接口:网卡接口2           注意:该网卡接口是源IP所在的接口

         注:数据报将会发送到网卡接口2上的默认网关。


小注:

另外一篇写的比较的强弱主机模式对比的文章地址为:http://technet.microsoft.com/zh-cn/magazine/2007.09.cableguy.aspx  由于原文不让随便复制粘贴,我只好把地址贴到这里了,有需要了解学习的朋友可以去看下,里面有更详细的说明以及windows vista以及之后的系统配置强弱主机模式的命令行指令。

采用强主机模式,就可以在Windows下实现类linux系统的绑定网卡设备编程了,当然这也和linux下的基于源IP地址路由策略有的一比。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值