标题虽然是为了解释有了 IP 地址,为何还要用 MAC 地址,可是本文的重点在于理解为何要有 IP 这样的东西。本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么。php
(本文同步发布于:http://www.52im.net/thread-2067-1-1.html)html
翟志军,我的博客地址:https://showme.codes/,Github:https://github.com/zacker330。感谢做者的原创分享。git
做者的另外一篇《即时通信安全篇(七):若是这样来理解HTTPS,一篇就够了》也写的很是好,有兴趣的读者能够深读之。程序员
本文是系列文章中的第9篇,本系列文章的大纲以下:github
《网络编程懒人入门(一):快速理解网络通讯协议(上篇)》编程
《网络编程懒人入门(二):快速理解网络通讯协议(下篇)》缓存
《网络编程懒人入门(四):快速理解TCP和UDP的差别》性能优化
《网络编程懒人入门(五):快速理解为何说UDP有时比TCP更有优点》服务器
《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》
《网络编程懒人入门(八):手把手教你写基于TCP的Socket长链接》
《网络编程懒人入门(九):通俗讲解,有了IP地址,为什么还要用MAC地址?》(本文)
本站的《脑残式网络编程入门》也适合入门学习,本系列大纲以下:
《脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》
《脑残式网络编程入门(二):咱们在读写Socket时,究竟在读写什么?》
若是您以为本系列文章过于基础,您可直接阅读《鲜为人知的网络编程》系列文章,该系列目录以下:
《鲜为人知的网络编程(一):浅析TCP协议中的疑难杂症(上篇)》
《鲜为人知的网络编程(二):浅析TCP协议中的疑难杂症(下篇)》
关于移动端网络特性及优化手段的总结性文章请见:
《现代移动端网络短链接的优化手段总结:请求速度、弱网适应、安全保障》
基本概念:
现在的网络是分层来实现的,就像是搭积木同样,先设计某个特定功能的模块,而后把模块拼起来组成整个网络。局域网也不例外,通常来讲,在组网上咱们使用的是IEEE802参考模型,从下至上分为:物理层、媒体接入控制层(MAC),逻辑链路控制层(LLC)。
标识网络中的一台计算机,通常至少有三种方法,最经常使用的是域名地址、IP地址和MAC地址,分别对应应用层、网络层、物理层。网络管理通常就是在网络层针对IP地址进行管理,但因为一台计算机的IP地址能够由用户自行设定,管理起来相对困难,MAC地址通常不可更改,因此把IP地址同MAC地址组合到一块儿管理就成为常见的管理方式。
什么是MAC地址?
MAC地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。MAC地址与网络无关,也即不管将带有这个地址的硬件(如网卡、集线器、路由器等)接入到网络的何处,都有相同的MAC地址,它由厂商写在网卡的BIOS里。MAC地址可采用6字节(48比特)或2字节(16比特)这两种中的任意一种。但随着局域网规模愈来愈大,通常都采用6字节的MAC地址。这个48比特都有其规定的意义,前24位是由生产网卡的厂商向IEEE申请的厂商地址,目前的价格是1000美圆买一个地址块,后24位由厂商自行分配,这样的分配使得世界上任意一个拥有48位MAC 地址的网卡都有惟一的标识。另外,2字节的MAC地址不用网卡厂商申请。
MAC地址一般表示为12个16进制数,每2个16进制数之间用冒号隔开,如:08:00:20:0A:8C:6D就是一个MAC地址,其中前6位16进制数08:00:20表明网络硬件制造商的编号,它由IEEE分配,然后6位16进制数0A:8C:6D表明该制造商所制造的某个网络产品(如网卡)的系列号。每一个网络制造商必须确保它所制造的每一个以太网设备都具备相同的前三字节以及不一样的后三个字节。这样就可保证世界上每一个以太网设备都具备惟一的MAC 地址。
什么是IP地址?
IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差别。
为何要用到MAC地址?
这是由组网方式决定的,现在比较流行的接入Internet的方式(也是将来发展的方向)是把主机经过局域网组织在一块儿,而后再经过交换机和 Internet相链接。这样一来就出现了如何区分具体用户,防止盗用的问题。因为IP只是逻辑上标识,任何人都随意修改,所以不能用来标识用户;而 MAC地址则否则,它是固化在网卡里面的。从理论上讲,除非盗来硬件(网卡),不然是没有办法冒名顶替的(注意:其实也能够盗用,后面将介绍)。
基于MAC地址的这种特色,局域网采用了用MAC地址来标识具体用户的方法。注意:具体实现:在交换机内部经过“表”的方式把MAC地址和IP地址一一对应,也就是所说的IP、MAC绑定。
具体的通讯方式:接收过程,当有发给本地局域网内一台主机的数据包时,交换机接收下来,而后把数据包中的IP地址按照“表”中的对应关系映射成MAC地址,转发到对应的MAC地址的主机上,这样一来,即便某台主机盗用了这个IP地址,但因为他没有这个MAC地址,所以也不会收到数据包。发送过程和接收过程相似,限于篇幅不叙述。
综上可知,只有IP而没有对应的MAC地址在这种局域网内是不能上网的,因而解决了IP盗用问题。
IP地址与MAC地址的区别是什么?
IP地址基于逻辑,比较灵活,不受硬件限制,也容易记忆。MAC地址在必定程度上与硬件一致,基于物理,可以标识具体。这两种地址各有好处,使用时也因条件而采起不一样的地址。
MAC地址涉及到的安全问题:
从上面的介绍能够知道,这种标识方式只是MAC地址基于的,若是有人可以更改MAC地址,就能够盗用IP免费上网了,目前网上针对小区宽带的盗用MAC地址免费上网方式就是基于此这种思路。若是想盗用别人的IP地址,除了IP地址还要知道对应的MAC地址。举个例子,得到局域网内某台主机的MAC地址,好比想获得局域网内名为TARGET主机的MAC地址,先用PING命令:PING TARGET,这样在咱们主机上面的ARP表的缓存中就会留下目标地址和MAC映射的记录,而后经过ARP A命令来查询ARP表,这样就获得了指定主机的MAC地址。最后用ARP -s IP 网卡MAC地址,命令把网关的IP地址和它的MAC地址映射起来就能够了。
若是要获得其它网段内的MAC地址,那么能够用工具软件来实现,我以为Windows优化大
师中自带的工具不错,点击“系统性能优化”→“系统安全优化”→“附加工具”→“集群Ping”,能够成批的扫出MAC地址并能够保存到文件。
小知识:ARP(Address Resolution Protocol)是地址解析协议,ARP是一种将IP地址转化成物理地址的协议。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP 具体说来就是将网络层(IP层,也就是至关于OSI的第三层)地址解析为数据链接层(MAC层,也就是至关于OSI的第二层)的MAC地址。ARP协议是经过IP地址来得到MAC地址的。
ARP原理:郴鰽要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后就会进行数据传输。若是未找到,则广播A一个 ARP请求报文(携带主机A的IP地址Ia——物理地址Pa),请求IP地址为Ib的主机B回答物理地址Pb。网上全部主机包括B都收到ARP请求,但只有主机B识别本身的IP地址,因而向A主机发回一个ARP响应报文。其中就包含有B的MAC地址,A接收到B的应答后,就会更新本地的ARP缓存。接着使用这个MAC地址发送数据(由网卡附加MAC地址)。所以,本地高速缓存的这个ARP表是本地网络流通的基础,并且这个缓存是动态的。ARP表:为了回忆通讯的速度,最近经常使用的MAC地址与IP的转换不用依靠交换机来进行,而是在本机上创建一个用来记录经常使用主机IP-MAC映射表,即ARP表。
看完上一节中各类书籍里对IP地址、MAC地址的理解介绍和说明,仍是很蒙逼,那么请继续看完本节吧。
一开始时,网络中的机器并很少。你们都连到同一个集线器就能够了,就能够实现互通。这时,机器 A 发消息到机器 B ,消息头里附上机器 B 的MAC,集线器收到消息后就广播给全部连到集线器的机器。
机器 C 收到消息,发现消息里的 MAC 地址和本身的不同,就丢弃。机器B发现消息里的 MAC 地址和本身同样,就收到下并解析。
这样机制带来问题很明显:首先每次广播,给所在网络带来没必要要的浪费。因此,就出现了交换机。它能识别消息里的目标 MAC 地址后,直接就消息丢到机器 B 所链接的端口中。另外一个角度,交换机必须记住全部的 MAC 地址和端口之间的关系。
这样的机制在网络规规模小的时候是高效的。可是当网络规模扩大到全球的时候,不可能让一台交换机记录下全球这么多的网络设备,也不可能让全球的机器链接到一台交换机上。
想像一下,你是斯坦福的学生,你的电脑 x 的网络直连的是学校的交换机,而学校的交换机又连美国国家网络交换机。而美国国家网络交换机又直接的是中国国家网络交换机,中国服务器 y 直连的是中国国家交换机。
你想访问中国的服务器 y 中的资源。你了解到服务器 y 的 MAC 地址是00:0C:29:01:00:12,因此你在消息里附上这个 MAC 地址。
学校交换机收到消息后,拿到 MAC 地址后就愣了,这是要发给谁啊?由于中国服务器 y 并非直连学校交换机的。这时,学校交换机有一个选择,就是收到不明的 MAC 地址时,一概转发给默认端口。斯坦福交换机就将消息转给美国国家交换机。
美国国家交换机一样发愣了,由于没有这条 MAC 地址对应的端口。它又直接向默认端口:中国国家网络交换机。
中国国家网络交换机收到消息,发现本身记录了 MAC 地址 对应的是服务器 y。就直接将你这位斯坦福学生的消息转发到服务器 y 所链接的端口。
最终,咱们的服务器 y 终于收到来自美国斯坦福学生的资源访问请求。
那么,咱们的服务器 y 如何将相应的资源返回给学生呢?将消息中的源MAC 地址做为响应消息的目标 MAC 地址发送给中国国家交换机不就能够了?一样的机制,只不过是把源地址和目标地址反一下。
这下,咱们是否是完美实现使用交换机组建美国网络和中国网络的互通?
可是美国和中国并不能表明全世界。其余国家也须要加入这个大网络。当日本国家交换机也接入美国国家交换机后,斯坦福学生的消息从学校到达美国国家交换机后就须要进行广播全部直连本身的端口了,由于这时,它没有对外的所谓默认端口了。这里有点烧脑,容各位同窗一点时间思考。
也就是说,当两个网络互接时,MAC 地址 + 交换机还能解决问题广播问题,可是两个以上的网络互连时,MAC 地址 + 交换机就没有办法解决广播问题了。
这时,咱们面临的问题就是没法使用现有的技术—— MAC 地址 + 交换机——解决多网络互连的问题了。因此,须要发明一种新的技术。
而 IP 协议就是就是解决此问题的一项技术。
事实上,IP协议的产生并不仅是为解决上述的“广播问题”。还解决了不少其余网络传输过程会遇到的问题,好比一次传输的消息过大时,如何对消息进行分组等问题。
好了,若是以上内容你仍是没有彻底理解,那么如下3篇文章你必须好好读读(再不懂的话,真没救了..):
《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》
因为历史缘由,MAC 地址及相关技术先出现,可是后来发现它并不能解决全部(已知)的问题,因此,先驱们发明了 IP 地址及相关技术来解决。
另外一个角度,我的认为,因为 MAC 地址没有办法表达网络中的子网的概念,而 IP 地址能够。若是网络互换设备(好比路由器)能从目标 MAC 地址中分析出目标网络,而不是只是目标主机,IP 地址还会出现吗?
有另外一个有趣的问题:若是历史反过来,一开始就使用的是 IP 地址,而不是 MAC 地址,咱们如今的网络世界会怎么样?
[1] 网络编程基础资料:
《技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)》
《通俗易懂-深刻理解TCP协议(下):RTT、滑动窗口、拥塞处理》
《理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程》
《P2P技术详解(一):NAT详解——详细原理、P2P简介》
《P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解》
《P2P技术详解(三):P2P技术之STUN、TURN、ICE详解》
《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》
《现代移动端网络短链接的优化手段总结:请求速度、弱网适应、安全保障》
《移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》
《移动端IM开发者必读(二):史上最全移动弱网络优化方法总结》
《从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路》
《以网游服务端的网络接入层设计为例,理解实时通讯的技术挑战》
>> 更多同类文章 ……
[2] NIO异步网络编程资料:
《Java新一代网络编程模型AIO原理及Linux系统AIO介绍》
《开源NIO框架八卦——究竟是先有MINA仍是先有Netty?》
《NIO框架入门(一):服务端基于Netty4的UDP双向通讯Demo演示》
《NIO框架入门(二):服务端基于MINA2的UDP双向通讯Demo演示》
《NIO框架入门(三):iOS与MINA二、Netty4的跨平台UDP双向通讯实战》
《NIO框架入门(四):Android与MINA二、Netty4的跨平台UDP双向通讯实战》
《Netty 4.x学习(二):Channel和Pipeline详解》
《Apache Mina框架高级篇(一):IoFilter详解》
《Apache Mina框架高级篇(二):IoHandler详解》
《Apache MINA2.0 开发指南(中文版)[附件下载]》
《实践总结:Netty3.x升级Netty4.x遇到的那些坑(线程篇)》
《实践总结:Netty3.x VS Netty4.x的线程模型》
《Twitter:如何使用Netty 4来减小JVM的GC开销(译文)》
《Netty干货分享:京东京麦的生产级TCP网关技术实践总结》
《新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析》
>> 更多同类文章 ……
(本文同步发布于:http://www.52im.net/thread-2067-1-1.html)