一台服务器两个网卡接入同一网段,会发生什么?

来自公众号:车小胖谈网络
一台服务器网卡A,B分别接入局域网A,B,都是192.168.1段,A网关是192.168.1.1,B网关是192.168.1.2,如果A里面192.168.1.100:5005是需要访问的服务,B里面192.168.1.100是台摄像头,我要访问100:5005的话会发生什么,另外,这么做会对两个局域网有什么影响吗,比如IP冲突之类。
192.168.1.100 访问192.168.1.100,报文会离开本机TCP/IP协议栈吗?
当然不会,因为主机以为自己与自己通信,既然自己与自己通信,为何要离开?
先来讲一个真实的经历,某大型船舶研究所,数字序列为7XX所。试用我司的网络监控设备,这个监控设备有两个物理接口,eth0/eth1。
  • Eth0接口为监控探针接口,用于捕获网络上的流量,然后保存在本地文件中。

  • Eth1接口为远程通信,用于将文件中的数据发到监控服务器上,用于进一步处理。

突然接到他们的电话说,你们的监控设备怎么那么慢啊,监控数据总是无法上传到监控服务器上?
客户是上帝,立马打飞的从上海赶到这个中部特大城市。心急火燎到那一看,乐了,你猜怎么着?
Eth0、Eth1两个接口被配置成在同一个网段。然后立马将其修改成两个网段,马上监控流量山崩地裂地涌向监控服务器。
他们的领导、技术工程师很好奇地问,why?
那时刚工作不久还不知道什么ECMP,但是却知道等价路由负载均衡。虽然知道基于session的,但是也不知道如何将某一个session的流量分配给某一个路由/接口。
告诉他们,本该通过ETH1接口传输的流量,可能由于负载均衡算法,分配给Eth0接口了,而Eth0接口只是一个监控端口,从eth0口流出的流量,永远无法到达监控服务器,因为两者没有物理连接。
如果eth0和监控服务器有网络相连,比如有个交换机连接,那通信会有问题嘛?
不会的。因为无论怎么负载均衡,要么eth0,要么eth1,从两个接口发出的流量都可以到达监控服务器。
后来,当在Cisco Router上做实验时,一旦尝试在两个不同的三层接口上配置同一个网段的IP地址,比如 192.168.1.x/24,配置命令总是无法成功执行,路由器会拒绝这样的配置。
如果读者没有看到开头的故事,你可能无法理解为何路由器有这样限制?
如果没有负载均衡,流量从ETH0进入,返程流量从ETH0流出。
如果可以配置的话,那么将会有两个ECMP路由的存在,那么本该 ETH0流出的流量,负载均衡之后的流量可能从ETH1流出。万一从ETH1流出的流量永远无法到达目的地(没有网络、没有物理连接),那么就会造成通信障碍。
所以作为路由器,会严格杜绝两个三层接口使用同一个网段的IP地址。这里你一定要搞懂什么是同一个网段。否则这篇文章看了也不会有任何收获。
写到这里,忘记提到了一个知识点。地球上的主机、路由器、交换机、防火墙,看似纷纷扰扰,其实归纳起来在网络层面就两种设备:
  • 主机(End System)
  • 路由器(Intermediate System)
括号里的英文注释是采用OSI的标准。
主机
一台设备不会为目的IP ≠自己接口IP作转发服务,那么这台设备就是主机。
作为主机工作的网络设备,多个接口可以位于同一个网段,但是不能使用相同的IP。比如,电脑上有一块网卡、有一个无线网卡,这两个网卡都可以从同一个DHCP服务器获取同一网段的IP,但是不能获得相同的IP。
路由器
一台设备为目的IP ≠自己接口IP作转发服务,那么这台设备就是路由器。
作为路由器工作的网络设备,每一个接口要使用不同的网段,更不能使用相同的IP
致亲爱的粉丝们,诚挚的说几句话。感谢一直以来的默默奉献与鼎立支持。对于读者来说,能够把文章完整阅读完,已经是最大支持。如果觉得有点用处转发给您的亲朋好友看,那也是莫大的荣幸。随手赞赏的读者,那是300年都难修来的缘分。在赞赏排行榜上,排名前十位的好友们累积几千元,让我心怀忐忑,文章没那么好,我也就随便写写,记录一点心得,不值得那么破费。如果作为对作者持续输出的鼓励,赞赏1元足矣。。。
为何不愿意认真写?
因为文字很快就整体被搬运到别人的答案里,成为别人的原创文字。这股剽窃之风好像与人类文明格格不入,但是却形影不离,就在你我身边。。。坦率地说,很多知识点藏着掖着读者应该并不意外。即使在会员群,也只是零散地分享知识点。咱们没有尊重知识产权的风气。。。但是对于会员,一定会将所有知识点输出完毕,保证你们每一位成为“有创意”、“小健”、“小凡”、“Sunshine”那样出类拔萃的人才!
李诞口头禅:人间不值得!尽管我很喜欢他,但是这句话不敢苟同。爱是人类最伟大的感情,爱使得这个世界精彩而幸福,如果世界没有爱,那么世界就会变得冷漠而可恶,那真的就“人间不值得”了!

