同一局域网下相同IP和Mac地址


起因

昨天,想起来自己还有一台不用笔记本,由于自己台式机上的H310C的板子,SATA接口只有三个,而自己手上还有2块1T的机械黑盘,想着废物再利用,而且台式机装的东西太多,三个固态都塞满了。就想着先用笔记本做个NAS,先用着,等咸鱼上买的东西到了就直接整个6盘的NAS。随后把笔记本接入家里的路由器,因为笔记本所有的盘都是共享的,我就网络访问了一下,然后就直接就转入到我台式机User文件夹里面去了,简直离谱。然后我Ipconfig看了一下,卧槽,两台PC机的IP地址一毛一样,而且他还不给我报IP地址冲突!我淦!这可就触及到了我的知识盲区,然后就开始了下面的探讨路程!附图!

然后我就在想DHCP协议也不可能分配两个一毛一样的IP给两台PC啊,难道是那个地方出问题了?

DHCP协议及其工作方式

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。

DHCP报文种类

DHCP一共有8中报文,各种类型报文的基本功能如下:

  1. Discover(0x01):DHCP客户端在请求IP地址时并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送Discover请求报文,以发现网络中的DHCP服务器。所有收到Discover报文的DHCP服务器都会发送应答报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
  2. Offer(0x02):DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给DHCP客户端,告知用户本服务器可以为其提供IP地址。但这个报文只是告诉DHCP客户端可以提供IP地址,最终还需要客户端通过ARP来检测该IP地址是否重复。
  3. Request(0x03):DHCP客户端可能会收到很多Offer请求报文,所以必须在这些应答中选择一个。通常是选择第一个Offer应答报文的服务器作为自己的目标服务器,并向该服务器发送一个广播的Request请求报文,通告选择的服务器,希望获得所分配的IP地址。另外,DHCP客户端在成功获取IP地址后,在地址使用租期达到50%时,会向DHCP服务器发送单播Request请求报文请求续延租约,如果没有收到ACK报文,在租期达到87.5%时,会再次发送广播的Request请求报文以请求续延租约。
  4. ACK(0x05):DHCP服务器收到Request请求报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK应答报文,通知用户可以使用分配的IP地址。
  5. NAK(0x06):如果DHCP服务器收到Request请求报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则向DHCP客户端发送NAK应答报文,通知用户无法分配合适的IP地址。
  6. Release(0x07):当DHCP客户端不再需要使用分配IP地址时(一般出现在客户端关机、下线等状况)就会主动向DHCP服务器发送RELEASE请求报文,告知服务器用户不再需要分配IP地址,请求DHCP服务器释放对应的IP地址。
  7. Decline(0x04):DHCP客户端收到DHCP服务器ACK应答报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则会向DHCP服务器发送Decline请求报文,通知服务器所分配的IP地址不可用,以期获得新的IP地址。
  8. Inform(0x08):DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则向DHCP服务器发送Inform请求报文;DHCP服务器在收到该报文后,将根据租约进行查找到相应的配置信息后,向DHCP客户端发送ACK应答报文。目前基本上不用了。

其实了解DHCP协议还是不够的,咱们再来看看ARP协议!

ARP协议

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。其作用是在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。 在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

ARP原理及流程

在任何时候,一台主机有IP数据报文发送给另一台主机,它都要知道接收方的逻辑(IP)地址。但是IP地址必须封装成帧才能通过物理网络。这就意味着发送方必须有接收方的物理(MAC)地址,因此需要完成逻辑地址到物理地址的映射。而ARP协议可以接收来自IP协议的逻辑地址,将其映射为相应的物理地址,然后把物理地址递交给数据链路层。

ARP请求

任何时候,当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个ARP请求报文,这个报文包好了发送方的MAC地址和IP地址以及接收方的IP地址。因为发送方不知道接收方的物理地址,所以这个查询分组会在网络层中进行广播。(见图1)

ARP响应

局域网中的每一台主机都会接受并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址,只有验证成功的主机才会返回一个ARP响应报文,这个响应报文包含接收方的IP地址和物理地址。这个报文利用收到的ARP请求报文中的请求方物理地址以单播的方式直接发送给ARP请求报文的请求方。(见图2)

问题也是某种限制的解决方案

至于为什么不会引起IP冲突而且还能上网,这是因为ARP工作的缺陷,系统之所以会发现网上有相的IP的而提示“IP冲突”,是因为系统在启动 时,TCP/IP中的ARP会广播一个免费ARP(free arp)请求包到网段上,这个ARP(free arp)包包含自己的IP和MAC,如果网段上有机子回应了这个包,这台发广播的机子就会认为局域网有别的机子使用和自己相同的IP。 例如我家的两台PC A和PC B的IP和MAC完全一样,PCA的系统启动时会广播一个包含自己IP和MAC的免费ARP(free arp)请求包到网段上,如果PCB回应了这个请求,PCA会认为自己的IP和网络上的IP有冲突并发出提示(这就是为什么IP冲突一般发生系统刚启动完 成时),问题是PCB根本不会回应这个请求包,这是因为这个请求包的IP和MAC和PCB自己的完全一样,而PCB会认为是自己发的包,所以不会回应,既然不会回应自然不会发生IP冲突了。

