相同IP和Mac地址的问题
其实是可以的,你完全可以把两台电脑的IP 和MAC改成一样,不但可以上网而且还没IP冲突。这种方法不但可以突破路由封锁用在ADSL共享上网,而且还可以用在IEEE802.1X认证上网的环 境中,但是前提必须要用相同的帐号来拨号上网(前提认证服务器没设验证帐号的重复性),我的机子是通过学校校园网接入internet的,客户端采用 802.1x认证客户端软件“STAR Supplicant拨号软件”来拨号上网,在我们学校里可以将两台机子的IP和MAC改成一样然后用相同的一个帐号来达到共享上网的目的,不过在我们学 校只可以在同一个宿舍的两台机子才可以共享上网,因为我们学校的服务器不单止验证帐号,ip,MAC而且还验证接入服务器IP(NAS IP),和接入服务器端口(NAS port),不同的宿舍接在学校交换机不同的端口,所以只限于同一个宿舍用这种法共享上网。
至于为什么不会引起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一样到底会不会导致不能上网:
既然可以,那么网络上的硬件设备是怎样区份这些数据到底是哪台机的呢??大家都知道局域网内是用硬件地址来通迅的,局域网的二层设备(如交换机)维护着一 张地址表,地址表记录着本设备每个端口所对应的MAC(注:不是端口的MAC,而是端口所连设备的MAC),设备要经过地址学习状态才能知道这些端口所对 应的MAC,当一个帧经过设备的某介端口时,设备会检查该帧源地址和目的地址,然后再对照自己的地址表,看地址表中是否存在该源地址的对应项,若不存在则 端口会变为“地址学习状态”,将该地址保存在地址表中组成一个新的表项,如果PCA和PCB都连在同一个交换机上,则交换机经过“地址学习状态”后,地址 表中存在两个相同的地址项,不过它们所对应的端口是不同的,当交换机在外部接收到一个目的地址为该地址(PCA和PCB相同的MAC地址)的帧时,则会检 查地址表,检查地址表后会发现存在两个相同地址的表项,于是交换机会将该帧转发到这两个表项所对应的端口,(至于交换机是用组播的方式还是说用一个帧发两 遍的方式转发给这两个端口我就不太清楚了,若你道就告诉我一下,好吗QQ63405627)。
路由器也一样,不同是的路由器的地址表是路由表,存放的是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以外的其它数据包,因为这些数据在应用层前已经被丢弃。