文章的评论区一位读者这么说的:“一台电脑有一块无线网卡、一个有线网卡,连在同一个网络里,一点事没有,上网正常”。

他是对的,电脑允许两块网卡配置同一个网段地址,比如192.168.1.x/24。这两块网卡其实没有任何关联性。如果你把电脑看成一个流量的蓄水池,这两块网卡就是两个出口(outgoing traffic),或者两个进口(incoming traffic)。称它们为A口(wired)、B口(wireless)。

蓄水池是如何负载均衡的?

  • 流量全部从A口流出

  • 流量全部从B口流出

  • 流量一半从A口流出,剩下一半从B口流出

计算机操作系统,对于不同类型的接口,有自己的喜好。认为可靠性高的物理接口,有更高的优先级,在路由选路算法中占据优势。那么这种优先级用什么来衡量呢?

用Metric,Metric越小,说明优先级越高,路由算法里优先选择。大家来看一张路由表:

路由表的最后一栏,就是metric,最小的metric =35,最大的metric = 331。但是在这张路由表里metric没有多大意义。因为任何一个路由条目只有一个表项,比如:0.0.0.0/0,这是一条指向Internet的路由,就这一条路由,无论metric多少,只有这一种选择。

回到主题上来,A口与B口谁的优先级高呢?

A口的优先级高,通常有线口的丢包率、延迟性能都优于无线口,所以metric会更小,那么路由算法就会优选A口。流量会全部从A口进出。

可以手动将B口metric值修改得比A口小,让流量优先从B口进出?

当然是可以的。

可以将A、B口的metric 修改成一样的,让流量一半从A口出,一半从B口出?

当然也是可以的。这里要敲黑板了,这就是上篇文章里提到的ECMP(Equal Cost Multiple Path),这是一种统计学意义上的负载均衡。

什么是统计学意义上的负载均衡?

当有多条ECMP等价路由(Metric相等)时,是将流量平均分配到每一条链路(出口)上去吗?

并不是!为什么不这么做呢?

这样就把同一个session的流量平均分摊到多条链路,造成的潜在后果是,后发的报文先到,造成乱序。而乱序的后果挺严重,在报文的接收方眼里,乱序和丢包几乎没有差别。会触发发送方重传乱序的报文,一旦发送方开始重传,伴随的是流量降速,从而影响session的整体性能。

那么,如何保证同一个session的流量走同一条链路?

你在浏览器打开一个网站,浏览一副图片,这就是一个session。

一个session的四元组通常是一样的,这四元组分别是:

  • 源IP

  • 目的IP

  • 源端口

  • 目的端口

将一个session的四元组做为输入参数,运行一个Hash函数,得出的值是不是都是一样的?

Hash函数,和高中一年级学习到的函数并没有本质的差别。输入值相同,得出的输出值也会相同,这就是函数。

digest = hash(source ip, source port, destination ip,destination port)

假设现在有2条ECMP链路,用digest (digest为正整数)除以2,得到的余数只有两种可能:

  • 0

  • 1

将余数为0对应的digest所代表的session,流量分摊到A接口。

将余数为1对应的digest所代表的session,流量分摊到B接口。

假设现在有3条ECMP链路,用digest 除以3,得到的余数只有三种可能:

  • 0

  • 1

  • 2

将余数为0对应的digest所代表的session,流量分摊到A接口。

将余数为1对应的digest所代表的session,流量分摊到B接口。

将余数为2对应的digest所代表的session,流量分摊到C接口。

无论有多少条链路,采用以上算法依此类推,即可算出分摊到的物理链路。

--- EOF ---
(0)

相关推荐