重点来了就是两台机子的IP和MAC一样到底会不会导致不能上网

这是我两台PC同时发起的ICMP包。

大家可以看到PC A有丢包现象!但是,问题不大!为什么呢?接着往下看。 既然可以上网,那么网络上的硬件设备是怎样区份这些数据到底是哪台机的呢??大家都知道局域网内是用硬件地址来通迅的,局域网的二层设备(如交换机)维护着一张地址表,地址表记录着本设备每个端口所对应的MAC(注:不是端口的MAC,而是端口所连设备的MAC),设备要经过地址学习状态才能知道这些端口所对应的MAC,当一个帧经过设备的某介端口时,设备会检查该帧源地址和目的地址,然后再对照自己的地址表,看地址表中是否存在该源地址的对应项,若不存在则 端口会变为“地址学习状态”,将该地址保存在地址表中组成一个新的表项,如果PCA和PCB都连在同一个交换机上,则交换机经过“地址学习状态”后,地址表中存在两个相同的地址项,不过它们所对应的端口是不同的,当交换机在外部接收到一个目的地址为该地址(PCA和PCB相同的MAC地址)的帧时,则会检查地址表,检查地址表后会发现存在两个相同地址的表项,于是交换机会将该帧转发到这两个表项所对应的端口,(至于交换机是用组播的方式还是说用一个帧发两遍的方式转发给这两个端口我就不太清楚了,若你知道就告诉我一下好吗?可以在留言板进行留言)。 路由器也一样,不同是的路由器的地址表是路由表,存放的是IP而不是硬件地址。 连接这两个端口的PCA和PCB都会收到同样的帧,既然会收到同样的帧,那么计算机怎样才知道哪些帧才是自己想要的呢?这取决于工作在TCP/ip上 层协议,虽然网卡是接收了这个帧,但是上层的协议进行进一步的分用,也可以说成是过滤,当TCP/IP的网络接口层(也叫链路层)收到一个帧,会检查帧头 中的帧类型,如果是ARP类型的就交给ARP协议去处理,如果是RARP类型就会交给RARP协议处理,如果是IP类型会去掉帧头并把这个帧传给上一层 (即网络层来处理),网络层会根据包头(去掉帧头就叫IP包了)中的协议类型来分用,如是TCMP类型就交给ICMP协议处理,如果是IGMP类型就交给 IGMP协议处理,如果是TCP或UDP就把包头去掉并交给上一层(即传输层)来片理 ,去掉IP包头后就叫做报文分段了(传输层的单位),同样传输层也会对报文分段的头部进行检查从而进行进一步的分用,如果是TCP类型的交给TCP协议处 理,如果是UDP类型就交给UDP协议处理,TCP或UDP会根据报文分段的头部中的“目的端口号”来交给应用层(交给应用层前会把报文分段的头部去 掉),然后应用层的用户进程会根据该“端口号”来决是否接收这个数据,例如QQ某个进程打开了UDP 1324这个端口,传输层的UDP协议会把所有接收到的且“目的端口号”为1324的报文分段交给QQ的这个进程, 这样就完成接收数据的整个过程。虽然两台电脑都会接收到不是属于自己的数据帧,但是在把帧交给上层协议片理时有可能会被丢充,就如应用层的QQ进程不会接 到除“目的端口号”为1324以外的其它数据包,因为这些数据在应用层前已经被丢弃。

这个问题可以用来做什么?

这种方法不但可以突破路由封锁用在ADSL共享上网,而且还可以用在IEEE802.1X认证上网的环境中,但是前提必须要用相同的帐号来拨号上网(前提认证服务器没设验证帐号的重复性),在某认证里可以将两台机子的IP和MAC改成一样然后用相同的一个帐号来达到共享上网的目的,但是大家要记住服务器不单止验证帐号,IP,MAC而且还验证接入服务器IP(NAS IP),和接入服务器端口(NAS port),不同的环境接在交换机不同的端口,所以只限于同一个用这种法共享上网。

回到正题

那么我为什么会出现这种问题?原因是在学校的时候,我把笔记本网卡的MAC地址改成了我台式机的MAC地址,由于笔记本长时间没有用过,然后自己搞忘记了,导致MAC地址和台式机一样,回家后,台式机先接入路由器,路由器经过学习之后,更新了路由表,把MAC地址记住了,然后我在接入笔记本的时候,由于MAC地址是一样的,所以给我分配了台式机的IP,导致两台PC的IP和MAC地址一模一样,且没有报IP地址冲突!因为路由器认为他是同一台机器。

温馨提示

以上仅限于技术参考,切勿做非法用途!!!

实训学习
其他
  • 作者:CoderX(联系作者)
  • 发表时间:2022-01-24 16:55
  • 版权声明:自由转载-非商用-非衍生-保持署名(null)
  • undefined
  • 评论